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


    昨天安裝了ssh服務之后今天在windows上用xshell登陸發現登錄不上,原因是使用了virtualbox的NAT模式,在NAT模式下,客戶機可以很方便地上網,但是想要鏈接宿主機就需要打開網絡地址映射

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

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

地址為10.0.2.15,就可以去做端口轉發了,位置如下

按照步驟來,設置名稱隨意,主機IP設置為虛擬機網卡的IP,端口可以寫一個未被占用的任意端口,子系統IP為linux宿主機ip,端口為ssh服務端口,相當於說我們連接ssh的時候連接192.168.56.1的2222端口的時候,wirtualbox將數據轉發到宿主機的22端口上,經過這一次中轉就可以登錄ssh了,接下來新建ssh連接如下

注意主機和端口號的設置,和我之前說的一樣,這樣就可在輸入用戶名密碼之后連接上了,如下

 

 

共享文件夾的設置

virtualbox提供共享文件夾的功能,雖然寫着自動掛載,但是通常ubuntu是不會自動掛載的,如下

這個時候就需要我們手動在系統中掛在共享文件夾了,首先你需要安裝增強功能包,一般都會安裝,安裝了之后虛擬機用着才爽嘛

然后建立一個文件夾用於掛載共享文件夾

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了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM