mini2440通过u | 您所在的位置:网站首页 › usb跳线 › mini2440通过u |
目录 1.事情起因 2.探索过程 3.准备条件 4.u-boot源码修改 4.1将norflash的地址修改到bank1 4.2小插曲 4.3修改S29AL016J70TFI02扇区擦除代码(可选) 4.4修改S29AL016J70TFI02的sector/block定义(可选) 4.5修改flash初始化函数,更改扇区大小分配参数(可选) 5.编译,norflash启动通过supervivi的v选项烧录U-Boot到nandflash 6.硬件操作 7.U-boot操作烧写过程 真他🐱的秀啊 1.事情起因友善官方开发的bootloader有两种-supervivi和superboot,两者均在出厂时被烧写到Mini2440的norflash中。但是,根据时间不同,不同板子烧写的bootloader不一样,其中superboot是较新版的bootloader,支持win10,而supervivi对应的上位机DNW已不支持win10,而且网传的最新上位机SuperVivi-Transfer-Tool虽然支持win10并且可用,但存在一些bug,比如我在跑裸机代码时1kB以下的bin文件就烧不进去,提示文件过大。 于是我决定更新mini2440的bootloader。网上的方法均是使用JTAG调试器,但考虑到Jlink的价格,即便是便宜点的openJTAG也要几十块,考虑到后续调试器使用频率较低,所以没打算买专用调试器,打算捣鼓折腾一下。 2.探索过程1.首先我想到supervivi能不能自己烧录norflash或者升级,结果找了半天也没找到,而且古老的vivi也没有资料,于是放弃,这点吐槽一下,比不过U-Boot。 2.DIY JTAG调试器,我手头上有几个STM32开发板,github上有人用STM32实现了CMSIS-DAP和DAP-Link,并且引出了JTAG调试接口,CMSIS-DAP配合openocd号称可以实现几乎所有芯片的烧写,一番折腾下来,发现确实能识别芯片,并且里面有mini2440的配置文件,但只能烧到nandflash,而且折腾了半天也没搞出来,估计需要改一些配置,但考虑到openocd门槛有点高,就放弃了。 2.使用系统总线烧写,mini2440引出了系统总线,当时想着手上有一块探索者STM32F4,想想能不能通过总线外接的方式通过STM32F4直接烧写norflash,后面发现我想多了。 看上图,norflash的引脚中,地址总线只引出了LADDR0~LADDR6+ LADDR24,而且nGCS0也没引出来,所以这个方案不可行,这里再吐槽一下板子的设计者。 3.用U-boot更新norflash,目前网上有这种操作,但都是先将U-boot烧录到norflash启动(搞个鬼),不过我发现S3C2440的地址分配特性决定的,如下 这意味着如果我将U-Boot从nand启动那无法访问bank0的norflash。 不过并非完全不可行,U-boot中其实是支持了norflash的读写和擦除指令的,如果能把norflash接到bank1,那不就完事了,最简单的方法就是把nGCS0和nGCS1连起来。 不过这里有个遗憾,他喵的nGCS0居然没引出来,这下就不能用杜邦线直插连接了,需要从芯片上的引脚引出线来,方案3得到了成功,具体见下文。 3.准备条件mini2440(norflash里面有Bootloader),USB转232(转TTL也行),杜邦线,芯片探针(若条件实在受限可找个兄弟拿杜邦线抵着引脚上),串口调试工具(比如SecureCRT) 4.u-boot源码修改源码取自Mini2440配套光盘,【申嵌视频】-S7或者【申嵌视频】-S3,FriendlyARM-2440-DVD里面也有源码不过尚未移植,这里使用他们移植好了的源码,tekkamanninja也可用不过我没有测试。 4.1将norflash的地址修改到bank1修改此处,将norflash的地址修改到bank1(0x08000000) 修改的参考如下图(摘自S3C2440芯片手册) 其实就是把flash改到了bank1所在的地址 4.2小插曲光盘里U-boot源码内norflash的擦除实现是有问题的,我一开始没发现,下面的测试过程中,测试通过后没有擦除直接就开写了,结果把norflash的0地址的1字节数据给改了,推测norflash只能从1写到0,偏偏改了1字节后提示没有擦除,然后执行擦除指令卡死。这时候有点慌,认为u-boot擦除的实现有问题,决定先看看supervivi有没有影响,结果因为0地址的1个字节数据给改了,supervivi挂了,不过好在U-boot能写Nandflash,可以实现自刷写,不然就变砖了。 4.3修改S29AL016J70TFI02扇区擦除代码(可选)对norflash芯片为S29AL016J70TFI02的,经测试读和写均可行,擦除不行,还需要继续修改。 参看S29AL016J70TFI02数据手册,擦除时序如下 源码中对应如下: 注意最后那个CMD_ERASE_CONFIRM,将该宏定义改为0x30,也不知道为什么之前是0x50 4.4修改S29AL016J70TFI02的sector/block定义(可选)从S29AL016J70TFI02的数据手册中 从上图可以看到:共35个Sector,前4个Sector的大小分别为16KB,8KB,8KB,32KB,后31个扇区的大小都是64K,加起来总共2Mbyte,修改扇区参数如下: 将上面的CONFIG_SYS_MAX_FLASH_SECT改为35 4.5修改flash初始化函数,更改扇区大小分配参数(可选)根据上一节的sector分布,源码修改如下 可以看到上面有现成的,去掉条件编译,把1601的代码用过来,去掉#else段的代码 (解释一下,这里实际修改的是:将#else段的代码删除,然后去掉#ifndef 1601和#endif) 5.编译,norflash启动通过supervivi的v选项烧录U-Boot到nandflash略,也可以通过U-boot烧写自己到Nandflash,具体参看光盘里的手册 编译器是用光盘里面提供的gcc,非最新版本 6.硬件操作将norflash的CE引脚接到mini2440系统总线接口的nGCS1 使用探针将引脚连接(淘宝中这家店探针可支持0.3mm的引脚间距) 也可使用杜邦线(稳定性不保证),个人尝试过用cmp命令读取norflash,在用杜邦线抵住引脚的条件下可正常读取 该芯片间距约为0.5-0.2≈0.3mm,见下图
连接图如下 此处建议用万用表测量是否连接或者和旁边引脚短路 7.U-boot操作烧写过程Nandflash启动U-boot,串口输入任意字符进入控制台 首先查询flash信息,验证是否无误 flinfo 先下载supervivi-128M,验证串口下载和norflash读取是否正常 loadb 将下载的和norflash原来的内容进行对比 cmp.b 0x08000000 0x30008000 0x3cefc 留意下第三个长度参数是16进制,对比无误 容易发现supervivi大小只有249596字节≈243kB,连1M都没达到 先尝试将supervivi下载到norflash后1M的空间试试 从前面flinfo执行的结果可以看到,后面1M未处于保护状态,先擦除后1M区域 erase 08100000 +100000 将0x30008000开始的supervivi共249596字节写入到norflash的后1M开始的区域,注意用16进制 cp.b 0x30008000 0x08100000 0x3cefc 尝试对比看看是否烧录成功 使用crc32命令计算校验 crc32 0x08100000 0x3cefc PC端计算校验值 校验成功,但还需要考虑是否能擦除,此处建议执行擦除指令,因为教程光盘里给的code擦除指令死机!事后发现S29AL016J70TFI02型号的norflash问题 执行指令擦除 erase 08100000 +100000 检查擦除是否可行 md.b 0x08100000 100 这里看到擦除成功了,如果擦除失败那就停止继续操作,否则norflash的bootloader变砖,可以返回前面看看S29AL016J70TFI02代码那里是不是对SST39VF1602有用,因为我查到SST39VF1602的擦除时序如下 真巧啊!如果此处擦除卡死,参看下前面可选的源码修改部分 接下来准备烧录superboot到norflahs 0 地址处,实现bootload升级,谨慎操作!! 串口下载superboot loadb 校验一次(注意后面长度用16进制) crc32 0x30008000 0x40000 PC端superboot的校验值 OK,准备烧写,此处再警告一次,操作需谨慎!!! 取消norflash写保护并查看是否取消成功 protect off all flinfo 擦除并烧写superboot(最后警告) erase 0x08000000 +0x40000 cp.b 0x30008000 0x08000000 0x40000 校验一次 crc32 0x08000000 0x40000 烧写完毕,断开杜邦线,从norflash启动吧 经过一系列驱动安装之后,连接成功 真他🐱的秀啊 |
CopyRight 2018-2019 实验室设备网 版权所有 |