From: bg Date: Mon, 9 Feb 2009 00:15:01 +0000 (+0000) Subject: extended HFAL X-Git-Url: https://git.cryptolib.org/?a=commitdiff_plain;h=5fe96fa58fee8907778ba3388b65d779a1a47c97;p=avr-crypto-lib.git extended HFAL --- diff --git a/USAGE.hashfunctions b/USAGE.hashfunctions index e01738f..145cbc2 100644 --- a/USAGE.hashfunctions +++ b/USAGE.hashfunctions @@ -56,7 +56,7 @@ email: daniel.otte@rub.de This function initializes the context with algorithm specific values. 3.3. *_nexBlock function - The *nextBlock function is the core of each hash function. It updates the hash + The *_nextBlock function is the core of each hash function. It updates the hash state with a given message block. So this function uses a context pointer and a message pointer as parameters. The size of a message block is fixed for each hash function (mostly 512 bit). For the last block of a messages which may be diff --git a/hfal-basic.c b/hfal-basic.c index 3bd41e5..b0ec35c 100644 --- a/hfal-basic.c +++ b/hfal-basic.c @@ -39,11 +39,11 @@ void hfal_hash_nextBlock(hfgen_ctx_t* ctx, const void* block){ f(ctx->ctx, block); } -void hfal_hash_lastBlock(hfgen_ctx_t* ctx, const void* block, uint16_t size){ +void hfal_hash_lastBlock(hfgen_ctx_t* ctx, const void* block, uint16_t length_b){ hf_lastBlock_fpt f; hfdesc_t* x=ctx->desc_ptr; f =(hf_lastBlock_fpt)pgm_read_word(&(x->lastBlock)); - f(ctx->ctx, block, size); + f(ctx->ctx, block, length_b); } void hfal_hash_ctx2hash(void* dest, hfgen_ctx_t* ctx){ @@ -64,20 +64,38 @@ void hfal_hash_free(hfgen_ctx_t* ctx){ void hfal_hash_mem(const hfdesc_t* hash_descriptor, void* dest, const void* msg, uint32_t length_b){ void_fpt f; - uint16_t bs,bsb; - uint8_t ctx[pgm_read_word(&(hash_descriptor->ctxsize_B))]; - f=(void_fpt)pgm_read_word(&(hash_descriptor->init)); - ((hf_init_fpt)f)(ctx); - bs=pgm_read_word(&(hash_descriptor->blocksize_b)); - bsb=bs/8; - f=(void_fpt)pgm_read_word(&(hash_descriptor->nextBlock)); - while(length_b>=bs){ - ((hf_nextBlock_fpt)f)(ctx, msg); - length_b -= bs; - msg = (uint8_t*)msg + bsb; + f = (void_fpt)pgm_read_word(&(hash_descriptor->mem)); + if(f){ + ((hf_mem_fpt)f)(dest, msg, length_b); + }else{ + + uint16_t bs,bsb; + uint8_t ctx[pgm_read_word(&(hash_descriptor->ctxsize_B))]; + f=(void_fpt)pgm_read_word(&(hash_descriptor->init)); + ((hf_init_fpt)f)(ctx); + bs=pgm_read_word(&(hash_descriptor->blocksize_b)); + bsb=bs/8; + f=(void_fpt)pgm_read_word(&(hash_descriptor->nextBlock)); + while(length_b>=bs){ + ((hf_nextBlock_fpt)f)(ctx, msg); + length_b -= bs; + msg = (uint8_t*)msg + bsb; + } + f=(void_fpt)pgm_read_word(&(hash_descriptor->lastBlock)); + ((hf_lastBlock_fpt)f)(ctx, msg, length_b); + f=(void_fpt)pgm_read_word(&(hash_descriptor->ctx2hash)); + ((hf_ctx2hash_fpt)f)(dest, ctx); } - f=(void_fpt)pgm_read_word(&(hash_descriptor->lastBlock)); - ((hf_lastBlock_fpt)f)(ctx, msg, length_b); - f=(void_fpt)pgm_read_word(&(hash_descriptor->ctx2hash)); - ((hf_ctx2hash_fpt)f)(dest, ctx); } + +uint16_t hfal_hash_getBlocksize(const* hash_descriptor){ + uint16_t ret; + ret = pgm_read_word(&(hash_descriptor->blocksize_b)); + return ret; +} + +uint16_t hfal_hash_getHashsize(const* hash_descriptor){ + uint16_t ret; + ret = pgm_read_word(&(hash_descriptor->hashsize_b)); + return ret; +} diff --git a/hfal-basic.h b/hfal-basic.h index 08dbb31..b00e46b 100644 --- a/hfal-basic.h +++ b/hfal-basic.h @@ -25,9 +25,11 @@ uint8_t hfal_hash_init(const hfdesc_t* hash_descriptor, hfgen_ctx_t* ctx); void hfal_hash_nextBlock(hfgen_ctx_t* ctx, const void* block); -void hfal_hash_lastBlock(hfgen_ctx_t* ctx, const void* block, uint16_t size); +void hfal_hash_lastBlock(hfgen_ctx_t* ctx, const void* block, uint16_t length_b); void hfal_hash_ctx2hash(void* dest, hfgen_ctx_t* ctx); void hfal_hash_free(hfgen_ctx_t* ctx); void hfal_hash_mem(const hfdesc_t* hash_descriptor, void* dest, const void* msg, uint32_t length_b); +uint16_t hfal_hash_getBlocksize(const* hash_descriptor); +uint16_t hfal_hash_getHashsize(const* hash_descriptor); #endif /* HFAL_BASIC_H_ */ diff --git a/hfal_md5.c b/hfal_md5.c new file mode 100644 index 0000000..0ccee60 --- /dev/null +++ b/hfal_md5.c @@ -0,0 +1,49 @@ +/* hfal_md5.c */ +/* + This file is part of the AVR-Crypto-Lib. + Copyright (C) 2008 Daniel Otte (daniel.otte@rub.de) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +/** + * \file hfal_md5.c + * \email daniel.otte@rub.de + * \author Daniel Otte + * \date 2009-02-09 + * \license GPLv3 or later + * + */ + +#include +#include +#include "hashfunction_descriptor.h" +#include "md5.h" + +static const char md5_str[] PROGMEM = "MD5"; + +const hfdesc_t md5_desc PROGMEM = { + HFDESC_TYPE_HASHFUNCTION, + 0, + md5_str, + sizeof(md5_ctx_t), + 512, + 128, + (hf_init_fpt)md5_init, + (hf_nextBlock_fpt)md5_nextBlock, + (hf_lastBlock_fpt)md5_lastBlock, + (hf_ctx2hash_fpt)md5_ctx2hash, + (hf_free_fpt)NULL, + (hf_mem_fpt)md5 +}; + diff --git a/hfal_md5.h b/hfal_md5.h new file mode 100644 index 0000000..1c4d529 --- /dev/null +++ b/hfal_md5.h @@ -0,0 +1,36 @@ +/* hfal_md5.h */ +/* + This file is part of the AVR-Crypto-Lib. + Copyright (C) 2008 Daniel Otte (daniel.otte@rub.de) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +/** + * \file hfal_md5.h + * \email daniel.otte@rub.de + * \author Daniel Otte + * \date 2009-02-09 + * \license GPLv3 or later + * + */ + +#ifndef HFAL_MD5_H_ +#define HFAL_MD5_H_ + +#include +#include "hashfunction_descriptor.h" + +extern const hfdesc_t md5_desc; + +#endif /* HFAL_MD5_H_ */ diff --git a/hfal_sha1.c b/hfal_sha1.c new file mode 100644 index 0000000..04023e7 --- /dev/null +++ b/hfal_sha1.c @@ -0,0 +1,49 @@ +/* hfal_sha1.c */ +/* + This file is part of the AVR-Crypto-Lib. + Copyright (C) 2008 Daniel Otte (daniel.otte@rub.de) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +/** + * \file hfal_sha1.c + * \email daniel.otte@rub.de + * \author Daniel Otte + * \date 2009-02-04 + * \license GPLv3 or later + * + */ + +#include +#include +#include "hashfunction_descriptor.h" +#include "sha1.h" + +static const char sha1_str[] PROGMEM = "SHA-1"; + +const hfdesc_t sha1_desc PROGMEM = { + HFDESC_TYPE_HASHFUNCTION, + 0, + sha1_str, + sizeof(sha1_ctx_t), + 512, + 160, + (hf_init_fpt)sha1_init, + (hf_nextBlock_fpt)sha1_nextBlock, + (hf_lastBlock_fpt)sha1_lastBlock, + (hf_ctx2hash_fpt)sha1_ctx2hash, + (hf_free_fpt)NULL, + (hf_mem_fpt)sha1 +}; + diff --git a/hfal_sha1.h b/hfal_sha1.h new file mode 100644 index 0000000..d39e460 --- /dev/null +++ b/hfal_sha1.h @@ -0,0 +1,36 @@ +/* hfal_sha1.h */ +/* + This file is part of the AVR-Crypto-Lib. + Copyright (C) 2008 Daniel Otte (daniel.otte@rub.de) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +/** + * \file hfal_sha1.h + * \email daniel.otte@rub.de + * \author Daniel Otte + * \date 2009-02-04 + * \license GPLv3 or later + * + */ + +#ifndef HFAL_SHA1_H_ +#define HFAL_SHA1_H_ + +#include +#include "hashfunction_descriptor.h" + +extern const hfdesc_t sha1_desc; + +#endif /* HFAL_SHA1_H_ */ diff --git a/hfal_sha256.c b/hfal_sha256.c index b91705b..0ae65c4 100644 --- a/hfal_sha256.c +++ b/hfal_sha256.c @@ -44,6 +44,6 @@ const hfdesc_t sha256_desc PROGMEM = { (hf_lastBlock_fpt)sha256_lastBlock, (hf_ctx2hash_fpt)sha256_ctx2hash, (hf_free_fpt)NULL, - (hf_mem_fpt)NULL + (hf_mem_fpt)sha256 }; diff --git a/hfal_twister224.c b/hfal_twister224.c new file mode 100644 index 0000000..e533c40 --- /dev/null +++ b/hfal_twister224.c @@ -0,0 +1,49 @@ +/* hfal_twister224.c */ +/* + This file is part of the AVR-Crypto-Lib. + Copyright (C) 2008 Daniel Otte (daniel.otte@rub.de) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +/** + * \file hfal_twister224.c + * \email daniel.otte@rub.de + * \author Daniel Otte + * \date 2009-02-04 + * \license GPLv3 or later + * + */ + +#include +#include +#include "hashfunction_descriptor.h" +#include "twister-small.h" + +static const char twister224_str[] PROGMEM = "Twister-224"; + +const hfdesc_t twister224_desc PROGMEM = { + HFDESC_TYPE_HASHFUNCTION, + 0, + twister224_str, + sizeof(twister224_ctx_t), + 512, + 224, + (hf_init_fpt)twister224_init, + (hf_nextBlock_fpt)twister224_nextBlock, + (hf_lastBlock_fpt)twister224_lastBlock, + (hf_ctx2hash_fpt)twister224_ctx2hash, + (hf_free_fpt)NULL, + (hf_mem_fpt)twister224 +}; + diff --git a/hfal_twister224.h b/hfal_twister224.h new file mode 100644 index 0000000..87926e2 --- /dev/null +++ b/hfal_twister224.h @@ -0,0 +1,36 @@ +/* hfal_twister224.h */ +/* + This file is part of the AVR-Crypto-Lib. + Copyright (C) 2008 Daniel Otte (daniel.otte@rub.de) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +/** + * \file hfal_twister224.h + * \email daniel.otte@rub.de + * \author Daniel Otte + * \date 2009-02-09 + * \license GPLv3 or later + * + */ + +#ifndef HFAL_TWISTER224_H_ +#define HFAL_TWISTER224_H_ + +#include +#include "hashfunction_descriptor.h" + +extern const hfdesc_t twister224_desc; + +#endif /* HFAL_TWISTER224_H_ */ diff --git a/hfal_twister256.c b/hfal_twister256.c new file mode 100644 index 0000000..0507be3 --- /dev/null +++ b/hfal_twister256.c @@ -0,0 +1,49 @@ +/* hfal_twister256.c */ +/* + This file is part of the AVR-Crypto-Lib. + Copyright (C) 2008 Daniel Otte (daniel.otte@rub.de) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +/** + * \file hfal_twister256.c + * \email daniel.otte@rub.de + * \author Daniel Otte + * \date 2009-02-09 + * \license GPLv3 or later + * + */ + +#include +#include +#include "hashfunction_descriptor.h" +#include "twister-small.h" + +static const char twister256_str[] PROGMEM = "Twister-256"; + +const hfdesc_t twister256_desc PROGMEM = { + HFDESC_TYPE_HASHFUNCTION, + 0, + twister256_str, + sizeof(twister256_ctx_t), + 512, + 256, + (hf_init_fpt)twister256_init, + (hf_nextBlock_fpt)twister256_nextBlock, + (hf_lastBlock_fpt)twister256_lastBlock, + (hf_ctx2hash_fpt)twister256_ctx2hash, + (hf_free_fpt)NULL, + (hf_mem_fpt)twister256 +}; + diff --git a/hfal_twister256.h b/hfal_twister256.h new file mode 100644 index 0000000..3c01faa --- /dev/null +++ b/hfal_twister256.h @@ -0,0 +1,36 @@ +/* hfal_twister256.h */ +/* + This file is part of the AVR-Crypto-Lib. + Copyright (C) 2008 Daniel Otte (daniel.otte@rub.de) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +/** + * \file hfal_twister256.h + * \email daniel.otte@rub.de + * \author Daniel Otte + * \date 2009-02-09 + * \license GPLv3 or later + * + */ + +#ifndef HFAL_TWISTER256_H_ +#define HFAL_TWISTER256_H_ + +#include +#include "hashfunction_descriptor.h" + +extern const hfdesc_t twister256_desc; + +#endif /* HFAL_TWISTER256_H_ */ diff --git a/hfal_twister384.c b/hfal_twister384.c new file mode 100644 index 0000000..e850ac8 --- /dev/null +++ b/hfal_twister384.c @@ -0,0 +1,49 @@ +/* hfal_twister384.c */ +/* + This file is part of the AVR-Crypto-Lib. + Copyright (C) 2008 Daniel Otte (daniel.otte@rub.de) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +/** + * \file hfal_twister384.c + * \email daniel.otte@rub.de + * \author Daniel Otte + * \date 2009-02-09 + * \license GPLv3 or later + * + */ + +#include +#include +#include "hashfunction_descriptor.h" +#include "twister384.h" + +static const char twister384_str[] PROGMEM = "Twister-384"; + +const hfdesc_t twister384_desc PROGMEM = { + HFDESC_TYPE_HASHFUNCTION, + 0, + twister384_str, + sizeof(twister384_ctx_t), + 512, + 384, + (hf_init_fpt)twister384_init, + (hf_nextBlock_fpt)twister384_nextBlock, + (hf_lastBlock_fpt)twister384_lastBlock, + (hf_ctx2hash_fpt)twister384_ctx2hash, + (hf_free_fpt)NULL, + (hf_mem_fpt)twister384 +}; + diff --git a/hfal_twister384.h b/hfal_twister384.h new file mode 100644 index 0000000..93c42cf --- /dev/null +++ b/hfal_twister384.h @@ -0,0 +1,36 @@ +/* hfal_twister384.h */ +/* + This file is part of the AVR-Crypto-Lib. + Copyright (C) 2008 Daniel Otte (daniel.otte@rub.de) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +/** + * \file hfal_twister384.h + * \email daniel.otte@rub.de + * \author Daniel Otte + * \date 2009-02-09 + * \license GPLv3 or later + * + */ + +#ifndef HFAL_TWISTER384_H_ +#define HFAL_TWISTER384_H_ + +#include +#include "hashfunction_descriptor.h" + +extern const hfdesc_t twister384_desc; + +#endif /* HFAL_TWISTER384_H_ */ diff --git a/hfal_twister512.c b/hfal_twister512.c new file mode 100644 index 0000000..f672344 --- /dev/null +++ b/hfal_twister512.c @@ -0,0 +1,49 @@ +/* hfal_twister512.c */ +/* + This file is part of the AVR-Crypto-Lib. + Copyright (C) 2008 Daniel Otte (daniel.otte@rub.de) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +/** + * \file hfal_twister512.c + * \email daniel.otte@rub.de + * \author Daniel Otte + * \date 2009-02-09 + * \license GPLv3 or later + * + */ + +#include +#include +#include "hashfunction_descriptor.h" +#include "twister-big.h" + +static const char twister512_str[] PROGMEM = "Twister-512"; + +const hfdesc_t twister512_desc PROGMEM = { + HFDESC_TYPE_HASHFUNCTION, + 0, + twister512_str, + sizeof(twister512_ctx_t), + 512, + 512, + (hf_init_fpt)twister512_init, + (hf_nextBlock_fpt)twister512_nextBlock, + (hf_lastBlock_fpt)twister512_lastBlock, + (hf_ctx2hash_fpt)twister512_ctx2hash, + (hf_free_fpt)NULL, + (hf_mem_fpt)twister512 +}; + diff --git a/hfal_twister512.h b/hfal_twister512.h new file mode 100644 index 0000000..937c3d8 --- /dev/null +++ b/hfal_twister512.h @@ -0,0 +1,36 @@ +/* hfal_twister512.h */ +/* + This file is part of the AVR-Crypto-Lib. + Copyright (C) 2008 Daniel Otte (daniel.otte@rub.de) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +/** + * \file hfal_twister512.h + * \email daniel.otte@rub.de + * \author Daniel Otte + * \date 2009-02-09 + * \license GPLv3 or later + * + */ + +#ifndef HFAL_TWISTER512_H_ +#define HFAL_TWISTER512_H_ + +#include +#include "hashfunction_descriptor.h" + +extern const hfdesc_t twister512_desc; + +#endif /* HFAL_TWISTER512_H_ */ diff --git a/sha1-asm.S b/sha1-asm.S index 5d6dd31..74d7c11 100644 --- a/sha1-asm.S +++ b/sha1-asm.S @@ -659,7 +659,7 @@ sha1_nextBlock_mainloop_core: /* ther core function; T=ROTL5(a) ....*/ adc T4, tmp1 /* T = ROTL(a,5) + e + kt + w[s] */ - /* wo Z-4 gerade auf kt zeigt ... */ + /* Z-4 is just pointing to kt ... */ movw r28, r26 /* copy X in Y */ adiw r30, 3*4 /* now Z points to the rigth locatin in our jump-vector-table */ lsr r31 @@ -887,7 +887,6 @@ sha1_init_vloop: dec r22 brne sha1_init_vloop ldi r22, 8 - clr r1 /* this should not be needed */ sha1_init_lloop: st X+, r1 dec r22 @@ -900,96 +899,4 @@ sha1_init_vector: .int 0x98badcfe; .int 0x10325476; .int 0xc3d2e1f0; -/* -;########################################################### -.global rotl32 -; === ROTL32 === -; function that rotates a 32 bit word to the left -; param1: the 32-bit word to rotate -; given in r25,r24,r23,r22 (r25 is most significant) -; param2: an 8-bit value telling how often to rotate -; given in r20 -; modifys: r21, r22 -rotl32: - cpi r20, 8 - brlo bitrotl - mov r21, r25 - mov r25, r24 - mov r24, r23 - mov r23, r22 - mov r22, r21 - subi r20, 8 - rjmp rotr32 -bitrotl: - clr r21 - clc -bitrotl_loop: - tst r20 - breq fixrotl - rol r22 - rol r23 - rol r24 - rol r25 - rol r21 - dec r20 - rjmp bitrotl_loop -fixrotl: - or r22, r21 - ret - - -;########################################################### - -.global rotr32 -; === ROTR32 === -; function that rotates a 32 bit word to the right -; param1: the 32-bit word to rotate -; given in r25,r24,r23,22 (r25 is most significant) -; param2: an 8-bit value telling how often to rotate -; given in r20 -; modifys: r21, r22 -rotr32: - cpi r20, 8 - brlo bitrotr - mov r21, r22 - mov r22, r23 - mov r23, r24 - mov r24, r25 - mov r25, r21 - subi r20, 8 - rjmp rotr32 -bitrotr: - clr r21 - clc -bitrotr_loop: - tst r20 - breq fixrotr - ror r25 - ror r24 - ror r23 - ror r22 - ror r21 - dec r20 - rjmp bitrotr_loop -fixrotr: - or r25, r21 - ret - - -;########################################################### - -.global change_endian32 -; === change_endian32 === -; function that changes the endianess of a 32-bit word -; param1: the 32-bit word -; given in r25,r24,r23,22 (r25 is most significant) -; modifys: r21, r22 -change_endian32: - movw r20, r22 ; (r22,r23) --> (r20,r21) - mov r22, r25 - mov r23, r24 - mov r24, r21 - mov r25, r20 - ret -*/ diff --git a/test_src/cli.c b/test_src/cli.c index b9659fe..12f4a0a 100644 --- a/test_src/cli.c +++ b/test_src/cli.c @@ -39,18 +39,32 @@ cli_rx_fpt cli_rx = NULL; cli_tx_fpt cli_tx = NULL; uint8_t cli_echo=1; +/** + * \brief output a character to the console + * + */ + void cli_putc(char c){ if(cli_tx) cli_tx(c); } +/** + * \brief get a character from the console + * Gets a character from the console input and blocks + * until a character is recieved + */ uint16_t cli_getc(void){ if(cli_rx) return cli_rx(); return ((uint16_t)-1); } - +/** + * \brief get a character from the console + * Gets a char from the console input (like cli_getc()) + * and echos it back to the console if echo is enabled. + */ uint16_t cli_getc_cecho(void){ char c; if(cli_rx){ @@ -62,6 +76,9 @@ uint16_t cli_getc_cecho(void){ return ((uint16_t)-1); } +/** + * \brief ouputs a zero-terminated string from ram to the console + */ void cli_putstr(char* s){ if(!cli_tx) return; @@ -69,6 +86,10 @@ void cli_putstr(char* s){ cli_tx(*s++); } + +/** + * \brief ouputs a zero-terminated string from flash to the console + */ void cli_putstr_P(PGM_P s){ char c; if(!cli_tx) @@ -81,6 +102,13 @@ void cli_putstr_P(PGM_P s){ } } +/** + * \brief reads a line or max n characters from the console + * Writes characters from the console into the supplyed buffer until a '\r' + * character is recieved or until n character a read (whatever happens first). + * The string will always be terminated by a '\0' character, so the buffer + * should have at least a size of n+1. + */ uint8_t cli_getsn(char* s, uint16_t n){ char c; if(n==0) @@ -92,6 +120,11 @@ uint8_t cli_getsn(char* s, uint16_t n){ return (c=='\r')?0:1; } +/** + * \brief dumps the contents of a buffer to the console + * Dumps length bytes from data to the console ouput. The dump + * will have 2*n continous hexadecimal characters. + */ void cli_hexdump(void* data, uint16_t length){ char hex_tab[] = {'0', '1', '2', '3', '4', '5', '6', '7', @@ -106,6 +139,11 @@ void cli_hexdump(void* data, uint16_t length){ } } +/** + * \brief dumps the contents of a buffer to the console + * Like cli_hexdump but bytes are seperated with a single space + * on the console output. + */ void cli_hexdump2(void* data, uint16_t length){ char hex_tab[] = {'0', '1', '2', '3', '4', '5', '6', '7', @@ -121,6 +159,7 @@ void cli_hexdump2(void* data, uint16_t length){ } } + static void cli_auto_help(uint16_t maxcmdlength, PGM_VOID_P cmdlist){ cmdlist_entry_t item; diff --git a/test_src/cli.h b/test_src/cli.h index acb6852..018c4da 100644 --- a/test_src/cli.h +++ b/test_src/cli.h @@ -33,10 +33,18 @@ typedef void (*cli_tx_fpt)(char); #define CMDLIST_ENTRY_SIZE 8 typedef struct { - PGM_P cmd_name; /* string containing the function name */ - PGM_P cmd_param_str; /* param descriptor string */ - void_fpt cmd_function; /* function pointer */ - void_fpt options; + uint16_t option_flags; + PGM_VOID_P options[]; +} cmdoption_t; + +#define CLI_OPTION_DESC 0x01 +#define CLI_OPTION_MANP 0x02 + +typedef struct { + PGM_P cmd_name; /* string containing the function name */ + PGM_P cmd_param_str; /* param descriptor string */ + void_fpt cmd_function; /* function pointer */ + cmdoption_t* options; } cmdlist_entry_t; extern cli_rx_fpt cli_rx; @@ -44,6 +52,7 @@ extern cli_tx_fpt cli_tx; extern uint8_t cli_echo; + void cli_putc(char c); uint16_t cli_getc(void); uint16_t cli_getc_cecho(void); diff --git a/test_src/uart.c b/test_src/uart.c index 8254211..06b3cec 100644 --- a/test_src/uart.c +++ b/test_src/uart.c @@ -58,6 +58,27 @@ #define RXC RXC0 #endif +#ifdef AT90USB162 +#define UCSRB UCSR1B +#define UCSRC UCSR1C +#define UDR UDR1 +#define UBRRH UBRR1H +#define UBRRL UBRR1L +#define URSEL UMSEL10 +#define USART_UDRE_vect USART1_UDRE_vect +#define USART_RXC_vect USART1_RX_vect +#define UDRIE UDRIE1 +#define TXEN TXEN1 +#define UMSEL UMSEL1 +#define RXEN RXEN1 +#define RXCIE RXCIE1 +#define UCSZ0 UCSZ10 +#define UCSRA UCSR1A +#define UDRE UDRE1 +#define RXC RXC1 +#endif + + #ifdef UART_XON_XOFF #ifdef UART_INTERRUPT