一、UART硬件介绍
1、串口的硬件介绍
uart通过三根线即可完成:发送线TX、接收线RX、地线。
TxD线把PC机要发送的信息发送给ARM开发板。
最下面的地线统一参考地。
2、串口的参数
-
波特率:一般选波特率都会有9600,19200,115200等选项。其实意思就是每秒传输这么多个比特位数(bit)。
-
起始位:先发出一个逻辑”0”的信号,表示传输数据的开始。
-
数据位:可以是5~8位逻辑”0”或”1”。如ASCII码(7位),扩展BCD码(8位)。小端传输。
-
校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性。
-
停止位:它是一个字符数据的结束标志。
怎么发送一字节数据,比如‘A‘?
‘A’的ASCII值是0x41,二进制就是01000001,怎样把这8位数据发送给PC机呢?
-
双方约定好波特率(每一位占据的时间);
-
规定传输协议
-
原来是高电平,ARM拉低电平,保持1bit时间;
-
PC在低电平开始处计时;
-
ARM根据数据依次驱动TxD的电平,同时PC依次读取RxD引脚电平,获得数据;
-
前面图中提及到了逻辑电平,也就是说代表信号1的引脚电平是人为规定的。
如图是TTL/CMOS逻辑电平下,传输‘A’时的波形:
在xV至5V之间,就认为是逻辑1,在0V至yV之间就为逻辑0。
如图是RS-232逻辑电平下,传输‘A’时的波形:
在-12V至-3V之间,就认为是逻辑1,在+3V至+12V之间就为逻辑0。
RS-232的电平比TTL/CMOS高,能传输更远的距离,在工业上用得比较多。
市面上大多数ARM芯片都不止一个串口,一般使用串口0来调试,其它串口来外接模块。
3、串口内部结构
要发送数据时,CPU控制内存要发送的数据通过FIFO传给UART单位,UART里面的移位器,依次将数据发送出去,在发送完成后产生中断提醒CPU传输完成。 接收数据时,获取接收引脚的电平,逐位放进接收移位器,再放入FIFO,写入内存。在接收完成后产生中断提醒CPU传输完成。
二、TTY驱动程序框架
1、行规程的引入
以下文字引用自参考资料解密TTY:
大多数用户都会在输入时犯错,所以退格键会很有用。这当然可以由应用程序本身来实现,但是根据UNIX设计“哲学”,应用程序应尽可能保持简单。为了方便起见,操作系统提供了一个编辑缓冲区和一些基本的编辑命令(退格,清除单个单词,清除行,重新打印),这些命令在行规范(line discipline)内默认启用。高级应用程序可以通过将行规范设置为原始模式(raw mode)而不是默认的成熟或准则模式(cooked and canonical)来禁用这些功能。大多数交互程序(编辑器,邮件客户端,shell,及所有依赖curses或readline的程序)均以原始模式运行,并自行处理所有的行编辑命令。行规范还包含字符回显和回车换行。
2、关键数据结构
2.1 TTY device
- 设备模型的角度
为每个“数据通道”注册一个struct device,以便可以在sysfs中体现出来,例如
/sys/class/tty/tty
/sys/class/tty/console
/sys/class/tty/ttyS0
- 字符设备的角度
为每个“数据通道”注册一个struct cdev,以便在用户空间可以访问,例如
/dev/tty
/dev/console
/dev/ttyS0
2.2 TTY driver
从当前设备模型的角度看,TTY framework有点奇怪,它淡化了TTY device的概念,却着重突出driver由struct tt