逆向解读编程协议,有兴趣的可以参与!
本帖最后由 chengzepeng 于 2012-8-29 15:02 编辑先上传附件!逻辑文件由那个便宜的USB逻辑分析仪读出,版本:Logic 1.1.15
直接在设置项第一个或者双击文件打开!无安装软件的可以去:http://www.saleae.com/downloads 下载!
压缩包内为逻辑文件,其中写里面包含读逻辑,写数据为512个0x33,
写0-F字符
拉低复位脚一段时间后开始发SPI,
MOSI: E0 5A A5 AA 00 // 进入编程模式
MISO:00 00 5A 5A 5A
MOSI: E5 53 35 5E 00 // 测试或连接什么的
MISO:5A 5A 5A 5A 5A // 返回空闲无意义之类
MOSI: B8 3F 07 00 00 // 估计是读芯片识别ID
MISO:5A 5A 5A 9A 10
MOSI: BC 3F 07 00 00 // 更新或者返回什么的
MISO:10 10 10 55 AA
MOSI: A0 00 00 00 00 // 如上
MISO:AA AA AA 55 AA
MOSI: 93 00 00 00 00 // 未知
MISO:AA AA AA 55 AA
MOSI: 93 40 00 00 00
MISO:AA AA AA 55 AA
MOSI: 91 40 00 00 00
MISO:AA AA AA 55 AA
MOSI: 91 00 00 00 00
MISO:AA AA AA 55 AA
MOSI: 80 00 00 00 00 //估计是擦除指令
MISO:AA AA AA 55 AA
后面的是写数据,90开头+地址+两个数据,然后换成98再写一次,最后还换回90再写一次,然后加地址也这样循环,直到写完8个结束进入下一次写,
最后写完全部后释放复位脚隔一段时间再拉低进入读数据模式,
读模式很好理解:
MOSI: E0 5A A5 AA 00 // 进入编程模式
MISO:00 00 5A 5A 5A
MOSI: B8 00 00 00 00 // 读FLASH
MISO:5A 5A 5A FF FF
MOSI: BC 00 00 00 00 // 更新寄存器
MISO:FF FF FF 31 30
。。。。。。。。直到读完8个字节后结束
MOSI: A0 00 00 00 00 // 结束
MISO:36 36 36 37 36
接着下一个循环读8个字节!
读完后退出释放复位脚!
发送数据结构:第1个数据为指令,第2和第3个是地址,第4和第5个为数据
返回数据结构:第1和第3个都是上次返回的最后那个数据,第4和第5个为本次读回的数据!
楼主加油,逆向工程是一项很辛苦但也比较有趣的工作。 说实话,都到这份上了厂家真应公布一下协议了. 本帖最后由 chengzepeng 于 2012-8-29 15:14 编辑
sibtck 发表于 2012-8-29 15:04 static/image/common/back.gif
说实话,都到这份上了厂家真应公布一下协议了.
他如果那么早公布的话就不是国产的了! 谁有看到goodcode公开协议。代码还写的那么猥琐。干脆就不去逆向了…… 刚才测试SPI进行连接发现只接受1M以下时钟的SPI通信!{:sweat:}
看来想快也快不了! xwkm 发表于 2012-8-29 15:46 static/image/common/back.gif
谁有看到goodcode公开协议。代码还写的那么猥琐。干脆就不去逆向了……
我代码哪里写的猥琐了? 自己不愿意付出就等现成的还那么多讲究? 本帖最后由 xwkm 于 2012-8-29 18:59 编辑
goodcode 发表于 2012-8-29 18:11 static/image/common/back.gif
我代码哪里写的猥琐了? 自己不愿意付出就等现成的还那么多讲究?
我开始是想分析你的下手。后面发现研究这个价值不大,加上代码反汇编出来乱七八糟。
所以我和楼主一样就开始研究LGTISP的时序。
你的方面我早就放弃了。继续在你的代码上深入是浪费时间。
你不要认为我只拿现成的,你去看看我的博客。再说出你这些话,我发现我决定反汇编你的代码就是一个极大的错误。 chengzepeng 发表于 2012-8-29 17:24 static/image/common/back.gif
刚才测试SPI进行连接发现只接受1M以下时钟的SPI通信!
看来想快也快不了! ...
51也就那个速度了:(12M)
SCLK=0;1T
MOSI=A_7;//低电平时输出一位1T
SCLK=1;//1T 1uS,传输要3uS
B_7=MISO;//高电平时接收一位
SCLK=0;
MOSI=A_6;
SCLK=1;
B_6=MISO;
SCLK=0;
MOSI=A_5;
SCLK=1;
B_5=MISO;
SCLK=0;
MOSI=A_4;
SCLK=1;
B_4=MISO;
SCLK=0;
MOSI=A_3;
SCLK=1;
B_3=MISO;
SCLK=0;
MOSI=A_2;
SCLK=1;
B_2=MISO;
SCLK=0;
MOSI=A_1;
SCLK=1;
B_1=MISO;
SCLK=0;
MOSI=A_0;
SCLK=1;
B_0=MISO;
SCLK=0;
我这个程序传输一个bit大约需要3uS,基本上也就是0.3MHz最高的水平……
sdcc生成的汇编代码就那样子, 51的汇编代码本来就不好看. 跟我代码猥琐不猥琐有鸟关系.
我回复里已经说了最好直接看官方的.
IDA 6.1工程文件
没IDA 6.1 LGT8F08A_USBASP_V2_20120806.asm 为IDA工程导出文件
时序我没怎么看 基本直接asm to c 完成的 工程内的注释, 函数名仅为个人理解 可能是完全错误的理解
既然你不是拿现成的, 这东西跟源代码已经没多大区别. 而且最重要的按你的话这是官方原装的.{:lol:} SPI的速度 我猜芯片是工作在16m二分频 理论上应该是2m 实际测试超过1.6m就不能进入编程模式了 测试发现在isp模式可能会读取rc校准值 也就是说spi的速度在临界的状态 可能因为rc的校准值进入不了编程模式
写入数据是比较繁琐的 我也不知道那些命令的目的是干什么的 可能是为了稳定性的考虑
ROM:09AE ; 写flash
ROM:09AE ; r20(低),r21(高) 目标地址
ROM:09AE ; r18(低),r19(高) 缓存地址
ROM:09AE ; r22(低),r23(高) 写入字节数
ROM:09AE ; r24 flash类型 1:eeprom
ROM:09AE ; 一次命令的最大长度小于128 否则出现错误
ROM:09AE
ROM:09AE IspWriteFlash: ; CODE XREF: sub_A87+17p
ROM:09AE ; sub_A87+21p ...
ROM:09AE 922F push r2
ROM:09AF 923F push r3
ROM:09B0 924F push r4
ROM:09B1 925F push r5
ROM:09B2 926F push r6
ROM:09B3 927F push r7
ROM:09B4 928F push r8
ROM:09B5 929F push r9
ROM:09B6 92AF push r10
ROM:09B7 92BF push r11
ROM:09B8 92CF push r12
ROM:09B9 92DF push r13
ROM:09BA 92EF push r14
ROM:09BB 92FF push r15
ROM:09BC 930F push r16
ROM:09BD 931F push r17
ROM:09BE 93DF push r29
ROM:09BF 93CF push r28
ROM:09C0 D000 rcall loc_9C1
ROM:09C1
ROM:09C1 loc_9C1:
ROM:09C1 920F push r0
ROM:09C2 B7CD in r28, SPL ; 保存sp到 r28,r29
ROM:09C3 B7DE in r29, SPH
ROM:09C4 017B movw r14, r22 ; 写入字节数->r14,r15
ROM:09C5 013A movw r6, r20 ; 目标地址->r6,r7
ROM:09C6 2F12 mov r17, r18 ; 缓存地址(低)->r17
ROM:09C7 2F03 mov r16, r19 ; 缓存地址(高)->r18
ROM:09C8 2E58 mov r5, r24 ; 取flash类型到r5
ROM:09C9 9452 swap r5
ROM:09CA 0C55 lsl r5
ROM:09CB EE50 ldi r21, -0x20 ; ' ; 0xe0
ROM:09CC 2255 and r5, r21 ; r5 flash命令
ROM:09CD E021 ldi r18, 1
ROM:09CE 1652 cp r5, r18 ; r5永远不可能为1?
ROM:09CF F411 brne loc_9D2 ; 如果 r5 <> 1跳转
ROM:09D0 940E 090C call ispBeginProgramming ; 操作开始?, 无返回值 MOSI 0xE5 0x53 0x35 0x5E 0x00
ROM:09D2
ROM:09D2 loc_9D2: ; CODE XREF: IspWriteFlash+21j
ROM:09D2 2D85 mov r24, r5
ROM:09D3 6980 ori r24, -0x70 ; 90
ROM:09D4 01B3 movw r22, r6 ; 目标地址->r22,r23
ROM:09D5 E040 ldi r20, 0
ROM:09D6 E050 ldi r21, 0
ROM:09D7 940E 08AB call ispWriteFlashCmd ; r24=命令
ROM:09D7 ; r22(低),r23(高) 目标地址
ROM:09D7 ; r20(低),r21(高) 写入数据字(word)
ROM:09D7 ;
ROM:09D7 ; 无返回值
ROM:09D9 ED40 ldi r20, -0x30 ; ' ; D0
ROM:09DA 2E44 mov r4, r20
ROM:09DB 2845 or r4, r5 ; r5 flash命令
ROM:09DC 2D84 mov r24, r4 ; r4 与 d0 或的命令
ROM:09DD 01B3 movw r22, r6 ; 目标地址->r22,r23
ROM:09DE E040 ldi r20, 0
ROM:09DF E050 ldi r21, 0
ROM:09E0 940E 08AB call ispWriteFlashCmd ; r24=命令
ROM:09E0 ; r22(低),r23(高) 目标地址
ROM:09E0 ; r20(低),r21(高) 写入数据字(word)
ROM:09E0 ;
ROM:09E0 ; 无返回值
ROM:09E2 0117 movw r2, r14 ; 写入字节数->r2,r3
ROM:09E3 9436 lsr r3
ROM:09E4 9427 ror r2 ; 写入字节数/ 2 计算需要执行的flash读取命令次数
ROM:09E5 2F81 mov r24, r17 ; 缓存地址(低)->r24
ROM:09E6 2F90 mov r25, r16 ; 缓存地址(高)->r25
ROM:09E7 019C movw r18, r24 ; 缓存地址->r18,r19
ROM:09E8 0159 movw r10, r18 ; 缓存地址->r10,r11
ROM:09E9 0143 movw r8, r6 ; 目标地址->r8,r9
ROM:09EA 821B std Y+3, r1
ROM:09EB 821A std Y+2, r1
ROM:09EC 24CC clr r12
ROM:09ED 24DD clr r13
ROM:09EE 2D35 mov r19, r5 ; 取flash命令
ROM:09EF 6D38 ori r19, -0x28 ; 0xd8
ROM:09F0 8339 std Y+1, r19
ROM:09F1 C023 rjmp loc_A15
ROM:09F2 ; ---------------------------------------------------------------------------
ROM:09F2
ROM:09F2 loc_9F2: ; CODE XREF: IspWriteFlash+6Cj
ROM:09F2 01F5 movw r30, r10 ; 缓存地址->R30,R31 Z寄存器
ROM:09F3 80F1 ldd r15, Z+1 ; 装载数据高字节到r15
ROM:09F4 24EE clr r14 ; 清零r14
ROM:09F5 8180 ld r24, Z ; 装载数据低字节到r24
ROM:09F6 2F28 mov r18, r24 ; 数据低8位->r18
ROM:09F7 E030 ldi r19, 0
ROM:09F8 292E or r18, r14 ; r18数据低8位 r19数据高8位
ROM:09F9 293F or r19, r15
ROM:09FA 833B std Y+3, r19 ; 存储写入数据字到sram中
ROM:09FB 832A std Y+2, r18
ROM:09FC 2D84 mov r24, r4 ; cmd1 0xD0 | flashType
ROM:09FD 01B8 movw r22, r16 ; 目标地址
ROM:09FE 01A9 movw r20, r18 ; 写入数据字
ROM:09FF 940E 08AB call ispWriteFlashCmd ; r24=命令
ROM:09FF ; r22(低),r23(高) 目标地址
ROM:09FF ; r20(低),r21(高) 写入数据字(word)
ROM:09FF ;
ROM:09FF ; 无返回值
ROM:0A01 8189 ldd r24, Y+1 ; cmd2 0xD8 | flashType
ROM:0A02 01B8 movw r22, r16 ; 取目标地址
ROM:0A03 814A ldd r20, Y+2
ROM:0A04 815B ldd r21, Y+3
ROM:0A05 940E 08AB call ispWriteFlashCmd ; r24=命令
ROM:0A05 ; r22(低),r23(高) 目标地址
ROM:0A05 ; r20(低),r21(高) 写入数据字(word)
ROM:0A05 ;
ROM:0A05 ; 无返回值
ROM:0A07 2D84 mov r24, r4 ; cmd1 0xD0 | flashType
ROM:0A08 01B8 movw r22, r16 ; 取目标地址
ROM:0A09 814A ldd r20, Y+2
ROM:0A0A 815B ldd r21, Y+3
ROM:0A0B 940E 08AB call ispWriteFlashCmd ; r24=命令
ROM:0A0B ; r22(低),r23(高) 目标地址
ROM:0A0B ; r20(低),r21(高) 写入数据字(word)
ROM:0A0B ;
ROM:0A0B ; 无返回值
ROM:0A0D 9408 sec
ROM:0A0E 1CC1 adc r12, r1
ROM:0A0F 1CD1 adc r13, r1
ROM:0A10 E082 ldi r24, 2
ROM:0A11 E090 ldi r25, 0
ROM:0A12 0EA8 add r10, r24
ROM:0A13 1EB9 adc r11, r25
ROM:0A14 0148 movw r8, r16 ; 目标地址->r8, r9
ROM:0A15
ROM:0A15 loc_A15: ; CODE XREF: IspWriteFlash+43j
ROM:0A15 0186 movw r16, r12
ROM:0A16 0D06 add r16, r6
ROM:0A17 1D17 adc r17, r7
ROM:0A18 14C2 cp r12, r2
ROM:0A19 04D3 cpc r13, r3
ROM:0A1A F2B8 brcs loc_9F2 ; 开始写字(word)
ROM:0A1B 2D85 mov r24, r5 ; 取flash命令
ROM:0A1C 6580 ori r24, 0x50
ROM:0A1D 01B4 movw r22, r8
ROM:0A1E 814A ldd r20, Y+2
ROM:0A1F 815B ldd r21, Y+3
ROM:0A20 940E 08AB call ispWriteFlashCmd ; r24=命令
ROM:0A20 ; r22(低),r23(高) 目标地址
ROM:0A20 ; r20(低),r21(高) 写入数据字(word)
ROM:0A20 ;
ROM:0A20 ; 无返回值
ROM:0A22 2D85 mov r24, r5 ; 取flash命令
ROM:0A23 6180 ori r24, 0x10
ROM:0A24 01B4 movw r22, r8
ROM:0A25 814A ldd r20, Y+2
ROM:0A26 815B ldd r21, Y+3
ROM:0A27 940E 08AB call ispWriteFlashCmd ; r24=命令
ROM:0A27 ; r22(低),r23(高) 目标地址
ROM:0A27 ; r20(低),r21(高) 写入数据字(word)
ROM:0A27 ;
ROM:0A27 ; 无返回值
ROM:0A29 E080 ldi r24, 0
ROM:0A2A 01B4 movw r22, r8
ROM:0A2B 814A ldd r20, Y+2
ROM:0A2C 815B ldd r21, Y+3
ROM:0A2D 940E 08AB call ispWriteFlashCmd ; r24=命令
ROM:0A2D ; r22(低),r23(高) 目标地址
ROM:0A2D ; r20(低),r21(高) 写入数据字(word)
ROM:0A2D ;
ROM:0A2D ; 无返回值
ROM:0A2F 900F pop r0
ROM:0A30 900F pop r0
ROM:0A31 900F pop r0
ROM:0A32 91CF pop r28
ROM:0A33 91DF pop r29
ROM:0A34 911F pop r17
ROM:0A35 910F pop r16
ROM:0A36 90FF pop r15
ROM:0A37 90EF pop r14
ROM:0A38 90DF pop r13
ROM:0A39 90CF pop r12
ROM:0A3A 90BF pop r11
ROM:0A3B 90AF pop r10
ROM:0A3C 909F pop r9
ROM:0A3D 908F pop r8
ROM:0A3E 907F pop r7
ROM:0A3F 906F pop r6
ROM:0A40 905F pop r5
ROM:0A41 904F pop r4
ROM:0A42 903F pop r3
ROM:0A43 902F pop r2
ROM:0A44 9508 ret 我们可以技术支持做专业的编程器的朋友。 logicgreen 发表于 2012-8-30 11:15 static/image/common/back.gif
我们可以技术支持做专业的编程器的朋友。
连个编程协议都不给还叫支持?{:sweat:} to:logicgreen能提供协议给我们吗?我来搞个专业的。 我们没有公布LGT8X系列调试和ISP协议并不是因为我们不想公布, 考虑到第一版协议中的某些不可扩展的原因,
我们将在后续的版本中更新相关协议, 而且也将会把ISP接口与调试接口都合并到SWD接口协议上。所以以后将不会支持SPI接口的ISP工具。
考虑以上因素, 才没有急于公布目前的协议。 我们会在下一款产品发布后公布调试和ISP协议。 zhifeng 发表于 2012-8-30 14:31 static/image/common/back.gif
to:logicgreen能提供协议给我们吗?我来搞个专业的。
可以联系我。QQ42236699 编程协议总结:
协议结构:
指令位:第1个数据和第2个数据的高两位(7:6),第2个的第5位是FLASH和EEPROM选择,0为FLASH,1为iEEPROM。
地址位:第2个的(4:0),地址为0x00~0x1F,32个,共128分页,总字节32*128*2=8K。
分页位:第3个为分页数。
数据位:第4个为数据低8位,第5个为数据高8位,数据为16位。
指令:
MOSI: E0 5A A5 AA 00 // 进入编程模式
MISO:00 00 5A 5A 5A
MOSI: E5 53 35 5E 00
MISO:5A 5A 5A 5A 5A
MOSI: E5 53 35 5E 00
MISO:5A 5A 5A 5A 5A
MOSI: B8 3F 07 00 00
MISO:5A 5A 5A 9A 10
MOSI: BC 3F 07 00 00
MISO:10 10 10 55 AA
MOSI: A0 00 00 00 00
MISO:AA AA AA 55 AA
MOSI: 93 00 00 00 00
MISO:AA AA AA 55 AA
MOSI: 93 40 00 00 00
MISO:AA AA AA 55 AA
MOSI: 91 40 00 00 00
MISO:AA AA AA 55 AA
MOSI: 91 00 00 00 00
MISO:AA AA AA 55 AA
MOSI: 80 00 00 00 00 // 到了这里后就擦除完毕了
MISO:AA AA AA 55 AA
以下是进入写模式:
MOSI: 90 80 00 00 00 // 进入写模式,在写模式里面必须每次传输都要把地址和页数发送,最后的两个数据可以为0
MISO:AA AA AA 55 AA
MOSI: 90 C0 00 00 00 // 如上
MISO:AA AA AA 55 AA
进入该页写:
MOSI:90 C0 00
MOSI:98 C0 00
MOSI:90 C0 00
每一个地址写上面这三个一次,数据相同,
写完一页后写:
MOSI:90 43 00 // 把第2个的第7位清掉
MOSI:90 03 00 // 继续把第2个的第6位也清掉
MOSI:80 03 00 // 这里应该是退出写了吧。
循环到上面写页处继续下下一页数据!
读数据:
MOSI:B8 00 00 // 写读指令和地址
MOSI:BC 00 00 // 这回在MISO会返回数据
增加地址,
直到读完一页后退出
MOSI:A0 00 00 // 这里应该是退出读了吧。
循环回去更改页数继续读,直到把所有页读完!
1M的SPI下可以把8K数据在1秒钟写和读完! to:logicgreen 已加你的qq zhifeng 发表于 2012-8-30 17:57 static/image/common/back.gif
to:logicgreen 已加你的qq
没有!
好像我被无视了!
基本的命令搞懂了!
详细的就不是很清楚,
弄个编程器还是可以的! to:chengzepeng 我们也可以交流呀 zhifeng 发表于 2012-8-30 22:08 static/image/common/back.gif
to:chengzepeng 我们也可以交流呀
联系上了! EEPROM的编址从0x20-0x3F,一共64个字节一个页。共有7页
FLASH的编值从0x00-0x1F,也是64字节一个页,共有128页, mark, lgt isp
logicgreen 发表于 2012-8-30 16:17 static/image/common/back.gif
可以联系我。QQ42236699
其实我期待智峰支持你们的东西嘿嘿 zhifeng 发表于 2012-8-30 22:08 static/image/common/back.gif
to:chengzepeng 我们也可以交流呀
智峰 做好了要升级我们原来的设备啊我有好多套你们的
页:
[1]