ARM-Linux驱动移植--Linux下烧写工具DNW和USB驱动安装
主机平台:Gentoo Linux 11.2 with linux kernel 3.0.6
硬件平台:FL2440(S3C2440)with linux kernel 2.6.35
原创作品,转载请标明出处http://blog.csdn.net/yming0221/article/details/7211396
1、首先下载DNW for linux http://download.csdn.net/source/1011140
2、解压文件
3、编译主机的USB驱动
[cpp] view plaincopyprint?- 01.make -C /lib/modules/`uname -r`/build M=`pwd` modules
复制代码 然后insmod安装驱动并dmesg查看如下
4、修改dnw.c文件并编译
由于FL2440烧写内核需要设置初始地址为0x30800000,修改后文件如下
[cpp] view plaincopyprint?- 01.#include <stdio.h>
- 02.#include <stdlib.h>
- 03.#include <malloc.h>
- 04.#include <sys/types.h>
- 05.#include <sys/stat.h>
- 06.#include <unistd.h>
- 07.#include <fcntl.h>
- 08.
- 09.const char* dev = "/dev/secbulk0";
- 10.
- 11.
- 12.int main(int argc, char* argv[])
- 13.{
- 14. unsigned char* file_buffer = NULL;
- 15. if( 2 != argc )
- 16. {
- 17. printf("Usage: dwn <filename>\n");
- 18. return 1;
- 19. }
- 20.
- 21. int fd = open(argv[1], O_RDONLY);
- 22. if(-1 == fd)
- 23. {
- 24. printf("Can not open file - %s\n", argv[1]);
- 25. return 1;
- 26. }
- 27.
- 28. struct stat file_stat;
- 29. if( -1 == fstat(fd, &file_stat) )
- 30. {
- 31. printf("Get file size filed!\n");
- 32. return 1;
- 33. }
- 34.
- 35. file_buffer = (char*)malloc(file_stat.st_size+10);
- 36. if(NULL == file_buffer)
- 37. {
- 38. printf("malloc failed!\n");
- 39. goto error;
- 40. }
- 41. if( file_stat.st_size != read(fd, file_buffer+8, file_stat.st_size))
- 42. {
- 43. printf("Read file failed!\n");
- 44. goto error;
- 45. }
- 46.
- 47. printf("file name : %s\n", argv[1]);
- 48. printf("file size : %d bytes\n", file_stat.st_size);
- 49.
- 50. int fd_dev = open(dev, O_WRONLY);
- 51. if( -1 == fd_dev)
- 52. {
- 53. printf("Can not open %s\n", dev);
- 54. goto error;
- 55. }
- 56.
- 57. *((unsigned long*)file_buffer) = 0x30800000; //load address
- 58. *((unsigned long*)file_buffer+1) = file_stat.st_size+10; //file size
- 59. unsigned short sum = 0;
- 60. int i;
- 61. for(i=8; i<file_stat.st_size+8; i++)
- 62. {
- 63. sum += file_buffer[i];
- 64. }
- 65.
- 66. printf("Writing data...\n");
- 67. size_t remain_size = file_stat.st_size+10;
- 68.// size_t block_size = remain_size / 100;
- 69. size_t block_size = 512;
- 70. size_t writed = 0;
- 71. while(remain_size>0)
- 72. {
- 73. size_t to_write = remain_size > block_size ? block_size:remain_size;
- 74. if( to_write != write(fd_dev, file_buffer+writed, to_write))
- 75. {
- 76. printf("failed!\n");
- 77. return 1;
- 78. }
- 79. remain_size -= to_write;
- 80. writed += to_write;
- 81. printf("\r%d%\t %d bytes ", writed*100/(file_stat.st_size+10), writed);
- 82. fflush(stdout);
- 83.
- 84. }
- 85.
- 86. printf("OK\n");
- 87. return 0;
- 88.
- 89.error:
- 90. if(-1!=fd_dev) close(fd_dev);
- 91. if(fd != -1) close(fd);
- 92. if( NULL!=file_buffer )
- 93. free(file_buffer);
- 94. return -1;
- 95.}
复制代码 最后烧写内核
|