Lazy loaded image
Gadget应用实例之serial
Words 1060Read Time 3 min
2025-9-12

Gadget应用实例之serial

参考资料:
  • https://blog.csdn.net/embededswordman/article/details/6689593
  • Linux文档:Documentation_serial.txt
  • UART教程:GIT仓库doc_and_source_for_drivers\IMX6ULL\doc_pic\09_UART
    • 回顾TTY的概念
    • 回顾console的概念

1. 硬件体验

使用USB线连接板子的OTG口和PC的USB口。
然后在板子加载驱动程序后,可以看到新的设备节点/dev/ttyGS0:
在PC上,如果是Windows系统,可以在设备管理器里看到新的USB串口:
notion image
在PC上,如果是VMware上的Linux系统,按下图操作,先把USB串口连接到VMware:
notion image
然后在PC Linux中可以看到新的设备节点:

2. Serial分析

2.1 软件框架

Gadget串口的框架如下:
notion image
u_serial提供了有2种方法来使用Gadget串口:
  • u_serial.c里注册tty_driver结构体gs_tty_driver,在板子上编写APP访问设备/dev/ttyGS0即可与Host交互(Host要打开USB串口)
    • notion image
  • u_serial.c里注册console结构体gserial_cons。启动Linux内核时传入commandline参数”console=ttyGS0”后,内核的printk的信息通过Gadget串口打印出来(Host要打开USB串口):
    • notion image
注册TTY和console的过程:

2.2 数据传输

2.2.1 APP访问

注意,在USB中数据传输总是由Host发起,所以:
  • 板子要事先准备好空间(设置好out方向的usb_request并放入队列),以便接收Host发来的数据;
  • 板子有数据想发送给Host时需要设置in方向的usb_request,以便Host读取。
板子上的APP访问/dev/ttyGS0时,就会导致gs_tty_ops结构体的对应函数被调用:
notion image
APP调用open函数时,会导致如下调用:
APP调用write函数时,会导致如下调用,将 in方向的usb_request放入队列:

2.2.2 printk

启动Linux内核时传入commandline参数”console=ttyGS0”后,内核的printk的信息通过Gadget串口打印出来(Host要打开USB串口)。
内核的printk函数会导致gserial_cons结构体中的write指针即gs_console_write函数被调用:
notion image
gs_console_write函数的调用关系如下:

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
源码:
notion image

4. 上机实验

编译2个版本:PC、ARM
使用USB线连接板子的OTG口、PC的USB口,PC上监测到USB串口后把它连接到VMWare,确定:
  • 开发板上有设备节点:/dev/ttyGS0
  • Ubuntu上有设备节点:/dev/ttyACM0
测试:
  • 在Ubuntu上执行:sudo ./serial_send_recv_pc /dev/ttyACM0
  • 在板子上执行:sudo ./serial_send_recv_arm /dev/ttyGS0
  • 双方即可互发数据
 
上一篇
宏的用法
下一篇
Guide to Linux System

Comments
Loading...