Monday, March 12, 2012

Dnw for Ubuntu

Ашиглагдах зүйлс:
  1. Ubuntu 10.04
  2. OK6410 Сургалтын хавтан
  3. OTG USB холбогч
  4. Dnw4linux
  5. Minicom эсвэл өөр төрлийн сериал порттой харьцах програм.
DNW суулгах:
Энэ холбоосоор dnw4linux.zip файлыг татаж авна.

$ unzip dnw4linux.zip коммандаар задлана.

dnw хавтас дотор dnw.c файлыг дараах байдлаар өөрчилнө

dnw.c
  1. /* dnw2 linux main file. This depends on libusb.
  2. *
  3. * You should use lsusb to find out the actual vender ID & product ID of board.
  4. *
  5. * License:    GPL
  6. *
  7. */
  8.  

    1. #include 
    2. #include 
    3. #include 
    4. #include 
    5. #include 
    6. #include 
  9.  
  10. #define OK6410_VENDOR_ID        0x04e8
  11. #define OK6410_PRODUCT_ID       0x1234
  12.  
  13. #define OK6410_RAM_BASE         0x57e00000
  14.  
  15. #define RAM_BASE            OK6410_RAM_BASE
  16. #define VENDOR_ID           OK6410_VENDOR_ID
  17. #define PRODUCT_ID          OK6410_PRODUCT_ID
  18.  
  19. struct usb_dev_handle * open_port()
  20. {
  21.     struct usb_bus *busses, *bus;
  22.  
  23.     usb_init();
  24.     usb_find_busses();
  25.     usb_find_devices();
  26.  
  27.     busses = usb_get_busses();
  28.     for(bus=busses;bus;bus=bus->next)
  29.     {
  30.         struct usb_device *dev;
  31.         for(dev=bus->devices;dev;dev=dev->next)
  32.         {
  33.             if( VENDOR_ID==dev->descriptor.idVendor
  34.             &&  PRODUCT_ID==dev->descriptor.idProduct)
  35.             {
  36.                 printf("Target usb device found!\n");
  37.                 struct usb_dev_handle *hdev = usb_open(dev);
  38.                 if(!hdev)
  39.                 {
  40.                     perror("Cannot open device");   
  41.                 }
  42.                 else
  43.                 {
  44.                     if(0!=usb_claim_interface(hdev, 0))
  45.                     {
  46.                         perror("Cannot claim interface");
  47.                         usb_close(hdev);
  48.                         hdev = NULL;
  49.                     }
  50.                 }
  51.                 return hdev;
  52.             }
  53.         }
  54.     }
  55.  
  56.     printf("Target usb device not found!\n");
  57.  
  58.     return NULL;
  59. }
  60.  
  61. void usage()
  62. {
  63.     printf("Usage: dnw \n\n");
  64. }
  65.  
  66. static u_int16_t ace_csum(const unsigned char *data, u_int32_t len)
  67. {
  68.         u_int16_t csum = 0;
  69.         int j;
  70.  
  71.         for (j = 0; j < len; j ++) {
  72.                 csum += data[j];
  73.         }
  74.  
  75.         return csum;
  76. }
  77.  
  78. unsigned char* prepare_write_buf(char *filename, unsigned int *len)
  79. {
  80.     unsigned char *write_buf = NULL;
  81.     struct stat fs;
  82.  
  83.     int fd = open(filename, O_RDONLY);
  84.     if(-1==fd)
  85.     {
  86.         perror("Cannot open file");
  87.         return NULL;
  88.     }
  89.     if(-1==fstat(fd, &fs))
  90.     {
  91.         perror("Cannot get file size");
  92.         goto error;
  93.     }
  94.     write_buf = (unsigned char*)malloc(fs.st_size+10);
  95.     if(NULL==write_buf)
  96.     {
  97.         perror("malloc failed");
  98.         goto error;
  99.     }
  100.  
  101.     if(fs.st_size != read(fd, write_buf+8, fs.st_size))
  102.     {
  103.         perror("Reading file failed");
  104.         goto error;
  105.     }
  106.  
  107.     printf("Filename : %s\n", filename);
  108.     printf("Filesize : %lu bytes\n", fs.st_size);
  109.  
  110.     *((u_int32_t*)write_buf) = RAM_BASE;        //download address
  111.     *((u_int32_t*)write_buf+1) = fs.st_size + 10;    //download size;
  112.  
  113.     *len = fs.st_size + 10;
  114.  
  115.     // calculate checksum value
  116.     u_int16_t csum = ace_csum(write_buf+8, fs.st_size);
  117.     *(write_buf+fs.st_size+8) = csum & 0xff;
  118.     *(write_buf+fs.st_size+9) = (csum >> 8) & 0xff;
  119.     return write_buf;
  120.  
  121. error:
  122.     if(fd!=-1) close(fd);
  123.     if(NULL!=write_buf) free(write_buf);
  124.     fs.st_size = 0;
  125.     return NULL;
  126.  
  127. }
  128.  
  129. int main(int argc, char *argv[])
  130. {
  131.     if(2!=argc)
  132.     {
  133.         usage();
  134.         return 1;
  135.     }
  136.  
  137.     struct usb_dev_handle *hdev = open_port();
  138.     if(!hdev)
  139.     {
  140.         return 1;
  141.     }
  142.  
  143.     unsigned int len = 0;
  144.     unsigned char* write_buf = prepare_write_buf(argv[1], &len);
  145.     if(NULL==write_buf) return 1;
  146.  
  147.     unsigned int remain = len;
  148.     unsigned int towrite;
  149.     printf("Writing data ...\n");
  150.     while(remain)
  151.     {
  152.         towrite = remain>512 ? 512 : remain;
  153.         if(towrite != usb_bulk_write(hdev, 0x02, write_buf+(len-remain), towrite, 3000))
  154.         {
  155.             perror("usb_bulk_write failed");
  156.             break;
  157.         }
  158.         remain-=towrite;
  159.         printf("\r%d%%\t %d bytes     ", (len-remain)*100/len, len-remain);
  160.         fflush(stdout);
  161.     }
  162.     if(0==remain) printf("Done!\n");
  163.     return 0;
  164. }



