数码之家

 找回密码
 立即注册
搜索
查看: 10105|回复: 25

记录点亮未知墨水屏的过程,通过反汇编查找指令

  [复制链接]
发表于 2021-3-19 20:14:30 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 reiyawea 于 2021-3-19 20:16 编辑

【标题是向此贴致敬,是楼主向未知挑战的勇气激励我求索】
接上一贴发现了汉朔电子墨水屏价签的亚种
找不到资料,只好想点别的办法,碰碰运气。
首先读出固件

hanshow2.zip (13.98 KB, 下载次数: 32)
然后幸运地找到了反汇编工具,虽然写得粗糙,但帮了大忙,省得从零开始写程序。
但还是有一些写错的地方有,导致把数据当作指令而解析失败。
研究了一下MSP430指令集,还算简单,16位指令结构比较整齐,数量也不多,大概看了一下。
哪里失败就修改哪里,磕磕绊绊终于反汇编了整个程序。
把用到P2OUT、P3OUT的地方找出来,位操作对象是P2.3(时钟)、2.4(数据)、3.5(DC)的要重点关照。
有一处同时存在移位和时钟信号置位复位,就一定是模拟SPI的子程序。
有两处先设置DC再调用上述SPI时序,那就一定是写指令和数据的地方。
有一处先操作RST再跟着一串调用上述写指令和数据,那就一定是初始化程序。
整理出写屏操作如下

所在固件地址写指令 写数据1 数据2 数据3
e93e06 17 17 17
e95a04
e962001f 0b
e9726198 0 d4
d9885097
然后开始搜索各种墨水屏的资料,核对指令寄存器。
这里找到一款,分辨率一致,外形非常相似、排线上印字也有相同前缀。
资料“UC8151C升级UC8151D说明”中列举了初始化指令,其中UC8151C部分与上表高度一致,故基本确定为UC8151C。
(考虑到此价签有年头了,合理推测应该是用了旧的C版芯片)
下载程序示例、移植、烧录,成功地显示出测试图案。
再改一下,把自己的图片放进去
IMG_20210319_193309.jpg
此款虽然分辨率低(212*104),但支持4级灰度。更适合显示图片(之前那款适合文字)
程序就不拿出来献丑了,大家用官方例程吧。



打赏

参与人数 9家元 +188 收起 理由
springvirus + 20 優秀文章
大头头头 + 12 優秀文章
jf201006 + 10 謝謝分享
cutter + 6 高手
2545889167 + 20
hongo + 20 優秀文章
litchiate + 20
家睦 + 60
nokia5320 + 20 感谢分享

查看全部打赏

发表于 2021-3-22 12:04:41 | 显示全部楼层
厉害呀,分析精确,还会反汇编
回复 支持 反对

使用道具 举报

发表于 2021-3-23 00:16:03 来自手机浏览器 | 显示全部楼层
好奇的问下原板芯片居然没有加密?
用的啥反汇编软件啊?
回复 支持 0 反对 1

使用道具 举报

发表于 2021-3-23 11:17:11 | 显示全部楼层
厉害呀,反汇编大佬,羡慕
回复 支持 反对

使用道具 举报

发表于 2021-3-23 21:12:13 | 显示全部楼层
好家伙! 楼主太厉害了 !
我还是要学习一个,因为我太年轻,天赋也太普通了!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-3 23:41:46 | 显示全部楼层
反汇编实在是太艰辛了,程序只是把机器码转换成汇编助记符,遇到跳转指令可以指出目标地址,仅此而已。剩下的全部要靠人力。中间的过程细节就不多说了。
幸好只是要找出墨水屏协议,而且只是初始化的那部分。如果要找出无线协议那真是比登天还难。
以下是反汇编+人力翻译的结果,各位图个乐,看看就好。
汉朔4灰度屏.zip (24.66 KB, 下载次数: 34)





打赏

参与人数 1家元 +20 收起 理由
家睦 + 20

查看全部打赏

回复 支持 1 反对 0

使用道具 举报

发表于 2021-4-4 07:12:28 | 显示全部楼层
有没有 红 黑 双色屏的研究结果啊?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-4 09:44:59 | 显示全部楼层
nonzhe 发表于 2021-4-4 07:12
有没有 红 黑 双色屏的研究结果啊?

我也是淘旧货买的,手上只有2种黑白的,双色的太贵了没舍得买
回复 支持 反对

使用道具 举报

发表于 2021-4-13 11:47:03 | 显示全部楼层
厉害,感觉4灰阶可玩性高很多啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-25 22:05:11 | 显示全部楼层
xxp1943 发表于 2021-4-13 11:47
厉害,感觉4灰阶可玩性高很多啊

