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串口:

在PC上,如果是VMware上的Linux系统,按下图操作,先把USB串口连接到VMware:

然后在PC Linux中可以看到新的设备节点:
2. Serial分析
2.1 软件框架
Gadget串口的框架如下:

u_serial提供了有2种方法来使用Gadget串口:
u_serial.c里注册tty_driver结构体gs_tty_driver,在板子上编写APP访问设备/dev/ttyGS0即可与Host交互(Host要打开USB串口)

u_serial.c里注册console结构体gserial_cons。启动Linux内核时传入commandline参数”console=ttyGS0”后,内核的printk的信息通过Gadget串口打印出来(Host要打开USB串口):

注册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结构体的对应函数被调用:

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函数被调用:
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
源码:

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
- 双方即可互发数据