дараа нь

$ gedit makefile коммандаар шинэ файл үүсгээд дараах кодыг хуулж, хадгална.

Makefile

  1. #!/usr/bin/make
  2. LDFLAGS=-lusb -lm
  3. CC=gcc
  4. all: dnw
  5.  
  6. clean:
  7.  -rm -f *.o dnw
  8.  
  9. dnw: dnw.o
  10.  $(CC) $(LDFLAGS) -o $@ $<
  11.  
  12. .PHONEY: all clean

Хөрвүүлэлт

DNW4Linux нь libusb сангийн тусламжтай хөрвүүлэгдэх учир хөрвүүлэлт хийхээсээ өмнө энэ санг нэмж суулшах хэрэгтэй. Үүний тулд:

$ sudo apt-get install libusb-dev

Дараа нь хөрвүүлэлтийг хийнэ.

$ make

Хэрэглээ

Сургалтын хавтангаа сериал портоор компьютертэй холбоно, Minicom ажиллуулна, хавтангаа асаана, uboot меню гарч ирэхэд ямар нэгэн товч дарна. Дараах байдалтай харагдана

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
U-Boot 1.1.6 (May 13 2011 - 16:11:02) for SMDK6410
****************************************
** u-boot 1.1.6 **
** Updated for TE6410 Board **
** Version 1.0 (10-01-15) **
** OEM: Forlinx Embedded **
** Web: http://www.witech.com.cn **
****************************************
CPU: S3C6410 @532MHz
Fclk = 532MHz, Hclk = 133MHz, Pclk = 66MHz, Serial = CLKUART (SYNC Mode)
Board: SMDK6410
DRAM: 256 MB
Flash: 0 kB
NAND: select s3c_nand_oob_mlc_128 2048 MB
In: serial
Out: serial
Err: serial
Hit any key to stop autoboot: 0

SMDK6410 #

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------

дараах коммандыг бичнэ

# dnw 50008000

өөр терминал нээж

$ cd /home/arm9board/dnw

$./dnw path/to/uboot.bin

буцаад minicom ажиллаж буй терминал дээрээ 

# nand erase 0 100000


No comments:

Post a Comment