虽然有灰度显示能力,但对比度较低,不如单色屏锐利,分辨率也略低。
用的是官方例程的波表,不知道这其中是否还有提升的余地。
下面是对比。单色屏抖动显示效果也不差,远看甚至更好一些(感觉对比度更高)。
IMG_20210625_215725.jpg
回复 支持 1 反对 0

使用道具 举报

发表于 2021-9-11 12:06:30 来自手机浏览器 | 显示全部楼层
墨水屏还有灰度呢?主要灰度图片的取模比较复杂。
回复 支持 反对

使用道具 举报

发表于 2021-9-27 13:03:05 | 显示全部楼层
能做成时钟就好了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-27 19:32:43 | 显示全部楼层
gdszyrx 发表于 2021-9-27 13:03
能做成时钟就好了

汉朔2.13寸电子墨水屏价签改造成桌面时钟摆件
https://www.mydigit.cn/thread-270617-1-1.html
(出处: 数码之家)
回复 支持 反对

使用道具 举报

发表于 2021-10-19 23:23:38 | 显示全部楼层
reiyawea 发表于 2021-6-25 22:05
虽然有灰度显示能力,但对比度较低,不如单色屏锐利,分辨率也略低。
用的是官方例程的波表,不知道这其 ...

楼主第一张图是用什么软件取模的(搜了抖动显示没找到相关信息)
感觉图片能取模成这样,单色屏可玩性也不差。
回复 支持 反对

使用道具 举报

发表于 2021-12-7 17:08:08 | 显示全部楼层
楼主能给一下这个显示图片的程序吗?
谢谢
回复 支持 反对

使用道具 举报

发表于 2022-2-16 12:22:02 | 显示全部楼层
固件的读取过程能否说说
回复 支持 反对

使用道具 举报

发表于 2022-3-30 22:33:41 | 显示全部楼层
这个反汇编程序好像跑不起来
回复 支持 反对

使用道具 举报

发表于 2022-4-4 15:50:41 | 显示全部楼层
玩汇编的是高手啊
回复 支持 反对

使用道具 举报

发表于 2022-11-25 13:57:42 | 显示全部楼层
向大佬学习,不知道灰阶要怎么弄啊。能指教一下吗?
回复 支持 反对

使用道具 举报

发表于 2023-1-15 14:38:37 | 显示全部楼层
本帖最后由 coolzlp003 于 2023-1-15 14:43 编辑

你好,能分享一下源码吗? 我的邮箱colz003@163.com
研究好几天了,按照您说的办法,去官网下载例程 ,也看了源码,下载到价签里,还是没有点亮
可是不会移植到MSP430上,主要是不懂 MSP程序编写的套路,不会搬了

