0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

USB Gadget serial應(yīng)用實例(上)

麥辣雞腿堡 ? 來源:嵌入式Linux系統(tǒng)開發(fā) ? 作者:嵌入式Linux系統(tǒng)開 ? 2023-07-13 11:06 ? 次閱讀

1. 硬件體驗

使用 Linux 自帶的 USB Gadget 驅(qū)動 /drivers/usb/gadget/legacy/serial.c

使用 USB 線,連接板子的 OTG 口和 PC 的 USB 口。

然后在板子加載驅(qū)動程序后,可以看到新的設(shè)備節(jié)點 /dev/ttyGS0:

# modprobe g_serial
g_serial gadget: Gadget Serial v2.4
g_serial gadget: g_serial ready
g_serial gadget: high-speed config #2: CDC ACM config

# ls /dev/ttyGS0 -l
crw-rw----    1 root     dialout   246,   0 Jan  1 00:30 /dev/ttyGS0

在 PC 上,如果是 Windows 系統(tǒng),可以在設(shè)備管理器里看到新的 USB 串口:

圖片

在 PC 上,如果是 VMware 上的 Linux 系統(tǒng),按下圖操作,先把 USB 串口連接到 VMware:

圖片

然后在 PC Linux 中可以看到新的設(shè)備節(jié)點:

book@100ask:~$ dmesg
[  286.903239] usb 1-1: new high-speed USB device number 2 using ehci-pci
[  287.254549] usb 1-1: New USB device found, idVendor=0525, idProduct=a4a7, bcdDevice= 4.09
[  287.254550] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[  287.254551] usb 1-1: Product: Gadget Serial v2.4
[  287.254552] usb 1-1: Manufacturer: Linux 4.9.88 with 2184000.usb
[  287.342786] cdc_acm 1-1:2.0: ttyACM0: USB ACM device
[  287.343202] usbcore: registered new interface driver cdc_acm
[  287.343202] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters
book@100ask:~$ ls /dev/ttyACM0 -l
crw-rw---- 1 root dialout 166, 0 Mar  5 22:38 /dev/ttyACM0

2. Serial分析

2.1 軟件框架

Gadget 串口的框架如下:

圖片

u_serial 提供了有 2 種方法來使用 Gadget 串口:

  • u_serial.c 里注冊 tty_driver 結(jié)構(gòu)體 gs_tty_driver,在板子上編寫 APP 訪問設(shè)備 /dev/ttyGS0 即可與 Host 交互(Host 要打開 USB 串口)

圖片

  • u_serial.c 里注冊 console 結(jié)構(gòu)體 gserial_cons。啟動 Linux 內(nèi)核時傳入 commandline 參數(shù)"console=ttyGS0"后,內(nèi)核的 printk 的信息通過 Gadget 串口打印出來(Host 要打開 USB 串口):

圖片

注冊 TTY 和 console 的過程:

gs_bind // driversusbgadgetlegacyserial.c
    status  = serial_register_ports(cdev, &serial_config_driver,"acm");
       fi_serial[i] = usb_get_function_instance(f_name);
 
acm_alloc_instance // driversusbgadgetfunctionf_acm.c
 ret = gserial_alloc_line(&opts- >port_num); // driversusbgadgetfunctionu_serial.c
 
   // 注冊TTY
   tty_dev = tty_port_register_device(&ports[port_num].port- >port,
             gs_tty_driver, port_num, NULL);

   // 注冊console
   gserial_console_init();
             register_console(&gserial_cons);

2.2 數(shù)據(jù)傳輸

2.2.1 APP 訪問

注意,在 USB 中數(shù)據(jù)傳輸總是由 Host 發(fā)起,所以:

  • 板子要事先準(zhǔn)備好空間(設(shè)置好 out 方向的 usb_request 并放入隊列),以便接收 Host 發(fā)來的數(shù)據(jù);
  • 板子有數(shù)據(jù)想發(fā)送給 Host 時需要設(shè)置 in 方向的 usb_request,以便 Host 讀取。

板子上的 APP 訪問 /dev/ttyGS0 時,就會導(dǎo)致 gs_tty_ops 結(jié)構(gòu)體的對應(yīng)函數(shù)被調(diào)用:

圖片

