主题 : mini2440 的 BIOS  烧写 image 的地址疑惑 复制链接 | 浏览器收藏 | 打印
级别: 侠客
UID: 7351
精华: 1
发帖: 58
金钱: 455 两
威望: 324 点
综合积分: 136 分
注册时间: 2009-07-11
最后登录: 2014-10-17
楼主  发表于: 2014-10-06 22:26

 mini2440 的 BIOS  烧写 image 的地址疑惑

复制代码
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <malloc.h>
  5. #include <errno.h>
  6. #include <sys/types.h>
  7. #include <sys/stat.h>
  8. #include <sys/time.h>
  9. #include <unistd.h>
  10. #include <fcntl.h>
  11. #include <stdint.h>
  12. const char* dev = "/dev/secbulk0";
  13. #define BLOCK_SIZE    (1*1024*1024)
  14. struct download_buffer {
  15.     uint32_t    load_addr;  /* load address */
  16.     uint32_t    size; /* data size */
  17.     uint8_t        data[0];
  18.     /* uint16_t checksum; */
  19. };
  20. static int _download_buffer(struct download_buffer *buf)
  21. {
  22.     int fd_dev = open(dev, O_WRONLY);
  23.     if( -1 == fd_dev) {
  24.         printf("Can not open %s: %s\n", dev, strerror(errno));
  25.         return -1;
  26.     }
  27.     printf("Writing data...\n");
  28.     size_t remain_size = buf->size;
  29.     size_t block_size = BLOCK_SIZE;
  30.     size_t writed = 0;
  31.     while(remain_size>0) {
  32.         size_t to_write = remain_size > block_size ? block_size : remain_size;
  33.         if( to_write != write(fd_dev, (unsigned char*)buf + writed, to_write)) {
  34.             perror("write failed");
  35.             close(fd_dev);
  36.             return -1;
  37.         }
  38.         remain_size -= to_write;
  39.         writed += to_write;
  40.         printf("\r%02zu%%\t0x%08zX bytes (%zu K)",
  41.             (size_t)((uint64_t)writed*100/(buf->size)),
  42.             writed,
  43.             writed/1024);
  44.         fflush(stdout);
  45.     }
  46.     printf("\n");
  47.     close(fd_dev);
  48.     return 0;
  49. }
  50. static inline void cal_and_set_checksum(struct download_buffer *buf)
  51. {
  52.     uint16_t sum = 0;
  53.     int i;
  54.     for(i = 0; i < buf->size; i++) {
  55.         sum += buf->data[i];
  56.     }
  57.     *((uint16_t*)(&((uint8_t*)buf)[buf->size - 2])) = sum;
  58. }
  59. static struct download_buffer* alloc_buffer(size_t data_size)
  60. {
  61.     struct download_buffer    *buffer = NULL;
  62.     size_t total_size = data_size + sizeof(struct download_buffer) + 2;
  63.     buffer = (typeof(buffer))malloc(total_size);
  64.     if(NULL == buffer)
  65.         return NULL;
  66.     buffer->size = total_size;
  67.     return buffer;
  68. }
  69. static void free_buffer(struct download_buffer *buf)
  70. {
  71.     free(buf);
  72. }
  73. static struct download_buffer *load_file(const char *path, unsigned long load_addr)
  74. {
  75.     struct stat        file_stat;
  76.     struct download_buffer    *buffer = NULL;
  77.     unsigned long        total_size;
  78.     int            fd;
  79.     fd = open(path, O_RDONLY);
  80.     if(-1 == fd) {
  81.         printf("Can not open file %s: %s\n", path, strerror(errno));
  82.         return NULL;
  83.     }
  84.     if( -1 == fstat(fd, &file_stat) ) {
  85.         perror("Get file size filed!\n");
  86.         goto error;
  87.     }    
  88.     buffer = alloc_buffer(file_stat.st_size);
  89.     if(NULL == buffer) {
  90.         perror("malloc failed!\n");
  91.         goto error;
  92.     }
  93.     if( file_stat.st_size !=  read(fd, buffer->data, file_stat.st_size)) {
  94.         perror("Read file failed!\n");
  95.         goto error;
  96.     }
  97.     buffer->load_addr = load_addr;
  98.     cal_and_set_checksum(buffer);
  99.     return buffer;
  100. error:
  101.     if(fd != -1)
  102.         close(fd);
  103.     if( NULL != buffer )
  104.         free(buffer);
  105.     return NULL;
  106. }
  107. static int download_file(const char *path, unsigned long load_addr)
  108. {
  109.     struct download_buffer *buffer;
  110.     struct timeval __start, __end;
  111.     long __time_val = 0;
  112.     float speed = 0.0;
  113.     buffer = load_file(path, load_addr);
  114.     gettimeofday(&__start,NULL);
  115.     if (buffer != NULL) {
  116.         if (_download_buffer(buffer) == 0) {
  117.             gettimeofday(&__end,NULL);
  118.             __time_val = (long)(__end.tv_usec - __start.tv_usec)/1000 + \
  119.                 (long)(__end.tv_sec - __start.tv_sec) * 1000;
  120.             speed = (float)buffer->size/__time_val/(1024*1024) * 1000;
  121.             printf("speed: %fM/S\n",speed);
  122.             free_buffer(buffer);
  123.         } else {
  124.             free_buffer(buffer);
  125.             return -1;
  126.         }
  127.     } else
  128.         return -1;
  129. }
  130. int main(int argc, char* argv[])
  131. {
  132.     unsigned load_addr = 0x57e00000;
  133.     char* path = NULL;
  134.     int    c;
  135.     while ((c = getopt (argc, argv, "a:h")) != EOF)
  136.     switch (c) {
  137.     case 'a':
  138.         load_addr = strtol(optarg, NULL, 16);
  139.         continue;
  140.     case '?':
  141.     case 'h':
  142.     default:
  143. usage:
  144.         printf("Usage: dwn [-a load_addr] <filename>\n");
  145.         printf("Default load address: 0x57e00000\n");
  146.         return 1;
  147.     }
  148.     if (optind < argc)
  149.         path = argv[optind];
  150.     else
  151.         goto usage;
  152.     printf("load address: 0x%08X\n", load_addr);
  153.     if (download_file(path, load_addr) != 0) {
  154.         return -1;
  155.     }
  156.     return 0;
  157. }


在此菜单下:
(1) 先输入“x”格式化系统
(2) 然后再选择“v”开始下载 bootloader,可以选 vboot.bin,也可以选择
supervivi-128M
(3) 再选择“k”开始下载 android 内核:zImage
(4) 最后选择“y”开始下载 mini2440T35_android.img 文件系统文件


unsigned load_addr = 0x57e00000;  // 请问代码中这地址都是 0x57e00000 为什么能透过 mini2440 的 BIOS烧写 supervivi-128M ,  zImage , mini2440T35_android


supervivi-128M ,  zImage , mini2440T35_android  是烧到 nand flash 里面 ?? 那各自地址是多少?

谢谢
级别: 侠客
UID: 7351
精华: 1
发帖: 58
金钱: 455 两
威望: 324 点
综合积分: 136 分
注册时间: 2009-07-11
最后登录: 2014-10-17
1楼  发表于: 2014-10-11 05:18
push