资源简介
linux dnw完美支持s3c2440 s3c6410 等
代码片段和文件信息
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
const char* dev = “/dev/secbulk0“;
#define BLOCK_SIZE (1*1024*1024)
struct download_buffer {
uint32_t load_addr; /* load address */
uint32_t size; /* data size */
uint8_t data[0];
/* uint16_t checksum; */
};
static int _download_buffer(struct download_buffer *buf)
{
int fd_dev = open(dev O_WRONLY);
if( -1 == fd_dev) {
printf(“Can not open %s: %s\n“ dev strerror(errno));
return -1;
}
printf(“Writing data...\n“);
size_t remain_size = buf->size;
size_t block_size = BLOCK_SIZE;
size_t writed = 0;
while(remain_size>0) {
size_t to_write = remain_size > block_size ? block_size : remain_size;
if( to_write != write(fd_dev (unsigned char*)buf + writed to_write)) {
perror(“write failed“);
close(fd_dev);
return -1;
}
remain_size -= to_write;
writed += to_write;
printf(“\r%02zu%%\t0x%08zX bytes (%zu K)“
(size_t)((uint64_t)writed*100/(buf->size))
writed
writed/1024);
fflush(stdout);
}
printf(“\n“);
close(fd_dev);
return 0;
}
static inline void cal_and_set_checksum(struct download_buffer *buf)
{
uint16_t sum = 0;
int i;
for(i = 0; i < buf->size; i++) {
sum += buf->data[i];
}
*((uint16_t*)(&((uint8_t*)buf)[buf->size - 2])) = sum;
}
static struct download_buffer* alloc_buffer(size_t data_size)
{
struct download_buffer *buffer = NULL;
size_t total_size = data_size + sizeof(struct download_buffer) + 2;
buffer = (typeof(buffer))malloc(total_size);
if(NULL == buffer)
return NULL;
buffer->size = total_size;
return buffer;
}
static void free_buffer(struct download_buffer *buf)
{
free(buf);
}
static struct download_buffer *load_file(const char *path unsigned long load_addr)
{
struct stat file_stat;
struct download_buffer *buffer = NULL;
unsigned long total_size;
int fd;
fd = open(path O_RDONLY);
if(-1 == fd) {
printf(“Can not open file %s: %s\n“ path strerror(errno));
return NULL;
}
if( -1 == fstat(fd &file_stat) ) {
perror(“Get file size filed!\n“);
goto error;
}
buffer = alloc_buffer(file_stat.st_size);
if(NULL == buffer) {
perror(“malloc failed!\n“);
goto error;
}
if( file_stat.st_size != read(fd buffer->data file_stat.st_size)) {
perror(“Read file failed!\n“);
goto error;
}
buffer->load_addr = load_addr;
cal_and_set_checksum(buffer);
return buffer;
error:
if(fd != -1)
close(fd);
if( NULL != buffer )
free(buffer);
return NULL;
}
static int download_file(const char *path unsigned long load_addr)
{
struct download_buffer *buffer;
struct timeval __start __end;
long __time_val = 0;
float speed = 0.0;
buffer = load_file(path load_addr);
gettimeofday(&__startNULL);
if (buffer != NULL) {
if (_download_buffer(buffer) == 0) {
gettimeofday(&__endNULL);
__time_val = (long)(__end.tv_usec - __s
- 上一篇:Visio 流程图 模板
- 下一篇:pcm测试文件,用于音频测试,纯数据
相关资源
- uboot到linux logo显示不间断 补丁
- UNIX/LINUX编程实践教程的源码
- Linux任务管理器
- linux应用层的华容道游戏源代码
- ubuntu9.10 可加载内核模块和字符设备驱
- MP3文件ID3v2ID3v2APEv2标签读取
- 操作系统实验——虚存管理实验
- linux下的发包工具sendip
- 尚观培训linux许巍关于c 的笔记和讲义
- 尚观培训linux董亮老师关于数据结构的
- linux 线程池源码 c 版
- linux C 电梯程序练习
- linux下用多进程同步方法解决生产者
- Linux 操作系统实验(全)
- Linux From Scratch 中文手册
- linux 网络实验 ftp程序
- Linux命令大全离线版&在线版
- 操作系统共享内存实验
- dos 下运行Linux 命令--gnu_utils
- linux 0.12内核源代码
- linux简易shell C实现
- linux实验报告及心得体会
- 基于GTK的Linux环境下的简易任务管理器
- linux扫雷游戏代码
- CAN Linux驱动代码
- Linux系统教材
- intel 82579LM 网卡驱动Linux系统版 v1.9.
- SA1110处理器掌上电脑液晶显示器设计
- 基于Linux的串口服务器设计
- Windows下访问LINUX的利器-SSH
评论
共有 条评论