UC8151C :
官网上 ESP32的例程:
  1. include"Ap_29demo.h"
  2. //IO settings
  3. int BUSY_Pin = A14;
  4. int RES_Pin = A15;
  5. int DC_Pin = A16;
  6. int CS_Pin = A17;
  7. int SCK_Pin = A18;
  8. int SDI_Pin = A19;
  9. #define EPD_W21_MOSI_0  digitalWrite(SDI_Pin,LOW)
  10. #define EPD_W21_MOSI_1  digitalWrite(SDI_Pin,HIGH)

  11. #define EPD_W21_CLK_0 digitalWrite(SCK_Pin,LOW)
  12. #define EPD_W21_CLK_1 digitalWrite(SCK_Pin,HIGH)

  13. #define EPD_W21_CS_0 digitalWrite(CS_Pin,LOW)
  14. #define EPD_W21_CS_1 digitalWrite(CS_Pin,HIGH)

  15. #define EPD_W21_DC_0  digitalWrite(DC_Pin,LOW)
  16. #define EPD_W21_DC_1  digitalWrite(DC_Pin,HIGH)
  17. #define EPD_W21_RST_0 digitalWrite(RES_Pin,LOW)
  18. #define EPD_W21_RST_1 digitalWrite(RES_Pin,HIGH)
  19. #define isEPD_W21_BUSY digitalRead(BUSY_Pin)
  20. ////////FUNCTION//////
  21. void driver_delay_us(unsigned int xus);
  22. void driver_delay_xms(unsigned long xms);
  23. void DELAY_S(unsigned int delaytime);     
  24. void SPI_Delay(unsigned char xrate);
  25. void SPI_Write(unsigned char value);
  26. void EPD_W21_WriteDATA(unsigned char command);
  27. void EPD_W21_WriteCMD(unsigned char command);
  28. //EPD
  29. void EPD_W21_Init(void);
  30. void EPD_init(void);
  31. void PIC_display1(void);
  32. void PIC_display2(void);
  33. void EPD_sleep(void);
  34. void EPD_refresh(void);
  35. void lcd_chkstatus(void);
  36. void PIC_display_Clean(void);
  37. unsigned char HRES,VRES_byte1,VRES_byte2;

  38. void setup() {
  39.    pinMode(BUSY_Pin, INPUT);
  40.    pinMode(RES_Pin, OUTPUT);  
  41.    pinMode(DC_Pin, OUTPUT);   
  42.    pinMode(CS_Pin, OUTPUT);   
  43.    pinMode(SCK_Pin, OUTPUT);   
  44.    pinMode(SDI_Pin, OUTPUT);   
  45. }
  46. //Tips//
  47. /*When the electronic paper is refreshed in full screen, the picture flicker is a normal phenomenon, and the main function is to clear the display afterimage in the previous picture.
  48.   When the local refresh is performed, the screen does not flash.*/
  49. /*When you need to transplant the driver, you only need to change the corresponding IO. The BUSY pin is the input mode and the others are the output mode. */




  50. void loop() {
  51.   while(1)
  52.   {
  53.     //PICTURE1
  54.     EPD_init(); //EPD init
  55.     PIC_display1();
  56.     EPD_refresh();//EPD_refresh   
  57.       EPD_sleep();//EPD_sleep
  58.     delay(3000);
  59.    
  60.     //PICTURE2
  61.      EPD_init(); //EPD init
  62.     PIC_display2();
  63.     EPD_refresh();//EPD_refresh   
  64.     EPD_sleep();//EPD_sleep,Sleep instruction is necessary, please do not delete!!!
  65.     delay(3000);
  66.    
  67.     //PICTURE Clean
  68.      EPD_init(); //EPD init
  69.     PIC_display_Clean();
  70.     EPD_refresh();//EPD_refresh   
  71.     EPD_sleep();//EPD_sleep,Sleep instruction is necessary, please do not delete!!!
  72.     while(1);

  73.   }
  74. }




  75. ///////////////////EXTERNAL FUNCTION////////////////////////////////////////////////////////////////////////
  76. /////////////////////delay//////////////////////////////////////
  77. void driver_delay_us(unsigned int xus)  //1us
  78. {
  79.   for(;xus>1;xus--);
  80. }
  81. void driver_delay_xms(unsigned long xms) //1ms
  82. {  
  83.     unsigned long i = 0 , j=0;

  84.     for(j=0;j<xms;j++)
  85.   {
  86.         for(i=0; i<256; i++);
  87.     }
  88. }
  89. void DELAY_S(unsigned int delaytime)     
  90. {
  91.   int i,j,k;
  92.   for(i=0;i<delaytime;i++)
  93.   {
  94.     for(j=0;j<4000;j++)           
  95.     {
  96.       for(k=0;k<222;k++);
  97.                
  98.     }
  99.   }
  100. }
  101. //////////////////////SPI///////////////////////////////////
  102. void SPI_Delay(unsigned char xrate)
  103. {
  104.   unsigned char i;
  105.   while(xrate)
  106.   {
  107.     for(i=0;i<2;i++);
  108.     xrate--;
  109.   }
  110. }


  111. void SPI_Write(unsigned char value)                                    
  112. {                                                           
  113.     unsigned char i;  
  114.    SPI_Delay(1);
  115.     for(i=0; i<8; i++)   
  116.     {
  117.         EPD_W21_CLK_0;
  118.        SPI_Delay(1);
  119.        if(value & 0x80)
  120.           EPD_W21_MOSI_1;
  121.         else
  122.           EPD_W21_MOSI_0;   
  123.         value = (value << 1);
  124.        SPI_Delay(1);
  125.        driver_delay_us(1);
  126.         EPD_W21_CLK_1;
  127.         SPI_Delay(1);
  128.     }
  129. }

  130. void EPD_W21_WriteCMD(unsigned char command)
  131. {
  132.   SPI_Delay(1);
  133.   EPD_W21_CS_0;                  
  134.   EPD_W21_DC_0;   // command write
  135.   SPI_Write(command);
  136.   EPD_W21_CS_1;
  137. }
  138. void EPD_W21_WriteDATA(unsigned char command)
  139. {
  140.   SPI_Delay(1);
  141.   EPD_W21_CS_0;                  
  142.   EPD_W21_DC_1;   // command write
  143.   SPI_Write(command);
  144.   EPD_W21_CS_1;
  145. }



  146. /////////////////EPD settings Functions/////////////////////
  147. void EPD_W21_Init(void)
  148. {
  149.   EPD_W21_RST_0;    // Module reset
  150.   delay(100); //At least 10ms
  151.   EPD_W21_RST_1;
  152.   delay(100);  
  153. }
  154. void EPD_init(void)
  155. {
  156.     HRES=0x68;            //104
  157.     VRES_byte1=0x00;      //212
  158.     VRES_byte2=0xd4;
  159.   
  160.     EPD_W21_Init(); //Electronic paper IC reset
  161.   
  162.     EPD_W21_WriteCMD(0x06);         //boost soft start
  163.     EPD_W21_WriteDATA (0x17);   //A
  164.     EPD_W21_WriteDATA (0x17);   //B
  165.     EPD_W21_WriteDATA (0x17);   //C      

  166.     EPD_W21_WriteCMD(0x04);  //Power on
  167.     lcd_chkstatus();        //waiting for the electronic paper IC to release the idle signal

  168.     EPD_W21_WriteCMD(0x00);     //panel setting
  169.     EPD_W21_WriteDATA(0x1f);    //LUT from OTP
  170.     EPD_W21_WriteDATA(0x0d);    //VCOM to 0V
  171.   
  172.     EPD_W21_WriteCMD(0x61);     //resolution setting
  173.     EPD_W21_WriteDATA (HRES);         
  174.     EPD_W21_WriteDATA (VRES_byte1);   
  175.     EPD_W21_WriteDATA (VRES_byte2);

  176.     EPD_W21_WriteCMD(0X50);     //VCOM AND DATA INTERVAL SETTING      
  177.     EPD_W21_WriteDATA(0x97);    //WBmode:VBDF 17|D7 VBDW 97 VBDB 57   WBRmode:VBDF F7 VBDW 77 VBDB 37  VBDR B7

  178. }
  179. void EPD_refresh(void)
  180. {
  181.     EPD_W21_WriteCMD(0x12);     //DISPLAY REFRESH   
  182.     driver_delay_xms(100);          //!!!The delay here is necessary, 200uS at least!!!     
  183.     lcd_chkstatus();
  184. }
  185. void EPD_sleep(void)
  186. {
  187.     EPD_W21_WriteCMD(0X50);  //VCOM AND DATA INTERVAL SETTING  
  188.     EPD_W21_WriteDATA(0xf7);
  189.       
  190.     EPD_W21_WriteCMD(0X02);   //power off
  191.     lcd_chkstatus();
  192.     EPD_W21_WriteCMD(0X07);   //deep sleep
  193.     EPD_W21_WriteDATA(0xA5);
  194. }


  195. void PIC_display1(void)
  196. {
  197.     unsigned int i;
  198.     EPD_W21_WriteCMD(0x10);        //Transfer old data
  199.     for(i=0;i<2756;i++)      
  200.     EPD_W21_WriteDATA(0xff);
  201.   
  202.     EPD_W21_WriteCMD(0x13);        //Transfer new data
  203.     for(i=0;i<2756;i++)      
  204.      EPD_W21_WriteDATA(pgm_read_byte(&gImage_1[i]));

  205. }
  206. void PIC_display2(void)
  207. {
  208.     unsigned int i;
  209.     EPD_W21_WriteCMD(0x10);        //Transfer old data
  210.     for(i=0;i<2756;i++)      
  211.     EPD_W21_WriteDATA(0xff);
  212.   
  213.     EPD_W21_WriteCMD(0x13);        //Transfer new data
  214.     for(i=0;i<2756;i++)      
  215.      EPD_W21_WriteDATA(pgm_read_byte(&gImage_2[i]));

  216. }
  217. void PIC_display_Clean(void)
  218. {
  219.     unsigned int i;
  220.     EPD_W21_WriteCMD(0x10);        //Transfer old data
  221.     for(i=0;i<2756;i++)      
  222.   {
  223.     EPD_W21_WriteDATA(0xff);
  224.   }
  225.   
  226.     EPD_W21_WriteCMD(0x13);        //Transfer new data
  227.     for(i=0;i<2756;i++)      
  228.   {
  229.     EPD_W21_WriteDATA(0xff);
  230.   }
  231. }
  232. void lcd_chkstatus(void)
  233. {
  234.   unsigned char busy;
  235.   do
  236.   {
  237.     EPD_W21_WriteCMD(0x71);
  238.     busy = isEPD_W21_BUSY;
  239.     busy =!(busy & 0x01);        
  240.   }
  241.   while(busy);   
  242.   driver_delay_xms(200);                       
  243. }
复制代码


回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-19 18:54 , Processed in 0.218400 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表