Autor Tema: Bootloader encriptado para Attiny88  (Leído 30556 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: Bootloader encriptado para Attiny88
« Respuesta #45 en: 23 de Septiembre de 2015, 11:46:43 »
Estoy parado en un detalle tonto y no consigo seguir.

Programa en asm para hacer un blink (tomado del listado de un programa c que funciona):

Código: [Seleccionar]
.text

.global  delay
delay:
      sbiw r24,1
      brcs .L1
.L2:
      ldi r18,lo8(-30)
      ldi r19,lo8(3)
.L5:
      nop
      subi r18,1
      sbc r19,r0
      cp r18,r0
      cpc r19,r0
      brne .L5
      rjmp .L2
.L1:
      ret



.global  main
main:
      sbi 0xe,3
      sbi 0xd,3
.L8:
      sbi 0xd,0
      ldi r24,lo8(-24)
      ldi r25,lo8(3)
      rcall delay
      cbi 0xd,0
      ldi r24,lo8(-24)
      ldi r25,lo8(3)
      rcall delay
      rjmp .L8

Lo intento compilar así:

Código: [Seleccionar]
d:/Bin/avr8-gnu/bin/avr-gcc.exe -g -mmcu=attiny88 -x assembler-with-cpp boot.asm -o boot.o
d:/Bin/avr8-gnu/bin/avr-gcc.exe -g -mmcu=attiny88 boot.o -o boot.elf

y me aparece error en el segundo comando:

Código: [Seleccionar]
boot.o: In function `__vector_1':
(.text+0x38): multiple definition of `__bad_interrupt'
d:/bin/avr8-gnu/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avr25/crttn88.o:(.text+0x0): first defined here
boot.o: In function `__vectors':
(.text+0x0): multiple definition of `__vectors'
d:/bin/avr8-gnu/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avr25/crttn88.o:(.vectors+0x0): first defined here
collect2.exe: error: ld returned 1 exit status

¿Alguien sabe cómo compilar esto?

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Bootloader encriptado para Attiny88
« Respuesta #46 en: 23 de Septiembre de 2015, 12:08:52 »
No entendi bien...

Estas tratando de compilar el ASM ese con gcc
O eso lo llamas de un .c ?

http://stackoverflow.com/questions/21218690/gcrt1-s195-multiple-definition-of-bad-interrupt

Eso tiene el mismo problema.

--------------------------------------------------------------

Ademas no estarias compilandolo 2 veces ?

AVR-GCC es el compilador. Una ves que tenes el codigo objeto ( .o ) o la coleccion de las mismas deberias pasarlo por el linker.
Pero AVR-GCC no es el linker. lo cual estas compilando nuevamente el .o

Creo que avr-gcc ya hace todo.. compila y linkea con una sola pasada.

Sino:
Cualquier cosa busca en el .c que tenes que linker esta usando, seguro que en las propiedades del proyecto ademas trae las opciones que se le agregan a la linea de comando.



-------------------------------------------------------------

Proba poniendo el -v o -### asi activa el verbose mode y se puede ver cual es el error

Vi que usa -c para compilar y no linkear

Estas usando assembler-with-cpp cuando tenes solo un archivo solo con ASM ?
« Última modificación: 23 de Septiembre de 2015, 12:36:24 por KILLERJC »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: Bootloader encriptado para Attiny88
« Respuesta #47 en: 23 de Septiembre de 2015, 13:25:45 »
Es que normalmente yo llamo al linker a través del compilador:

Programa: blink.c
Código: [Seleccionar]
/*
  Blink led every second
*/
#include <avr/io.h>

#define BIT_CLEAR(byte, bit)  byte &= (~(1<<(bit)))
#define BIT_SET(byte, bit)    byte |= (1<<(bit))

void delay_ms(unsigned int c) {
   unsigned int i;
   while(c--) {
      for(i=994; i--;) asm("nop");
   }
}


void main(void) {
   BIT_SET(DDRA, 3);  // Port output (transistor)
   BIT_SET(PORTA, 3); // Port high (LEDS ON)

   BIT_SET(DDRA, 0);  // Port output (Cathode)
    
   while(1) {
      BIT_CLEAR(PORTA, 0); // LED ON
      delay_ms(500);
      BIT_SET(PORTA, 0);   // LED OFF
      delay_ms(500);
   }
}


Compilador y linker en windows: _compile.bat

Código: [Seleccionar]
@echo off
SET file=blink
D:/Bin/avr8-gnu/bin/avr-gcc.exe -Os -mmcu=attiny88 -c %file%.c
D:/Bin/avr8-gnu/bin/avr-gcc.exe -Os -mmcu=attiny88 -o %file%.elf %file%.o
D:/Bin/avr8-gnu/bin/avr-objcopy.exe -O ihex %file%.elf %file%.hex
del *.elf
pause

1º Compilador: obtiene el fichero   blink.o
2º Linker : obtiene el fichero *.elf
3º Convierte el fichero *.elf en un fichero *.hex

Y al final obtengo el fichero blink.hex  listo para cargar en el microcontrolador.

Lo que no se es cómo hacerlo sólo para assembler. Imagino que hay que llamar directamente al linker.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Bootloader encriptado para Attiny88
« Respuesta #48 en: 23 de Septiembre de 2015, 13:34:46 »
Probaria asi:


Código: [Seleccionar]
D:/Bin/avr8-gnu/bin/avr-gcc.exe -Os -mmcu=attiny88 -c -x assembler boot.S
D:/Bin/avr8-gnu/bin/avr-gcc.exe -Os -mmcu=attiny88 -o boot.elf boot.o
D:/Bin/avr8-gnu/bin/avr-objcopy.exe -O ihex boot.elf boot.hex

El -c le dice que lo compile y no lo linkee. Me aseguro con x de que sepa que es un archivo asm.

Sino probaria darle directamente con

Código: [Seleccionar]
D:/Bin/avr8-gnu/bin/avr-gcc.exe -Os -mmcu=attiny88 -x assembler boot.S -o boot.elf
D:/Bin/avr8-gnu/bin/avr-objcopy.exe -O ihex boot.elf boot.hex
Para ver que sale
« Última modificación: 23 de Septiembre de 2015, 13:38:54 por KILLERJC »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: Bootloader encriptado para Attiny88
« Respuesta #49 en: 23 de Septiembre de 2015, 13:43:58 »
Ya lo conseguí.
Cuando los fuentes están sólo en ensamblador, se puede omitir el linker:

Programa en ensamblador: blink2.asm
Código: [Seleccionar]
.text

.global  delay
delay:
.L2:
      ldi r18,lo8(995)
      ldi r19,hi8(995)
.L5:
      nop
      nop
      subi r18,1
      sbc r19,r0
      cp r18,r0
      cpc r19,r0
      brne .L5
      subi r24,1
      sbc r25,r0
      cp r24,r0
      cpc r25,r0
      brne .L2
      ret


.global  main
main:
      cli
      sbi 0xe,3
      sbi 0xd,3
.L8:
      sbi 0xd,0
      ldi r24,lo8(500)
      ldi r25,hi8(500)
      rcall delay
      cbi 0xd,0
      ldi r24,lo8(500)
      ldi r25,hi8(500)
      rcall delay
      rjmp .L8
El programa no está optimizado.


Programa para ensamblar en Windows con avr-gnu: _assembly.bat
Código: [Seleccionar]
@echo off
SET file=blink2
d:/Bin/avr8-gnu/bin/avr-gcc.exe -mmcu=attiny88 -x assembler-with-cpp %file%.asm -o %file%.o
d:/Bin/avr8-gnu/bin/avr-objcopy.exe -O ihex %file%.o %file%.hex
pause

1º Ensamblador  para conseguir fichero objeto blink2.o
2º Convierte fichero objeto en hex: blink2.hex

Un saludo.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: Bootloader encriptado para Attiny88
« Respuesta #50 en: 23 de Septiembre de 2015, 13:46:11 »
Veo que has posteado lo mismo un poco antes, Killer.

Ese segundo método funciona Ok.

Ahora a probar el algoritmo XTEA. Tengo una versión mía que he ido programando en paralelo.
Voy a comparar los dos archivos (el tuyo y el mío) y posteo el resultado.

Pero antes, quiero desensamblar el fichero anterior para ver cómo coloca el vector de reset.
Yo no lo he programado, de forma que imagino que lo hará automáticamente el ensamblador.
Eso no me convence del todo, porque tengo que manejar las posiciones y los vectores a mano.

Un saludo.
« Última modificación: 23 de Septiembre de 2015, 13:48:46 por Picuino »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Bootloader encriptado para Attiny88
« Respuesta #51 en: 23 de Septiembre de 2015, 13:47:46 »
Suerte Picuino, yo estoy tan interesado que funione como si fuera un proyecto mio  :-/


Y una cosa:

Citar
1º Ensamblador  para conseguir fichero objeto blink2.o
2º Convierte fichero objeto en hex: blink2.hex

Creo que no vendria a ser el .o , sino el .elf directo. recorda que el .o deberia pasar por el linker, y esto ya paso por eso. O me estoy equivocando?


Citar
Eso no me convence del todo, porque tengo que manejar las posiciones y los vectores a mano.

No entiendo lo de ponerlos a mano, lo unico que se es que si pones el programa al final, lo mas seguro es que pierdas los vectores de reset.
Creo que va a depender del linker, el archivo linker que vi tienen ya una seccion destinada a los vectores de interupcion, el que vi se llamaba .intvec.
« Última modificación: 23 de Septiembre de 2015, 13:57:16 por KILLERJC »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: Bootloader encriptado para Attiny88
« Respuesta #52 en: 23 de Septiembre de 2015, 15:09:51 »
Bueno, por ahora publico mi rutina de XTEA en asm.
Sólo está comprobado que se ensambla sin problemas. Nada más.

Código: ASM
  1. ;
  2. ;  XTEA decipher routine
  3. ;
  4. #include <avr/io.h>
  5.  
  6. #define  data0       r2
  7. #define  data1       r3
  8. #define  data2       r4
  9. #define  data3       r5
  10. #define  data4       r6
  11. #define  data5       r7
  12. #define  data6       r8
  13. #define  data7       r9
  14. #define  temp0       r10
  15. #define  temp1       r11
  16. #define  temp2       r12
  17. #define  temp3       r13
  18. #define  temp4       r14
  19. #define  temp5       r15
  20. #define  temp6       r16
  21. #define  temp7       r17
  22. #define  suma0       r18
  23. #define  suma1       r19
  24. #define  suma2       r20
  25. #define  suma3       r21
  26. #define  r_index     r22
  27. #define  rounds      r23
  28.  
  29. #define  YL          r28
  30. #define  YH          r29
  31. #define  ZL          r30
  32. #define  ZH          r31
  33.  
  34. #define  XTEA_ROUNDS  64
  35.  
  36. ;
  37. ; Inputs:
  38. ;   data0 ... data7 = 8 bytes of coded data
  39. ;
  40. ; Outputs:
  41. ;   data0 ... data7 = 8 bytes of decoded data
  42. ;
  43.  
  44. xtea_decode:
  45.  
  46.    ; suma = 0xC6EF3720
  47.    ldi    suma0, 0x20
  48.    ldi    suma1, 0x37
  49.    ldi    suma2, 0xEF
  50.    ldi    suma3, 0xC6
  51.  
  52.    ; rounds = 64
  53.    ldi   rounds, XTEA_ROUNDS
  54.  
  55.    ; do {
  56. xtea_decode_loop:
  57.  
  58.    ; temp_a = data0
  59.    movw  temp0, data0
  60.    movw  temp2, data2
  61.  
  62.    ; temp_b = data1
  63.    movw  temp4, data4
  64.    movw  temp6, data6
  65.  
  66.    ; data1 = temp
  67.    movw  data4, temp0
  68.    movw  data6, temp2
  69.  
  70.    ; data0 = temp_b
  71.    movw  data0, temp4
  72.    movw  data2, temp6
  73.  
  74.    ; temp_b = temp
  75.    movw  temp4, temp0
  76.    movw  temp6, temp2
  77.  
  78.  
  79.    ; temp_a <<= 4
  80.    ldi   r_index, 4
  81. xtea_shift_left:
  82.    lsl   temp0
  83.    rol   temp1
  84.    rol   temp2
  85.    rol   temp3
  86.    dec   r_index
  87.    brne  xtea_shift_left
  88.  
  89.  
  90.    ; temp_b >>= 5
  91.    ldi   r_index, 5
  92. xtea_shift_right:
  93.    lsr   temp0
  94.    ror   temp1
  95.    ror   temp2
  96.    ror   temp3
  97.    dec   r_index
  98.    brne  xtea_shift_right
  99.  
  100.  
  101.    ; temp_a ^= temp_b
  102.    eor   temp0, temp4
  103.    eor   temp1, temp5
  104.    eor   temp2, temp6
  105.    eor   temp3, temp7
  106.  
  107.  
  108.    ; temp_a += data1
  109.    add   temp0, data4
  110.    adc   temp1, data5
  111.    adc   temp2, data6
  112.    adc   temp3, data7
  113.  
  114.  
  115.    ; if ((rounds & 1) == 0):
  116.    ;    r1 = (suma>>11) & 3
  117.    sbrc  rounds, 0
  118.    rjmp  xtea_label_1
  119.    mov   r_index, suma1
  120.    lsr   r_index
  121.    rjmp  xtea_label_2
  122.    ; else:
  123.    ;    r1 = suma & 3
  124. xtea_label_1:
  125.    mov   r_index, suma0
  126.    lsl   r_index
  127.    lsl   r_index
  128. xtea_label_2:
  129.    andi  r_index, 0b00001100
  130.  
  131.  
  132.    ; temp_b = xtea_key[r1*4]
  133.    ldi   ZL, lo8(xtea_key_table)
  134.    ldi   ZH, hi8(xtea_key_table)
  135.    add   ZL, r_index
  136.    lds   r_index, SREG
  137.    sbrc  r_index, 0
  138.    inc   ZH
  139.    lpm   temp4, Z+
  140.    lpm   temp5, Z+
  141.    lpm   temp6, Z+
  142.    lpm   temp7, Z+
  143.  
  144.  
  145.    ; temp_b += suma
  146.    add   temp4, suma0
  147.    adc   temp5, suma1
  148.    adc   temp6, suma2
  149.    adc   temp7, suma3
  150.  
  151.  
  152.    ; temp_a ^= temp_b
  153.    eor   temp0, temp4
  154.    eor   temp1, temp5
  155.    eor   temp2, temp6
  156.    eor   temp3, temp7
  157.  
  158.  
  159.    ; data0 -= temp
  160.    sub   data0, temp0
  161.    sbc   data1, temp1
  162.    sbc   data2, temp2
  163.    sbc   data3, temp3
  164.  
  165.  
  166.    ; if ((rounds & 1) == 0):
  167.    ;    suma -= 0x9E3779B9
  168.    sbrc  rounds, 0
  169.    rjmp  xtea_label_3
  170.    subi  suma0, 0xB9
  171.    sbci  suma1, 0x79
  172.    sbci  suma2, 0x37
  173.    sbci  suma3, 0x9E
  174. xtea_label_3:
  175.  
  176.    ;    rounds -= 1
  177.    ; } while(rounds);
  178.    dec   rounds
  179.    breq  xtea_end  
  180.    rjmp  xtea_decode_loop
  181.  
  182. xtea_end:
  183.  
  184. xtea_key_table:
  185.    .byte   0x12, 0x34, 0x56, 0x78
  186.    .byte   0x12, 0x34, 0x56, 0x78
  187.    .byte   0x12, 0x34, 0x56, 0x78
  188.    .byte   0x12, 0x34, 0x56, 0x78


Ahora voy a comprobar si funciona correctamente.

Una vez que funcione voy a intentar optimizarla un poco más. Ahora ocupa 172 bytes.
Para eso me voy a fijar en la rutina de Killer, a ver si entre los 2 podemos reducirla.

Saludos.
« Última modificación: 23 de Septiembre de 2015, 15:30:50 por Picuino, Razón: Corregida errata en xtea_key_table »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: Bootloader encriptado para Attiny88
« Respuesta #53 en: 23 de Septiembre de 2015, 15:30:18 »
Las rutinas son casi iguales.
Yo he unido los dos pasos en uno sólo (con el programa en python) para reducir algunas instrucciones, pero no sé si al pasarlo a asm ha mejorado.

Voy a comprobar si funciona y luego continúo intentando reducir tamaño.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Bootloader encriptado para Attiny88
« Respuesta #54 en: 23 de Septiembre de 2015, 15:42:28 »
Yo al mio veo como mejorarlo un poco haciendo unas cosas que hiciste vos, que es lo de pasar los terminos de esa forma e incorporar la resta a el loop. lo cual me puede ahorrar unas cuantas lineas creo. tal ves unas 10 creo.

El tuyo lo vi y no hay mucho para mejorar, ejemplo vos haces:

Código: [Seleccionar]
  add   ZL, r_index
   lds   r_index, SREG
   sbrc  r_index, 0
   inc   ZH

yo hago:

Código: [Seleccionar]
    ADD ZL,R0 ; Le sumo el valor de R0 o lo que es igual a 4 * index
     CLR        R0 ; Me aseguro que por mas que caiga donde sea la llave en el programa no se produzca algun error
     ADC ZH,R0 ; Sumandole el carry

Tengo 1 instruccion menos, uso el CLR que no afecta a la bandera C, y luego sumo ZH + R0 + C, como R0 es 0, ZH + C , no se si es lo toma como correcto y no modifica el bit de Carry esto
Una cosa a mejorar en lo tuyo

Código: [Seleccionar]
  dec   rounds
   breq  xtea_end  
   rjmp  xtea_decode_loop
xtea_end:
por

Código: [Seleccionar]
  dec   rounds
   brneq  xtea_decode_loop
xtea_end:



PD: Si queres un highlight de AVR-ASM para el gedit
https://launchpad.net/avrasm-gtk-highlight
« Última modificación: 23 de Septiembre de 2015, 15:51:13 por KILLERJC »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: Bootloader encriptado para Attiny88
« Respuesta #55 en: 23 de Septiembre de 2015, 17:08:00 »
La primera modificación está bien, no me había dado cuenta en la primera pasada. La copio.

La segunda la tenía como tú dices, pero el loop es demasiado largo y la instrucción brne no llega a poder saltar. Quizás si acorto un poco la rutina se pueda.

Al comienzo se intercambian los datos y se copia el primero en los registros temporales. Creo que eso lo puedo acortar un poco y dejarlo más claro:

Código: [Seleccionar]
   ; temp_a = data0
   movw  temp0, data0
   movw  temp2, data2

   ; temp_b = data0
   movw  temp4, data0
   movw  temp6, data2

   ; data0 = data1
   movw  data0, data4
   movw  data2, data6

   ; data1 = temp_a
   movw  data4, temp0
   movw  data6, temp2

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Bootloader encriptado para Attiny88
« Respuesta #56 en: 23 de Septiembre de 2015, 17:20:58 »
No me habia dado cuenta de la limitacion, pense que no iba a ser tan largo el loop, al menos en el mio como para que eso sucediera.

La forma de acortarlo me parece bien.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: Bootloader encriptado para Attiny88
« Respuesta #57 en: 24 de Septiembre de 2015, 15:51:27 »
No encuentro la forma de reservar SRAM con el ensamblador GNU.
El problema de este programa es que no encuentro un manual.

Desconectado stk500

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4923
Re: Bootloader encriptado para Attiny88
« Respuesta #58 en: 24 de Septiembre de 2015, 16:47:46 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Bootloader encriptado para Attiny88
« Respuesta #59 en: 24 de Septiembre de 2015, 17:00:51 »
No encuentro la forma de reservar SRAM con el ensamblador GNU.
El problema de este programa es que no encuentro un manual.

No entiendo por que estas reservando RAM? Y ahora que lo pienso tampoco se por que estas programandolo con gcc xD, Cuando es ASM nomas.

O decis que reservar ram el linker para no utilizar direcciones absolutas?


 

anything