在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 Qulorymemset(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 sizeunsigned 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",   /* Çý¶¯Ãû */.probe        = dnw_probe, /* ²¶»ñº¯Êý */.disconnect    = dnw_disconnect, /* жÔغ¯Êý */.id_table    = dnw_id_table, /* É豞Áбí */
};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.oKDIR := /lib/modules/`uname -r`/build
PWD := $(shell pwd)all:make -C $(KDIR) M=$(PWD) modulesclean:rm *.o* *.s* *.ko* *.mod.* *.k*

转载于:https://www.cnblogs.com/ynxf/p/6260104.html

Linux系统中用DNW向ARM开发板下载程序相关推荐

  1. 如何使用ST-LINK/V2给stm32开发板下载程序

    使用ST-LINK/V2给32开发板下载程序 链接:https://pan.baidu.com/s/1y_3q4Gf_mwOTM4Y_7lhSUg 提取码:1hyi 这个下载不是传送hex文件 而是 ...

  2. SOC FPGA linux系统搭建(Terasic DE10-Nano开发板)

    Embeeding linux for Cyclone V SoC FPGAs(Terasic DE10-Nano) 本设计使用黄金硬件参考设计 (GHRD) 和添加自定义 IP 到开发 Linux ...

  3. 【Linux系统移植】NXP 官方开发板 kernel内核 编译与烧录

    1.下载 NXP 官方 I.MX6ULL EVK 开发板的kernel :linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2 2.使用 FileZilla Client ...

  4. 香橙派嵌入式arm开发板下载交叉编译工具链说明

    香橙派开发板以处理器分类,包含全志H2.全志H3.全志H5.全志H6等系列,下文以全志H3芯片的开发板为例,对交叉编译工具链的下载进行说明: 1) orangepi-build第一次运行的时候会自动下 ...

  5. arm linux内核调试,kgdb在ARM开发板上调试kernel成功

    大概几个注意点: 1.公版的Linux需要打kgdb补丁的,kgdb官方那边可能不支持新版本的内核(我的是2.6.18),可以在下面的网址找到,但是ARM上调试需要打哪些补丁,不是很清楚,网上的几篇中 ...

  6. arm开发板嵌入式 linux 修改开机启动logo,ARM开发板 嵌入式Linux 修改开机启动LOGO...

    1.嵌入式 Linux LOGO显示原理 嵌入式Linux是直接在FrameBuffer的基础上.直接显示一个ppm格式的图象.它 kernel/drivers/video/fbcon.c中的fbco ...

  7. windows、虚拟机和ARM开发板3者互ping

    嵌入式开发中常用的开发方式:windows上做实际开发,虚拟机上装Linux当服务器交叉编译程序, ARM开发板运行程序.通常三者连接时,会遇到各种问题,此文档就是从分析到实例解决该问题. 更多详情, ...

  8. 电脑向linux板卡传文件,ARM 开发板嵌入式linux系统与主机PC通过串口传输文件

    ARM 开发板嵌入式linux系统与主机PC通过串口传输文件 本来以为按以下两篇文章就可以几步轻松搞定这个问题,没想到遇到两个小麻烦: 1,我用的xp虚拟机下redhat9.0做主机,按照下面第一篇文 ...

  9. ARM开发板如何安装Linux系统

    转自:http://www.eepw.com.cn/article/201611/322612_2.htm 注意:本小节假定您已经连接好开发板的和PC机之间的串口和USB口,并把开发板设置为NORFl ...

最新文章

  1. SetAutoResizeMode
  2. 【Kali渗透全方位实战】Linux终端和基本Linux命令terminator
  3. 计算机二级2021辅导书,2021该如何准备计算机二级考试?
  4. Python-OpenCV 笔记6 -- 轮廓(Contours)
  5. /etc/rc.local——开机自启配置文件
  6. Exchange2010外部传输域的使用方法
  7. 关于Android studio找不到sqlite数据库的解决方法
  8. Java设计模式(8)组合模式(Composite模式)
  9. the jacobian matrix and the gradient matrix
  10. 東京タワー初めてphoto
  11. 树莓派4B之Windows XP系统安装游戏(二)
  12. 2021-07-26
  13. matlab标定 源码,MATLAB标定工具箱
  14. 中国撸串指北:13万家烧烤店的吃货最爱
  15. eve单机版mysql_eve单机版中文下载_eve单机版下载-游迅网
  16. EasyUi入门教程01
  17. XMind思维导图使用详解
  18. web前端开发零基础入门教程
  19. 适合讲给女朋友听的极品笑话
  20. Ubuntu升级软件和ubuntu升级系统的命令

热门文章

  1. python rest api client_Python py-jama-rest-client包_程序模块 - PyPI - Python中文网
  2. mysql查询语法错误_MySQL内部联接查询语法错误
  3. 系统学习机器学习之神经网络(九) --Hopfield网络
  4. 决策树(九)--极端随机森林及OpenCV源码分析
  5. js 中 的时间类和 setTimeout 和setInterval
  6. 什么叫侧面指纹识别_正面背面侧面 你手机的指纹识别长在哪?
  7. opencv4 图像特征匹配_openCV - 图像特征匹配
  8. 递归实现二分搜索(python)
  9. yarn 内存与CPU参数设置
  10. 什么是TLV存储格式以及为什么Protocol Buffer要比Json和XML传输时要快