1. 程式人生 > >TQ2440在Ubuntu16.04上如何搭建DNW燒寫環境

TQ2440在Ubuntu16.04上如何搭建DNW燒寫環境

sudo 第一次 unistd.h vendor %d 不能 isp 配置 return

  八月份國賽比完,原計劃開始的嵌入式Linux學習一直拖到了現在;由於之前所有的開發全在Windows下進行的,對各種底層完全不清楚,剛好這段時間開始學習Linux,我就在想能不能把開發環境給遷移到Linux中來,就這樣,有了這篇博客的產生;本人現在是應屆大四學生,這是第一次寫博客,有啥問題還望各位大佬們指教。
閑話少說,首先介紹下我的硬件環境,我使用的是天嵌科技的TQ2440開發板,軟件環境是安裝了交叉編譯鏈的Ubuntu 16.04版本。
我們使用DNW向開發板燒寫程序其實需要經過兩個步驟,在串口終端中根據指令選擇要下載的程序,然後在使用DNW工具進行寫入。我們首先安裝串口工具minicom,他實現的功能跟SecureCRT類似,我們直接用sodo apt-get install minicom命令安裝它。


1.安裝minicom

sudo apt-get install minicom


配置minicom:

sudo minicom -s        // 註意:安裝的前面一定要sudo,不然後面配置文件會出現不能寫入的問題。


回車進入minicom的配置頁面,選擇Serial port setup,進入後可以看到一共有ABCDEFG七項配置,我們主要設置第一項設置設備,第五項波特率,第六七相由於我們一般用的都是USB轉串口設備,所有都設置為No;第一項是串口好,如果我們使用的USB轉串口的話可以在另一個終端中使用ls -l -/devv/ttyUSB*指令來查看我們的USB設備,在minicom配置界面輸入A修改成我們查到的端口。回車後在輸入E修改波特率,數據位、停止位;修改完成功後回車退出修改界面。選擇Save setup as df1保存。最後退出,我們的minicom就已經配置好了;輸入 sudo minicom 就可以打開minicom使用了。可以在minicom中同時按Crtrl+,然後按A查看幫助,X退出。

技術分享

minicom配置

技術分享

minicom打開後的界面(串口沒數據過來)


minicom配置完了,接下來就該安裝程序下載到目標板的最後步驟了,首先要安裝libusb-dev這個庫;直接在輸入指令 sudo apt-get install libusb-dev 裝完之後就編譯下載工具,網上牛人提供的一個,代碼如下:

#include <stdio.h>
#include <usb.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

#define QQ2440_SECBULK_IDVENDOR 0x5345
#define QQ2440_SECBULK_IDPRODUCT 0x1234


struct usb_dev_handle * open_port()
{
struct usb_bus *busses, *bus;

usb_init();
usb_find_busses();
usb_find_devices();

busses = usb_get_busses();
for(bus=busses;bus;bus=bus->next)
{
struct usb_device *dev;
for(dev=bus->devices;dev;dev=dev->next)
{
printf("idVendor:0x%x/t,ipProduct:0x%x/n",dev->descriptor.idVendor,dev->descriptor.idProduct);
if( QQ2440_SECBULK_IDVENDOR==dev->descriptor.idVendor
&& QQ2440_SECBULK_IDPRODUCT==dev->descriptor.idProduct)
{
printf("Target usb device found!/n");
struct usb_dev_handle *hdev = usb_open(dev);
if(!hdev)
{
perror("Cannot open device");
}
else
{
if(0!=usb_claim_interface(hdev, 0))
{
perror("Cannot claim interface");
usb_close(hdev);
hdev = NULL;
}
}
return hdev;
}
}
}

printf("Target usb device not found!/n");

return NULL;
}

void usage()
{
printf("Usage: dnw2 <file>/n/n");
}

unsigned char* prepare_write_buf(char *filename, unsigned int *len)
{
unsigned char *write_buf = NULL;
struct stat fs;

int fd = open(filename, O_RDONLY);
if(-1==fd)
{
perror("Cannot open file");
return NULL;
}
if(-1==fstat(fd, &fs))
{
perror("Cannot get file size");
goto error;
}
write_buf = (unsigned char*)malloc(fs.st_size+10);
if(NULL==write_buf)
{
perror("malloc failed");
goto error;
}

if(fs.st_size != read(fd, write_buf+8, fs.st_size))
{
perror("Reading file failed");
goto error;
}

printf("Filename : %s/n", filename);
printf("Filesize : %d bytes/n", fs.st_size);

*((u_int32_t*)write_buf) = 0x30000000; //download address
*((u_int32_t*)write_buf+1) = fs.st_size + 10; //download size;

*len = fs.st_size + 10;
return write_buf;

error:
if(fd!=-1) close(fd);
if(NULL!=write_buf) free(write_buf);
fs.st_size = 0;
return NULL;

}

int main(int argc, char *argv[])
{
if(2!=argc)
{
usage();
return 1;
}

struct usb_dev_handle *hdev = open_port();
if(!hdev)
{
return 1;
}

unsigned int len = 0;
unsigned char* write_buf = prepare_write_buf(argv[1], &len);
if(NULL==write_buf) return 1;

unsigned int remain = len;
unsigned int towrite;
printf("Writing data .../n");
while(remain)
{
towrite = remain>512 ? 512 : remain;
if(towrite != usb_bulk_write(hdev, 0x03, write_buf+(len-remain), towrite, 3000))
{
perror("usb_bulk_write failed");
break;
}
remain-=towrite;
printf("/r%d%/t %d bytes ", (len-remain)*100/len, len-remain);
fflush(stdout);
}
if(0==remain) printf("Done!/n");
return 0;
}


1)將上面代碼保存為文件如: dnw1.c
2)接著編譯: 

gcc dnw1.c -o dnw1 -l usb

3)移動dnw1可執行文件到/usr/bin目錄下

sudo mv ./dnw1 /usr/bin


4)執行

sudo dnw1 path/your_filename


這樣整個下載環境就安裝完了,接下來就該演示下載過程了,首先將開發板的USB口跟串口分別與電腦相連,然後上電,打開minicom

sudo minicom

按下開發板的復位鍵,我們就能看見開發板的下載選項了

技術分享

輸入下載的內容選項,我這裏隨便下載一個裸機程序

技術分享

我們可以看見,USB已經連接成功,正在等待下載....

然後我們打開一個新的終端,輸入指令 sudo dnw1 +你要發送的文件,例如:

sudo dnw1 led.bin

技術分享

可以看見下載已經完成。

TQ2440在Ubuntu16.04上如何搭建DNW燒寫環境