arm平台裸机程序下载-linux下的dnw工具解决方案

前提:无论你使用的是哪一种类型的开发板,2410,、2440、210也好,首先在下载裸机程序之前应该先搞懂你的开发板启动方式是什么,外部内存地址是多少

下面是具体内容:

          在裸机程序的下载问题上,本人在刚学习的情况下遇到了很多问题,尝试了window下的dnw下载方式,sd卡烧录镜像文件的方式都失败了,最好都想放弃,买一个新的开发板,最后终于参考了网友用linux下的dnw解决了该问题,值得注意的一点是,本文的解决方案是需要保证你的开发需要从uboot启动。

1. dnw由两部分构成:USB驱动和下载工具,USB驱动便是secbulk文件夹,下载工具是DNW文件夹

    下载地址:http://files.cnblogs.com/lixiaoming90/dnw_linux.rar

     文件名:DnwLinux.rar

   

2.  安装dnw

     解压缩,之后会看到dnw_linux文件夹,进入该文件夹

     $ cd dnw_linux

     $ ls

     $ /dnw   /secbulk

 

     2.1  首先修改、编译和安装驱动

     进入secbulk文件夹,输入编译命令,编译成模块。(我自己修改了Makefile,因此大家只需make就可编译,make clean 就可清除编译。修改后的Makefile如下:

obj-m := secbulk.o
KDIR := /lib/modules/`uname -r`/build
PWD  := $(shell pwd)

default:
	$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
clean:
	$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) clean
	rm -rf *.order *.symvers

     在修改secbulk.c中代码,将0x5432改为0x04e8(不同的flash要在那个表单中加入一些设备相关的信息类似ID号,在程序加载的时候自动读取芯片内部ID和这个相比较,没有注册的设备是不会被系统支持的,可以通过lsusb获得idProduct和idVendor,需要在插上板子,并准备下载时此时设备连上时lsusb,0x04e8:0x1234),代码如下:

static struct usb_device_id secbulk_table[]= {
	{ USB_DEVICE(0x04e8, 0x1234)},
	{ }
};


    至此,代码修改完毕!

     $ make

     之后在文件夹中会有secbulk.ko模块文件,如下图所示:

    

     加载该模块到内核(注意:需要root权限)

     $ sudo insmod secbulk.ko    

      温馨技巧: 因为要用dnw的话,要确保secbulk驱动加载到内核,为了避免每次都要手动加载,因此修改/etc/init.d/rc.local文件(root权限),在后面加上下面一句:

     insmod /….你的secbulk.ko文件目录/secbulk.ko

     保存退出完事。


     加载后用dmesg命令可以看到模块已经成功加载
     [  238.007970] secbulk:secbulk loaded
     [  238.009101] usbcore: registered new interface driver secbulk

     常见问题: can not open /dev/secbulk0,  则表示该模块没有加载成功或者dnw没有root权限

     通过lsmod可以看看加载成功没。

     $ lsmod | grep secbulk

 

     2.2 编译和安装dnw

     进入dnw文件夹

    $ cd dnw

     修改dnw.c,找到如下代码处:

   printf("Writing data...\n");
   size_t remain_size = file_stat.st_size+10;

     在其前面加上下面两句:

/*****************************/
file_buffer [file_stat.st_size + 8] = sum & 0xff;
file_buffer [file_stat.st_size + 9] = sum >> 8;
/*****************************/

      代码修改完毕,像一般的程序一样编程为可执行性文件

    $ gcc –o dnw dnw.c

    可能会有一些警告,不过可以忽略。在dnw下生成dnw工具

    将dnw复制到/bin目录下,这样就可以在任意文件目录下调用dnw命令。

3. dnw运用

    我用dnw的主要目的是用来下载裸机程序,还有其他文件,根本没有Windows下的蓝屏现象,dnw的用法也很简单。

   3.1 打开两个终端,一个输入minicom命令,打开串口调试,当开发板加载uboot时按下PC上的空格键,使其停在下载模式,输入以下命令:

  SMDK6410# dnw  0x50008000

  此时终端打印以下信息,说明USB连接成功,就等待你下载传输了。情况如下:

   2

   3.2 在另外一个终端输入以下命令,下载文件:

   $ dnw /你要下载的文件路径/文件名

    下载过程和结果如下:

  

   到此为止,dnw的介绍结束,因为之前研究过Linux下的dnw使用,好长时间没用了,现在写此博文来记录,方便以后回顾,同时也希望给新手一个指导。

   我现在在用dnw来下载裸机程序,但是因为好久没用了,出现以前从来没有遇到过的问题:

  1. 首先是出现“can not open /dev/secbulk0”,后来想想原来是dnw时没有使用root权限,在后面又出现这个问题,我又重新编译了一次secbulk驱动,这个问题解决了。

  2. 这次是没有出现上面的问题了,但是新问题又出现了:在writing data…期间,写到10%的时候就出现failed!,我试好多次都是这个问题。现在正在解决中。。。情况如下:

  

    解决方法:修改secbulk.c的源码,打开源码之后注意其中的printf函数,就能找问题了,这里就不给予赘述了

  3.3 下载到NandFlash

   现在你的程序已经下载到内存当中了,如果你想在内存中运行你的程序,只需要输入下面一句命令即可:

   SMDK6410#  go 0x50008000      //是外部SRAM地址,视自己的开发板而定

   如果你想下载到NandFlash中(好处就是掉电了程序还是在NandFlash当中,而且比较原味,可以测试一下你写的启动代码)

  我的步骤如下:

    (1)首先制作烧写Uboot的SD卡,主要是为了利用uboot初始化外部SRAM,另外是为了能在uboot下载界面上输入dnw相关命令(不理解的话,看最后一行备注)

    (2)设置开发板为SD卡启动,启动后按PC上的空格键停在Uboot下载调试界面,下面的就跟上面的步骤一样,将程序通过USB烧写到内存中

    (3)将NandFlash中的0~1M的空间擦除,再把下到内存地址中的程序烧写到NandFlash的0~100000空间中(uboot中默认的是16进制)

              SMDK6410#  nand erase 0 100000

              SMDK6410#  nand write.e 0x50008000 0 100000

     (4)设置开发板为NandFlash启动即可。

注:本文是基于6410开发板的,所以下载的内存地址,要根据的你自己的开发板,内存地址在相应的用户手册是能找到的,例如210的外部SRAM起始地址为0x20000000

ps:另外有问题的欢迎加群讨论:485798873     加群请注意注明你的加群原因

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值