APP 調(diào)用 open 函數(shù)時,會導(dǎo)致如下調(diào)用:

gs_open
 gs_start_io(port);
  // 取出 out 端點(對應(yīng) Host 來說是 out, 對于板子來說就是輸入)
  struct usb_ep  *ep = port- >port_usb- >out;
  
  // 給 out 端點分配 usb_request
        status = gs_alloc_requests(ep, head, gs_read_complete,&port- >read_allocated);

  // 給 in 端點分配 usb_request, 但是在 open 時并沒有把 in 方向的 usb_request 放入隊列
        status = gs_alloc_requests(port- >port_usb- >in, &port- >write_pool,gs_write_complete, &port- >write_allocated);

        // 把 usb_request 放入隊列, 如果 Host 發(fā)來數(shù)據(jù), 這個 usb_request 的 complete 函數(shù)被調(diào)用
  started = gs_start_rx(port);
     status = usb_ep_queue(out, req, GFP_ATOMIC);

APP 調(diào)用 write 函數(shù)時,會導(dǎo)致如下調(diào)用:

gs_write
 gs_start_tx(port);
  // 把 usb_request 放入隊列, Host讀取數(shù)據(jù)時就可以從中得到數(shù)據(jù)
  status = usb_ep_queue(in, req, GFP_ATOMIC);

2.2.2 printk

啟動 Linux 內(nèi)核時傳入 commandline 參數(shù)"console=ttyGS0"后,內(nèi)核的 printk 的信息通過 Gadget 串口打印出來(Host 要打開 USB 串口)。

內(nèi)核的 printk 函數(shù)會導(dǎo)致 gserial_cons 結(jié)構(gòu)體中的 write 指針即gs_console_write函數(shù)被調(diào)用:

圖片

gs_console_write 函數(shù)的調(diào)用關(guān)系如下:

gs_console_write
 // 把要打印的數(shù)據(jù)放入環(huán)形 buffer
 gs_buf_put(&info- >con_buf, buf, count);
 
 // 喚醒內(nèi)核線程
 wake_up_process(info- >console_thread);
 
// 內(nèi)核線程
gs_console_thread
 // 被喚醒后
 
 // 取出輸入端點和它的 usb_request
 req = info- >console_req;
 ep = port- >port_usb- >in;
 
 // 從環(huán)形 buffer 得到數(shù)據(jù)、設(shè)置 usb_request
 xfer = gs_buf_get(&info- >con_buf, req- >buf, size);
 req- >length = xfer;
 
 // 把 usb_request 放入隊列,以便 Host 讀取
 ret = usb_ep_queue(ep, req, GFP_ATOMIC);
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5045

    文章

    18817

    瀏覽量

    298489
  • 驅(qū)動
    +關(guān)注

    關(guān)注

    12

    文章

    1790

    瀏覽量

    84906
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11123

    瀏覽量

    207905
