Linux系统中用DNW向ARM开发板下载程序

在Linux下通过dnw来给开发板发送程序。包括驱动程序代码:secbulk.c,应用程序代码:dnw.c。只能运行在32位系统上,在64位系统上提示错误:DNW download Data size is too big。

dnw源代码:

#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";

int main(int argc, char* argv[])
{
    unsigned char* file_buffer = NULL;

    long int addr  =  0;

    if( 3 != argc )    {
        printf("Usage: dwn <filename> address\n");
        return 1;
    }

    int fd = open(argv[1], O_RDONLY);
    if(-1 == fd) {
        printf("Can not open file - %s\n", argv[1]);
        return 1;
    }
    addr = strtol((char *) argv[2] ,NULL, 16);

    printf("addr = %lx \n", addr);

    // get file size
    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)); // bad code ! corrected by Qulory
    memset(file_buffer, ‘\0‘, sizeof(char)*(file_stat.st_size+10));

    // the first 8 bytes in the file_buffer is reserved, the last 2 bytes also;
    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);// off_t is long int 

    int fd_dev = open(dev, O_WRONLY);
    if( -1 == fd_dev)    {
        printf("Can not open %s\n", dev);
        goto error;
    }

    /*
     * Note: the first 4 bytes store the dest addr ;
     * the following 4 bytes store the file size ;
     * and the last 2 bytes store the sum of each bytes of the file ;
     */
    *((unsigned long*)file_buffer) = addr;     //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[i];
    }

    *((unsigned short*)(file_buffer+8+file_stat.st_size)) = sum;

    printf("Start Sending data...\n");
    size_t remain_size = file_stat.st_size+10;
    size_t block_size = 512;
    size_t written = 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+written, to_write);
        if( to_write != real_write)    {
            printf(" write  /dev/secbulk0 failed!");
            return 1;
        }
        remain_size -= to_write;
        written += to_write;
        printf("\rSent %lu%% \t %lu bytes !", written*100/(file_stat.st_size+10),  written);
        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;
}

secbulk.c源代码:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/usb.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/slab.h>

#define BULKOUT_BUFFER_SIZE 512
char *bulkout_buffer;
struct usb_device *udev;
__u8 bulk_out_endaddr;

static struct usb_device_id dnw_id_table [] = {
    { USB_DEVICE(0x5345, 0x1234) },
    { }
};

static int dnw_open(struct inode* inode, struct file *file)
{
     bulkout_buffer = kmalloc(BULKOUT_BUFFER_SIZE,GFP_KERNEL);
     return 0;
}

static int dnw_release (struct inode* inode, struct file *file)
{
    kfree(bulkout_buffer);
    return 0;
}

static ssize_t dnw_write(struct file *file, const char __user *buf, size_t len, loff_t *pos)
{
    size_t to_write;
    size_t total_write = 0;
    size_t act_len;

    while(len>0)
    {
        to_write = min(len,(size_t)BULKOUT_BUFFER_SIZE);

    copy_from_user(bulkout_buffer,buf+total_write,to_write);

    usb_bulk_msg(udev,usb_sndbulkpipe(udev,bulk_out_endaddr),bulkout_buffer,to_write,&act_len,3*HZ);

    len -= to_write;
    total_write += to_write;
    }

    return total_write;
}

static struct file_operations dnw_ops =
{
    .owner =    THIS_MODULE,
    .write =    dnw_write,
    .open =        dnw_open,
    .release =    dnw_release,
};

static struct usb_class_driver dnw_class = {
    .name =        "secbulk%d",
    .fops =        &dnw_ops,
    .minor_base =    100,
};

static int dnw_probe(struct usb_interface *intf, const struct usb_device_id *id)
{
    /* ?ó?úéè???èê? */
    struct usb_host_interface *interface;
    struct usb_endpoint_descriptor *endpoint;
    int i;

    interface = intf->cur_altsetting;

    for(i=0;i<interface->desc.bNumEndpoints;i++)
    {
        endpoint = &interface->endpoint[i].desc;
        if(usb_endpoint_is_bulk_out(endpoint))
        {
            bulk_out_endaddr =     endpoint->bEndpointAddress;
            break;
        }

    }

    usb_register_dev(intf,&dnw_class);

    udev = usb_get_dev(interface_to_usbdev(intf));

}

static void dnw_disconnect(struct usb_interface *intf)
{
    usb_deregister_dev(intf,&dnw_class);
}

struct usb_driver dnw_driver = {
    .name        = "dnw",   /* ?y?ˉ?? */
    .probe        = dnw_probe, /* 2???oˉêy */
    .disconnect    = dnw_disconnect, /* D???oˉêy */
    .id_table    = dnw_id_table, /* éè±?áD±í */
};

int dnw_init( void )
{
    usb_register( &dnw_driver );
    return 0;
}

void dnw_exit( void )
{
    usb_deregister(&dnw_driver);
}

module_init(dnw_init);
module_exit(dnw_exit);
MODULE_LICENSE("GPL");

Makefile代码:

obj-m := secbulk.o

KDIR := /lib/modules/`uname -r`/build
PWD := $(shell pwd)

all:
    make -C $(KDIR) M=$(PWD) modules

clean:
    rm *.o* *.s* *.ko* *.mod.* *.k*
时间: 2024-10-27 00:44:06

Linux系统中用DNW向ARM开发板下载程序的相关文章

通过TFTP服务器,往开发板下载程序

主要内容: (1):设置开发板的网络配置 (2)打开window下的tftp终端软件(即启动window下的fttp服务) (3)在u-boot下输入下载命令进行下载 进行下载 具体步骤 一.设置开发板的网络配置 根据把开发板的IP地址设置为跟 window的同一个网段下的地址后,接网线(最好将开发板接在路由器上),然后在u-boot下ping   window(因为在windows下ping开发板,开发板时不回复的) 我们可以看到  host 192.168.1.102 is alive  即

linux嵌入式开发新方法:阿里云+arm开发板

我们学习arm-linux开发常常需要在自己的电脑上安装虚拟机,虚拟机运行linux操作系统,对于一些没有或者不能安装虚拟机的电脑就不能进行arm-linux开发. 但现在我介绍一种新的方法,使用阿里云计算. 准备: 1.阿里云Linux操作系统 2.arm 开发板 3.window上需要的软件:putty.tftp. 步骤: 1.申请阿里云计算服务器,我选的ubuntu,1核,512内存,100M宽带(流量计费方式). 2.配置linux的nfs服务,创建根目录下forlinux文件夹为NFS

嵌入式开发板丨ARM开发板 学习必备资料- 迅为电子

摘要: ARM开发板 迅为三星Exynos嵌入式开发平台超强GPS模块 iTOP-Exynos4412开发板采用 Exynos4412的主芯片,具有更高的主频和更丰富外设,配置 2GB 双通道 DDR3的内存及 16GB 存储,具有稳定性强.可靠性高,能适用于对性能和处理能力有更高要求的嵌入式系统应用场合. iTOP-Exynos4412开发板内置有无线 WIFI 模块.Bluetooth.GPS.Camera.3G等模组,支持 HDMI1.4(1080P/60Hz)显示,客户可以直接从开发平台

arm 开发板模拟器

现在有的工控嵌入式,跑的都是 x86 的架构,arm 有的还用着不放心.大型主机,也是 x86 和 power 架构的. arm 只有小型设备或者低功耗方向才需要. 其实,基础知识最重要. arm 开发板是用来干活的,学习在没有真的去针对 arm 的时候,你买 arm 开发板只能用来玩,比如自己弄个触摸屏外加硬盘,装进一个盒子.当初去玩时候的 MP4 机.或者做个 arm 架构的 BT 专用机.简单的入门学习,找个模拟器就行了. 如果非要找开发板,建议弄个龙芯的开发板,万一你混一个高级龙芯系统开

迅为震撼推出iTOP-4412精英版|Cortex-A9开发板|ARM开发板|嵌入式开发板

最强四核Cortex-A9开发板迅为iTOP-4412精英版震撼推出,仅售560元 业内公认最强四核 藐视一切挑战 ●四核CPU  ●四核GPU  ●双通道内存  ●HKMG技术  ●超级性能  ●至佳稳定  ●供货周期长 Exynos 4412处理器成功应用于三星GALAXY S3,联想K860,魅族MX2等热门产品当中,并取得巨大成功.出色的功耗控制以及超强的性能一直为业内称道, 超过5000万片的出货量,足以证明其稳定性与可用性.已成为三星官方重点推广的处理器之一,并承诺长期供货. 超强的

ARM开发板挂载U盘

ARM开发板运行Linux系统后,插入U盘,通过串口打印系统识别到U盘如下: 系统识别U盘盘符为sda4 那么需要挂载后才能操作U盘:挂载命令 mount -t vfat /dev/sda4 /mnt 如下: [email protected]:~# mount -t vfat /dev/sda4 /mnt 查看是否挂载成功命令:df -h [email protected]:~# df -h 如下看到mnt目录挂载成功: 可以看到/mnt 目录已成功挂载.

使用arm开发板搭建无线mesh网络(一)

由于项目的需要,老板让我使用arm开发板(友善之臂的tiny6410)搭建无线mesh网络.一般而言,无线自组织网络的网络设备都是由用户的终端设备来充当,这些终端设备既要处理用户的应用数据,比如娱乐,办公等各方面数据,又要充当路由器,来进行路由转发:另一方面,这些用户终端设备的移动性也较强.对于前者,终端设备的绝大多数软硬件资源都花费在了用户的应用数据处理上了,留给网络转发使用的资源所剩无几,因此这些终端设备一般无法胜任大规模的网络拓扑结构.大数据量(比如音.视频多媒体数据)转发的这些任务:对于

Ubuntu16.04NFS配置与ARM开发板互传文件_挂载和卸载

第一步:安装NFS服务 sudo apt-get install nfs-kernel-server portmap 第二步:增加NFS配置文件 sudo vim /etc/exports 在vim终端中添加如下信息: /home/china/nfsroot *(rw,sync,no_root_squash) 上面的路径解释如下图,其中nfsroot文件夹为NFS服务所用的共享文件夹 第三步:重启NFS服务 sudo /etc/init.d/nfs-kernel-server restart 每

【转帖】Linux系统上面qemu 模拟arm

零基础在Linux系统搭建Qemu模拟arm https://blog.csdn.net/weixin_42489042/article/details/81145038 自己没搞定 改天再试试 感谢原作者. 由于最近的一个项目,需要用到qemu模拟arm系统跑程序,所以做了一次搭建,在网上找到了两篇文章,写得都很详细,其中一篇文章是对另外一篇文章进行的修改和添加,但是基于自己系统去做,还是发现了最新修改的文章过程中的一些错漏,加之想记录下此次自己的搭建,所以写下这篇博客. 参考博客文章(1):