Linux下的串口总线驱动(一)
PC机南桥的LPC总线(Low Pin Count并行总线,代替以前的ISA总线)上挂接了一个超级I/O模块,而UART是这个超级模块芯片组的一部分,这个UART通过RS232线程转换与串行端口相连。与RS232不同,RS485并不是标准的PC接口,但在嵌入式领域,会为了可靠通信而使用RS485,RS485使用差分信号,因此其传输距离可以达到数百米,而RS232传输距离仅数几米,在处理器一端,RS485接口是半双工的UART操作。
本文引用地址:http://www.eepw.com.cn/article/201611/319918.htmLinux包含如下几种终端设备:串行端口终端(/dev/ttySn)、伪终端(/dev/pty)、控制终端(/dev/tty)、控制台终端(/dev/ttyn,/dev/conslole)。串行端口终端使用的设备名为/dev/ttyS0,/dev/ttyS1等,对应的设备号为(4,0),(4,1)。通过查看/proc/tty/drivers文件可以知道什么类型的tty设备存在以及什么驱动被加载到内核,这个文件包括一个当前存在的不同tty驱动的列表,包括驱动名,缺省的节点名,驱动的主编号,驱动的次编号范围,以及tty驱动的类型。
I/O系统调用是从带有线路规程的TTY I/O核心开始,然后通过TTY层,最后到达UART驱动层。主要涉及串口内核配置、UART层内核代码、TTY层内核代码、线路规程内核代码、串口测试代码五个部分。
二.串口内核配置
对于Mini2440串口驱动,我想从配置开始讲起。在内核中Kconfig必须完成一层层调用,如果没有在上一个Kconfig中调用该层Kconfig,那么该层Kconfig中的内容不会在此出现。这种情况下,只有当该层的Kconfig被其他层调用,该层Kconfig中的内容才会被显示。所以我们找找drivers/serial/Kconfig在哪里被调用的呢?
在/drivers/char/kconfig中可以看到一行代码source "drivers/serial/Kconfig",那我们就到drivers/serial/Kconfig下看看
Samsung SoC serial support对应于samsung.o
config SERIAL_SAMSUNG
Support for console on Samsung SoC serial port对应于控制台驱动
Samsung S3C2440/S3C2442 Serial port support对应于s3c2440.o
在/drivers/char/Makefile中可以看到
obj-y
我们知道tty_io.o
自此,我们知道关于串口驱动,我们内核中被编译了s3c2440.o
我们对此进行分类,属于UART层的是s3c2440.o
好了,对于串口的地图我们已经分析好了,那我们就按照UART层,TTY层,线路规程一个个的逛逛吧。
三.UART层内核代码
我们先看看samsung.o的init代码吧,这里面完成了uart_driver的注册
static int __init s3c24xx_serial_modinit(void)
{
}
static struct uart_driver s3c24xx_uart_drv = {
};
我们关注下上面这个结构体中一个成员S3C24XX_SERIAL_CONSOLE
#define S3C24XX_SERIAL_CONSOLE &s3c24xx_serial_console
static struct console s3c24xx_serial_console = {
};
上面是控制台的结构体成员。
对于UART驱动,我们除了需要注册uart_driver外,还需要注册端口,我们看看s3c2440.o。
这个文件里面注册了一个平台设备,其中平台设备的探测函数最终调用了samsung.o中的s3c24xx_serial_probe函数。
int s3c24xx_serial_probe(struct platform_device *dev,
{
}
通过上面的函数,我们发现在UART层,我们调用了uart_add_one_port函数完成端口的添加,我们来看看添加了什么端口呢?
static struct s3c24xx_uart_port s3c24xx_serial_ports[CONFIG_SERIAL_SAMSUNG_UARTS] = {
#if CONFIG_SERIAL_SAMSUNG_UARTS >2
#endif
#if CONFIG_SERIAL_SAMSUNG_UARTS >3
#endif
};
在端口的定义中,我们知道s3c24xx_uart_port中定义了一个uart_port结构体,继续跟踪对UART的操作函数
static struct uart_ops s3c24xx_serial_ops = {
};
对于上述uart_ops函数,我们需要自己去实现uart层的具体操作。
我们在UART层主要涉及uart_driver,uart_port,uart_ops三个结构体,并调用tty层的uart_register_driver和uart_add_one_port完成驱动和端口的注册,UART层具体操作函数需要用户自己设计。
好了,总结下UART驱动层需要完成的任务:
其一,定义uart_driver、uart_ops、uart_port等结构体的实例并在适当的地方根据具体硬件和驱动的情况初始化它们,当然具体设备XXX的驱动可以将这些结构套在新定义的XXX_uart_driver、XXX_uart_ops、XXX_uart_port之内。
其二,在模块初始化时调用uart_register_driver()和uart_add_one_port()以注册UART驱动并添加端口,在模块卸载时调用uart_unregister_driver()和uart_remove_one_port()以注销UART驱动并移除端口。
其三,根据具体硬件的datasheet实现uart_ops中的成员函数,这些函数的实现成为UART驱动的主体工作。
关键词: Linux串口总线驱
您可能也感兴趣:
为您推荐
8家险企股权被挂牌转让,为何险企股权不再被追捧?
深圳最低工资标准调整为2360元/月 失业保险金为2124元/月
辽宁实施失业保险省级统筹 对缺口核定等作出详细规定
排行
最近更新
- 芜湖释放创新“N次方”效应 数字赋能驱动产业升级
- 去年快递服务全程时限水平有较大提升 干线运输时限缩短
- 住建部:推动长江经济带高质量发展,打造区域协调发展新样板
- 江苏发布重大项目清单 增资扩产项目明显增多
- 山东抓投资抓项目 新兴领域投资规模持续扩大
- Gucci在2月将投放 10 个“SuperGucci”NFT
- 美国银行:美国CBDC将保持美元作为世界储备货币的地位
- 美股三大指数尾盘集体转涨
- 光伏发电概念股有哪些?光伏发电概念龙头股一览
- The new iPad屏幕对比评测
- 电源接通延时器
- 汽车电子稳定系统(ESP)详解
- 联想B520一体机拆解
- 焦炭相关股票有哪些?焦炭概念股票龙头一览
- 增强信号 3G无线上网卡改装拆解全攻略
- 盘点全球五大智能手机生产商 华为联想入围
- 三星新平板 Galaxy Note 10.1全拆解
- 智能监控防盗报警系统
- 格力电器未来三年股东回报规划:每年累计分红不低于当年净利润50%
- 消息称京东科技计划2022年在港IPO,募资10亿至20亿美元
- 恒大集团:呼吁境外债权人不采取任何激进的法律行动
- 海航董事长刘璐因个人原因辞职,在海航已近28年
- 青青稞酒预计2021年营收增长30%-40%,四季度净亏损超1500万
- 2022年在港上市募资10亿美元?京东科技:不予置评
- 财政部修订出台《财政行政处罚听证实施办法》
- 卖房子需要交什么税?卖房子必须携带哪些证件?
- 医保卡的使用范围有哪些?补牙可以使用医保报销吗?
- 小产权房能过户吗?购买小产权房有什么风险?
- 奕东电子的实际控制人是谁?奕东电子股票上市了吗?
- 百合股份是一家什么公司?百合股份的股票何时上市?