收藏 人收藏

    評論

    相關(guān)推薦

    如何配置USB OTG為Gadget serial device?

    現(xiàn)需要將OKA40i-C板子的OTG下載口配置為虛擬串口,實現(xiàn)u***串行通信,利用linux已存在的u***轉(zhuǎn)虛擬串口驅(qū)動:USB Gadget Drivers (Serial
    發(fā)表于 01-04 06:47

    分享一種將RK3399配置成USB gadget設(shè)備的方法

    一個USB gadget設(shè)備(比如配置成一個hid 鍵盤),就得在type-c實現(xiàn),實際中這個功能有廣泛的應(yīng)用,比如pc主機(jī)和RK3399進(jìn)行數(shù)據(jù)通信,用此就是一種很好的方式,RK3399的
    發(fā)表于 05-24 10:35

    基于Linux內(nèi)核的Rockchip USB Gadget UAC開發(fā)資料分享

    1、Rockchip USB Gadget UAC開發(fā)步驟本文檔提供 Rockchip 平臺基于 Linux 內(nèi)核的 USB Gadget UAC(
    發(fā)表于 08-10 16:03

    RK3288使用USB GADGET實現(xiàn)大容量存儲腳本

    (){mount -t configfs none /sys/kernel/configmkdir /sys/kernel/config/usb_gadget/rockchip -m
    發(fā)表于 11-18 16:33

    求助,關(guān)于USB gadget安裝虛擬網(wǎng)口問題求解

    1.make linux-menuconfig USB support ----> <*>USB Gadget Support ---->
    發(fā)表于 09-01 06:14

    PL2303 USB to Serial Adapter

    The PL2303 USB to Serial adapter is your smart and convenient accessory forconnecting RS-23
    發(fā)表于 10-15 17:58 ?111次下載

    Universal Serial Bus(USB) Devi

    Universal Serial Bus Device Class Definition for Printing Devices The Universal Serial Bus (USB
    發(fā)表于 04-11 19:32 ?16次下載

    LPC1300片USB驅(qū)動應(yīng)用與實例

    LPC1300片USB驅(qū)動應(yīng)用與實例
    發(fā)表于 01-06 16:07 ?53次下載
    LPC1300片<b class='flag-5'>上</b><b class='flag-5'>USB</b>驅(qū)動應(yīng)用與<b class='flag-5'>實例</b>

    usb+serial+controller驅(qū)動程序分享

    主要介紹usb+serial+controller驅(qū)動程序。
    發(fā)表于 03-17 09:44 ?34次下載

    [嵌入式linux]將linux板卡虛擬為USB網(wǎng)卡設(shè)備(Ethernet Gadget

    kernel menuconfig-> Device Drivers ->USB support -> USB Gadget Support 建議最好選成M,作為內(nèi)核驅(qū)動模塊,便于
    發(fā)表于 11-02 11:36 ?12次下載
    [嵌入式linux]將linux板卡虛擬為<b class='flag-5'>USB</b>網(wǎng)卡設(shè)備(Ethernet <b class='flag-5'>Gadget</b>)

    AMD Xilinx Linux 2022.1 USB Gadget使用

    有客戶使用Linux中的USB Gadget功能,把MPSoC器件做USB從設(shè)備
    的頭像 發(fā)表于 07-07 14:15 ?631次閱讀

    USB Gadget 應(yīng)用實例ADB實現(xiàn)

    ,定義了多個接口描述符,這是 APP 提出的請求。如果 Gadget 設(shè)備有足夠的端點,那么就會在在 functionfs 跟目錄下創(chuàng)建出這些端點,比如 ep1、ep2。 ADB 程序的調(diào)用關(guān)系如下
    的頭像 發(fā)表于 07-13 10:56 ?3585次閱讀
    <b class='flag-5'>USB</b> <b class='flag-5'>Gadget</b> 應(yīng)用<b class='flag-5'>實例</b>ADB實現(xiàn)

    USB Gadget serial應(yīng)用實例(下)

    3. 編程 PC: open /read/ write /dev/ ttyACM0板子: open /read/ write /dev/ ttyGS0參考:https: //stackoverflow.com/questions/7469139/what-is-the-equivalent-to-getch-getche-in-linux 源碼: # include # include # include # include # include # include # include # include # include # include static struct termios old , current ; /* Initialize new terminal i/o settings */ void initTermios ( int echo) { tcgetattr ( 0 , /* grab old terminal i/o settings */ current = old; /* make new settings same as old settings */ current.c_lflag /* disable buffered i/o */ if (echo) { current.c_lflag |= ECHO;
    的頭像 發(fā)表于 07-13 11:10 ?706次閱讀

    USB Gadget zero應(yīng)用實例程序

    1. 編寫程序 1.1 編程思路 涉及的程序如下圖所示: PC 端基于 libusb 編寫應(yīng)用程序,開發(fā)板端直接使用 Linux 自帶的 USB Gadget 驅(qū)動 zero.c【/drivers
    的頭像 發(fā)表于 07-13 11:14 ?870次閱讀
    <b class='flag-5'>USB</b> <b class='flag-5'>Gadget</b> zero應(yīng)用<b class='flag-5'>實例</b>程序

    從硬件軟件角度理解Gadget框架

    2. 從硬件軟件角度理解 Gadget 框架 USB 傳輸?shù)暮诵氖?endpoint,使用 endpoint 可以收發(fā)數(shù)據(jù)。在 endpoint 之上,就可以模擬 USB 串口、USB
    的頭像 發(fā)表于 07-13 11:32 ?821次閱讀
    從硬件軟件角度理解<b class='flag-5'>Gadget</b>框架