搜索
bottom↓
回复: 3

Ubuntu12.04下使用DNW下载程序 转载

[复制链接]

出0入0汤圆

发表于 2014-9-20 10:29:27 | 显示全部楼层 |阅读模式
Ubuntu12.04下使用DNW下载程序

    不知道为什么我的电脑在win7系统下不能使用DNW还有SuperVivi-Transfer-Tool-Complete等工具通过USB线下载程序到mini2440开发板上,实在憋屈,折腾了很久,所以无奈转战linux系统!上网找了一下在linux系统下可以使用minicom或者kermit代替win7下的secureCRT超级终端工具,也有相应的dnw工具可用。我选择的组合是minicom+dnw。
    安装配置minicom的方法请自行上网搜索,很简单的。重点是DNW,以下是它的源码包:dnw4linux源码包  


    下载好源码包之后,在ubuntu操作系统下进行如下步骤:
   1、解压源码包      
      tar xjvf dnw4linux.tar.bz2
      cd dnw4linux
      可以得到两个文件夹如下

    2、编译源码文件
      分别进入这app和driver两个目录执行make命令,将分别编译得到dnw和secbulk.ko这两个文件。
   
注:需要根据开发板的程序下载地址来修改如下源码的load address,mini2440的是0x30000000(SDRAM首地址),所以无需修改。


    3、如何实现dnw正常使用?
     首先,将编译得到的dnw可执行文件复制到/usr/sbin/目录下,使用命令sudo cp dnw /usr/sbin/。这样在任何目录下都可以使用dnw。
     其次,加载动态驱动模块secbulk.ko。使用命令sudo insmod ./secbulk.ko。插上USB下载线,使用如下命令可查看该模块加载情况。

    4、实现开机自添加
      由于secbulk.ko驱动模块文件是动态添加的,所以系统开启之后还是需要通过以上命令进行加载,十分不方便,故将其设置为开机自动添加。方法是在/etc/init.d/rc.local文件的最后加上”sudo insmod 文件路径/secbulk.ko“

注意:每次使用dnw下载时需要使用sudo,因为dnw会调用到上述驱动模块文件(在/dev/目录下可以找到文件secbulk0,为什么有它请阅读源码文件secbulk.c)

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2014-9-20 11:02:03 | 显示全部楼层
用过觉得还是没有windows方便,现在是在windows编辑,下载,虚拟机装这个linux编译或简单的修改,请教楼主ubuntu12.0.4下图形界面只是看源码,不能编辑,因没有root权限,每次都sudo + vi 在终端进行很郁闷,你有没有什么好办法?

出0入0汤圆

 楼主| 发表于 2014-9-20 17:37:29 | 显示全部楼层
xjjiang 发表于 2014-9-20 11:02
用过觉得还是没有windows方便,现在是在windows编辑,下载,虚拟机装这个linux编译或简单的修改,请教楼主u ...

直接sudo chmod -R 777 u-bootxxxxxx ,就不需要root权限了,我是用eclipse或者gedit,我是菜鸟不会用vi,编辑的,dnw可以修改一下,加入下载地址, 下载的时候直接输入: dnw filename address(hex前面不需要0x),(dnw u-boot.bin 3f80000)就是下载到0x3f80000

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>

const char* dev = "/dev/secbulk0";



unsigned long String2Hex(unsigned char *src)  
{  
  
unsigned int i;  
unsigned char tmp;
unsigned int result;
result=0;
i=0;
while(src!=0)
{
   if( src>='A' && src<='F' )  
            tmp = src - 'A' + 10;  
        else if( src>='0' && src<='9' )  
            tmp = src - '0';  
        else     if( src>='a' && src<='f' )  
            tmp = src - 'a' + 10;
        else
        {
        return result;
        }
result=result<<4;
result|=tmp;
    i++;
}   
   
return result;
      
  
     
}

int main(int argc, char* argv[])
{
unsigned int load_address;
        unsigned char* file_buffer = NULL;
        if( 3 != argc )        {
                printf("Usage: dwn <filename>\n");
                printf("请输入文件大小 \n");
                return 1;
        }
        load_address=String2Hex((unsigned char*)argv[2]);
        printf("下载地址:%x\n",load_address);
        int fd = open(argv[1], O_RDONLY);
        if(-1 == fd) {
                printf("Can not open file - %s\n", argv[1]);
                return 1;
        }

        struct stat file_stat;
        if( -1 == fstat(fd, &file_stat) ) {
                printf("Get file size filed!\n");
                return 1;
        }       
       
        file_buffer = (unsigned char*)malloc(file_stat.st_size+10);
        if(NULL == file_buffer) {
                printf("malloc failed!\n");
                goto error;
        }
        memset(file_buffer, '\0', sizeof(file_buffer));

        if( file_stat.st_size !=  read(fd, file_buffer+8, file_stat.st_size))        {
                printf("Read file failed!\n");
                goto error;
        }

        printf("file name : %s\n", argv[1]);
        printf("file size : %ld bytes\n", file_stat.st_size);

        int fd_dev = open(dev, O_WRONLY);
        if( -1 == fd_dev)        {
                printf("Can not open %s\n", dev);
                goto error;
        }
       
        *((unsigned long*)file_buffer) = load_address;         //load address
        *((unsigned long*)file_buffer+1) = file_stat.st_size+10;        //file size
        unsigned short sum = 0;
        int i;
        for(i=8; i<file_stat.st_size+8; i++)        {
                sum += file_buffer;
        }
       
        *((unsigned short*)(file_buffer+8+file_stat.st_size)) = sum;

        printf("Writing data...\n");
        size_t remain_size = file_stat.st_size+10;
        size_t block_size = 512;
//        size_t block_size = remain_size / 100;
        size_t writed = 0;
        while(remain_size > 0)        {
                size_t to_write = remain_size > block_size ? block_size:remain_size;
                size_t real_write = write(fd_dev, file_buffer+writed, to_write);
                if( to_write != real_write)        {
                        printf(" write  /dev/secbulk0 failed!  to_write = %u real_write = %u \n" , to_write ,real_write );
                        return 1;
                }
                remain_size -= to_write;
                writed += to_write;
                printf("\r %lu \t %u bytes !", writed*100/(file_stat.st_size+10),  writed);
                fflush(stdout);
               
        }       

        printf("OK\n");
        return 0;

error:
        if(-1 != fd_dev) {
                close(fd_dev);
        }
        if(fd != -1)  {
                close(fd);
        }
        if( NULL != file_buffer ) {
                free(file_buffer);
        }
        return -1;
}



出0入0汤圆

发表于 2014-9-20 17:46:59 | 显示全部楼层
liupeng08305 发表于 2014-9-20 17:37
直接sudo chmod -R 777 u-bootxxxxxx ,就不需要root权限了,我是用eclipse或者gedit,我是菜鸟不会用vi, ...

多谢大侠!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-10 07:38

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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