ARM-LINUX學習筆記-(虛擬機linux串口終端以及USB程序下載,基於TQ2440)

    昨天安裝了ssh服務以後今天在windows上用xshell登錄發現登陸不上,緣由是使用了virtualbox的NAT模式,在NAT模式下,客戶機能夠很方便地上網,可是想要連接宿主機就須要打開網絡地址映射linux

    首先要知道ssh服務使用的是22端口,而後打開windows主機上的適配器,virtualbox安裝了一張虛擬網卡,以下shell

虛擬地址爲192.168.56.1,接下來在虛擬機的設置界面設置網絡地址映射,首先還要知道虛擬機的IP地址,以下ubuntu

地址爲10.0.2.15,就能夠去作端口轉發了,位置以下vim

按照步驟來,設置名稱隨意,主機IP設置爲虛擬機網卡的IP,端口能夠寫一個未被佔用的任意端口,子系統IP爲linux宿主機ip,端口爲ssh服務端口,至關於說咱們鏈接ssh的時候鏈接192.168.56.1的2222端口的時候,wirtualbox將數據轉發到宿主機的22端口上,通過這一次中轉就能夠登陸ssh了,接下來新建ssh鏈接以下windows

注意主機和端口號的設置,和我以前說的同樣,這樣就可在輸入用戶名密碼以後鏈接上了,以下網絡

 

 

共享文件夾的設置oracle

virtualbox提供共享文件夾的功能,雖然寫着自動掛載,可是一般ubuntu是不會自動掛載的,以下ssh

這個時候就須要咱們手動在系統中掛在共享文件夾了,首先你須要安裝加強功能包,通常都會安裝,安裝了以後虛擬機用着才爽嘛工具

而後創建一個文件夾用於掛載共享文件夾網站

mkdir /mnt/linuxshare

能夠創建在別的位置,可是我習慣在這裏,創建以後就能夠掛載了

mount -t vboxsf linuxshare /mnt/linuxshare

第一個linuxshare是你建立共享文件夾的時候本身制定的名稱

第二個/mnt/linuxshare是你建立的掛載文件夾的目錄

命令執行完沒有錯誤信息掛載就成功了,而後關閉終端,從新打開終端

vim /mnt/linuxshare/text.c保存以後查看,應該在windows下的共享文件夾出現text.c文件了

 

 

有時候命令不太記得,看英文文檔比較麻煩的時候咱們能夠選擇安裝中文的幫助包使用命令

sudo apt-get update 更新源

sudo apt-get install manpages-zh 安裝中文manual

安裝完成以後man ls應該就是中文提示了

 

接下來是串口的共享問題,我使用的是usb轉串口的芯片ft232,這個芯片ubuntu14.02自帶了驅動,不須要額外安裝,可是咱們要將這個物理usb轉串口切換到虛擬機裏面,首先要安裝一個包,是wirtualbox的usb2.0加強包,名字叫作Oracle_VM_VirtualBox_Extension_Pack-4.3.26-98988.vbox-extpack,百度搜索一下在oracle的官方網站下載,下載以後安裝就能啓動usb2.0的支持了,接下來以下設置

按照設置添加這個usb,而後重啓系統,重啓完成以後應該就能看到usb轉串口設備,這樣查看

若是沒有這個設備看看是否是本身彈出了,能夠在這裏彈出

串口設備安裝好了以後打開設備,咱們知道設備在linux上對應的都是文件,串口設備對應文件在這裏

/dev/ttyUSB0

 

接下來是串口通信,咱們安裝兩個串口通信軟件,一個命令行一個圖形化的,使用命令

sudo apt-get install minicom //命令行調試助手

sudo apt-get install cutecom //圖形化調試助手

 

安裝好minicom以後須要進行設置,命令爲

sudo minicom -s

設置截圖以下

設置完成以後保存爲默認配置文件,退出界面,再次輸入

minicom,自動打開串口(要是打開失敗,屏幕右下角顯示offline的)

而後將我手上的TQ2440開發板打到norflash啓動(nor中已經有了bootloader),顯示界面以下

好,到這裏串口通信完成,接下里爲了擺脫windows咱們還須要把usb完成

 

首先第一步是下載安裝libusb-dev,以下

sudo apt-get install libusb-dev

安裝完成以後,記得將TQ2440的USB端口導入linux,以下

到這裏快成功啦,下載程序咱們須要一個工具,windows有一個dnw,有人作了dnw2,源代碼以下

/* dnw2 linux main file. This depends on libusb.
 *
 * Author:     Fox <hulifox008@163.com>
 * License:    GPL
 *
 */



#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)
        {
            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;
}

拷貝到linux中並創建文件dnw2.c,而後進入其目錄,編譯該文件

gcc dnw2.c -o dnw2 -lusb

編譯的的時候有兩個小警告,沒關係,查看目錄下,生成了dnw文件以下

將該文件的路徑加入到環境變量中,路徑取決於你放在哪裏,好比我放在/home/work/dnw2裏面,那麼我修改/etc/environment文件爲這個樣子

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/work/gcc-arm-none-eabi-4_9-2015q1/bin:/home/work/dnw2"

最後一個就是個人路徑

作完以後記得

source /etc/environment

此時環境變量就加載成功了,接下來能夠直接下載,找一個之前作好的bin文件,燒寫命令以下

dnw2 文件名

若是說dnw2找不到看看是否是環境變量沒有加進去,這個命令必須在root模式運行

sudo -i

source /etc/environment

dnw2 文件名

這樣應該沒問題了,還有問題,看

echo $PATH 看看環境變量對不對

 

到這裏咱們就能夠快樂的在linux下燒寫內核,鏡像,裸機程序了

 

另外,每次燒寫的時候都須要在USB中手動的插入tq2440USB設備,也能夠直接設置過濾器,主要緣由是燒寫完成以後2440就把USB設備拔出了

 

前面說了cutecom,使用起來是這樣的

 

恩,今天的筆記基本結束,開發環境基本OK了

相關文章
相關標籤/搜索