|
楼主 |
发表于 2014-9-20 17:37:29
|
显示全部楼层
直接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;
}
|
|