嵌入式爱好者

查看: 26838|回复: 3

OK6410烧写裸机程序到nandflash(修改)

[复制链接]

7

主题

160

帖子

242

积分

扫一扫,手机访问本帖
发表于 2014-7-19 10:32:26 | 显示全部楼层 |阅读模式
本帖最后由 ─╄OvЁ等待 于 2014-7-19 10:36 编辑

      初学嵌入式我是从裸机程序开始的,刚学的时候也怎么也不知道将裸机程序在开发板上面运行。网上其实有很多办法,但是我测试过都是在UBOOT的基础上用DNW或者jlink等工具拷贝到内存中去运行,重启开发板后就失效了,而且UBOOT会对开发板的运行环境初始化,这样的运行环境,和我们把程序烧写到nandflash里去运行是不一样的。如:uboot会对CPU时钟初始化,让cpu运行在532mhz下(或者其他的频率),而从nandflash运行程序我们一般都没有初始化CPU时钟,则CPU靠外部晶振提供时钟,我们的OK6410开发板的外部晶振是12Mhz(XTO,XTI引脚),差别之大则体现在运行速度上面。
      下面我们介绍怎么将我们写好的bin文件烧写到nandflash的前8KB中去,当开发板启动后,它会直接拷贝nandflash的前8K到sram中运行。

先上程序(该裸机程序自带汇编启动引导代码,可在nand flas起始0地址处运行)

c程序:
  1. //led.c 一个简单的循环点灯程序
  2. #define rGPMCON (*(volatile unsigned *)(0x7F008820))
  3. #define rGPMDAT (*(volatile unsigned *)(0x7F008824))
  4. #define rGPMPUD (*(volatile unsigned *)(0x7F008828))
  5. void msDelay(int time)
  6. {
  7.     volatile unsigned int i,j;
  8.     for(i = 0; i < 20000; i++)
  9.         for(j=0; j<time; j++);
  10. }
  11. void GPIO_Init(void)
  12. {
  13.     rGPMCON = 0x11111;
  14.     rGPMPUD = 0x00;
  15.     rGPMDAT = 0X1F;
  16. }
  17. void LedTest(void)
  18. {
  19.     volatile unsigned int i;
  20.     while (1)
  21.     {
  22.         for(i=0; i<4; i++)
  23.         {
  24.             rGPMDAT = ~(1<<i);
  25.             msDelay(10);
  26.         }
  27.     }
  28. }
  29. void main(void)
  30. {
  31.     GPIO_Init();
  32.     LedTest();
  33. }
复制代码
汇编程序:

  1. .globl _start
  2. _start:

  3. /*硬件相关设置*/
  4.     /* Peri port setup */
  5.     ldr r0, =0x70000000
  6.     orr r0, r0, #0x13
  7.     mcr p15,0,r0,c15,c2,4       @ 256M(0x70000000-0x7fffffff)
  8.      
  9. /*关看门狗*/
  10.     ldr r0, =0x7E004000
  11.     mov r1, #0
  12.     str r1, [r0]

  13.     /* 设置C程序运行的栈*/
  14.     ldr sp, =8*1024
  15.     bl main
  16. halt:
  17.     b halt
复制代码
Makefile:
  1. led.bin: start.o led.o
  2.     arm-linux-ld -Ttext 0 -o led.elf start.o led.o
  3.     arm-linux-objcopy -O binary led.elf led.bin
  4.     arm-linux-objdump -D led.elf > led.dis

  5. start.o : start.S
  6.     arm-linux-gcc -o start.o start.S -c -O2

  7. led.o : led.c
  8.     arm-linux-gcc -o led.o led.c -c -O2

  9. clean:
  10.     rm *.o led.elf led.bin led.dis
复制代码
若出现报错 led.o:(.ARM.exidx+0x0): undefined reference to `__aeabi_unwind_cpp_pr0'
可在Makefile中 arm-linux-gcc 后添加 -nostdlib 参数。

将上述3个文件放在Linux上面编译生成led.bin,然后将led.bin拷贝到windows目录下。
我们假设你的OK6410什么程序都没有(开机没有任何反应)。
我们将三个线连接到开发板上面:
1,开发板电源线
2,USB转串口线:一端连接电脑USB口,一端连接开发板。
3,USB device线:一端连接电脑USB口,一端连接开发板。(就是开发板上面的小USB口,dnw下载程序用,请根据飞凌的资料安装好驱动程序)

硬件连接完毕,现在介绍烧写步骤。

烧写原理:用Linux的UBOOT命令 nand 烧写程序到开发板。
1,通过SD_Writer.exe将mmc.bin烧写到SD 卡中 ,将开发板设置到SD卡启动。(具体方法参见飞凌开发板linux3.0.1用户手册.pdf)
2,将SD卡安装到开发板中并启动,快速敲空格键让开发板停留在uboot的启动画面,
3,输入dnw 50008000 下载你要烧写的程序,如图:
然后从dnw的usbport->Transmit->Transmit发送你要生成的led.bin文件。如下图
(可以换成uboot中 loadb 50008000 命令通过超级终端中kermit协议串口下载)
4,输入 nand erase 0 100000 擦除nandflash前1Mb空间。
5,输入 nand write.uboot 50008000 0 100000 将内存地址50008000中的1Mb数据写到nandflash的0~100000空间中。(即前1Mb中,uboot中输入的数据默认16进制)
6,将开发板设置到nandflash启动,并启动开发板,你就可以看到4盏LED灯在循环亮。

因水平有限,如果有什么错误请各位网友指出,我看到一定会更正。
---------------------------------------------------------------------------
还有一种方法是通过uboot启动引导裸机程序运行,就是开发板上本身带有uboot时,改变第4、5步骤,将裸机程序烧写到原来内核位置,具体方法如下:

4,输入 nand erase 200000 100000 擦除nandflash内核处1Mb空间。
5,输入 nand write.uboot 50008000 200000 100000 将内存地址50008000中的1Mb数据写到nandflash的200000空间中。(uboot中输入的数据默认16进制)

修改说明:由于OK6410采用的是每页4KB的nandflash,而CPU默认支持最大2KB每页的nandflash,而造成第一种方法烧写超过2KB,则方法失效,这是第二种方法,可以很好的兼容大的bin文件。(该方法适用于ok210,需修改烧写地址)



回复

使用道具 举报

0

主题

2

帖子

4

积分

发表于 2017-6-22 10:40:37 | 显示全部楼层
非常有道理
回复 支持 反对

使用道具 举报

5

主题

28

帖子

60

积分

发表于 2017-7-26 19:57:15 | 显示全部楼层
大神:你好!小弟刚刚好学到这步有一个疑问!你的led.bin的数据和下下来的数据比较有差别没的?即(用编译好的led.bin文件,你把通过dnw下载下来的数据在0x50008000地方,用wd.w 0x50008000 bin_size比较一下打印的数据看看是否和led.bin一致,这个是第一个地方,还有就是你烧写到nand的数据0x0 --0x100000,把他读取出来比较一下)。
回复 支持 反对

使用道具 举报

5

主题

28

帖子

60

积分

发表于 2017-7-26 22:50:28 | 显示全部楼层
led.bin好大?如果小了连sd卡都启动不了,删除了led,里面只放uboot。bin就可以启动
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|小黑屋| 飞凌嵌入式 ( 冀ICP备12004394号-1 )

GMT+8, 2024-12-22 19:09

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

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