财讯中国

Linux下的串口总线驱动(一)

来源:网络 2021-12-20 07:47:41
一.系统理论

PC机南桥的LPC总线(Low Pin Count并行总线,代替以前的ISA总线)上挂接了一个超级I/O模块,而UART是这个超级模块芯片组的一部分,这个UART通过RS232线程转换与串行端口相连。与RS232不同,RS485并不是标准的PC接口,但在嵌入式领域,会为了可靠通信而使用RS485,RS485使用差分信号,因此其传输距离可以达到数百米,而RS232传输距离仅数几米,在处理器一端,RS485接口是半双工的UART操作。

Linux包含如下几种终端设备:串行端口终端(/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.oserial_core.o

config SERIAL_SAMSUNG

tristate "Samsung SoC serial support"

depends on ARM && PLAT_S3C

select SERIAL_CORE

Support for console on Samsung SoC serial port对应于控制台驱动

Samsung S3C2440/S3C2442 Serial port support对应于s3c2440.o

在/drivers/char/Makefile中可以看到

obj-y+= mem.o random.o tty_io.o n_tty.o tty_ioctl.o tty_ldisc.o tty_buffer.o tty_port.o

我们知道tty_io.on_tty.o tty_ioctl.otty_ldisc.o tty_buffer.o tty_port.o已编入内核

自此,我们知道关于串口驱动,我们内核中被编译了s3c2440.osamsung.oserial_core.o tty_io.on_tty.o tty_ioctl.otty_ldisc.o tty_buffer.o tty_port.o

我们对此进行分类,属于UART层的是s3c2440.osamsung.o;属于TTY层的是serial_core.o;属于线路规程的是tty_io.on_tty.o tty_ioctl.otty_ldisc.o tty_buffer.o tty_port.o 。

好了,对于串口的地图我们已经分析好了,那我们就按照UART层,TTY层,线路规程一个个的逛逛吧。

三.UART层内核代码

我们先看看samsung.o的init代码吧,这里面完成了uart_driver的注册

static int __init s3c24xx_serial_modinit(void)

{

int ret;

ret = uart_register_driver(&s3c24xx_uart_drv);//注册uart_driver

if (ret < 0) {

printk(KERN_ERR "failedto register UART driver\n");

return -1;

}

return 0;

}

static struct uart_driver s3c24xx_uart_drv = {

.owner= THIS_MODULE,

.dev_name= "s3c2410_serial", //设备名

.nr= CONFIG_SERIAL_SAMSUNG_UARTS,//UART端口个数

.cons= S3C24XX_SERIAL_CONSOLE,//指向控制台结构

.driver_name= S3C24XX_SERIAL_NAME,//驱动的名字

.major= S3C24XX_SERIAL_MAJOR,//串口主设备号

.minor= S3C24XX_SERIAL_MINOR,//串口次设备号

};

我们关注下上面这个结构体中一个成员S3C24XX_SERIAL_CONSOLE

#define S3C24XX_SERIAL_CONSOLE &s3c24xx_serial_console

static struct console s3c24xx_serial_console = {

.name= S3C24XX_SERIAL_NAME,

.device= uart_console_device,

.flags= CON_PRINTBUFFER,

.index= -1,

.write= s3c24xx_serial_console_write,

.setup= s3c24xx_serial_console_setup

};

上面是控制台的结构体成员。

对于UART驱动,我们除了需要注册uart_driver外,还需要注册端口,我们看看s3c2440.o。

这个文件里面注册了一个平台设备,其中平台设备的探测函数最终调用了samsung.o中的s3c24xx_serial_probe函数。

int s3c24xx_serial_probe(struct platform_device *dev,

struct s3c24xx_uart_info *info)

{

struct s3c24xx_uart_port *ourport;

int ret;

dbg("s3c24xx_serial_probe(%p, %p) %d\n", dev, info, probe_index);

ourport = &s3c24xx_serial_ports[probe_index]; //选择s3c24xx_uart_port

probe_index++; //索引号自增

dbg("%s: initialising port %p...\n", __func__, ourport);

ret = s3c24xx_serial_init_port(ourport, info, dev);//初始化串口

if (ret < 0)

goto probe_err;

dbg("%s: adding port\n", __func__);

uart_add_one_port(&s3c24xx_uart_drv, &ourport->port); //向内核注册端口

platform_set_drvdata(dev, &ourport->port); //设置私有数据

ret = device_create_file(&dev->dev, &dev_attr_clock_source); //添加设备属性

if (ret < 0)

printk(KERN_ERR "%s: failed to add clksrc attr.\n", __func__);

ret = s3c24xx_serial_cpufreq_register(ourport);//注册CPU频率

if (ret < 0)

dev_err(&dev->dev, "failed to add cpufreq notifier\n");

return 0;

probe_err:

return ret;

}

通过上面的函数,我们发现在UART层,我们调用了uart_add_one_port函数完成端口的添加,我们来看看添加了什么端口呢?

static struct s3c24xx_uart_port s3c24xx_serial_ports[CONFIG_SERIAL_SAMSUNG_UARTS] = {

[0] = {

.port = {

.lock= __SPIN_LOCK_UNLOCKED(s3c24xx_serial_ports[0].port.lock),

.iotype= UPIO_MEM,

.irq= IRQ_S3CUART_RX0,

.uartclk= 0,

.fifosize= 16,

.ops= &s3c24xx_serial_ops,//对UART操作的函数

.flags= UPF_BOOT_AUTOCONF,

.line= 0,

}

},

[1] = {

.port = {

.lock= __SPIN_LOCK_UNLOCKED(s3c24xx_serial_ports[1].port.lock),

.iotype= UPIO_MEM,

.irq= IRQ_S3CUART_RX1,

.uartclk= 0,

.fifosize= 16,

.ops= &s3c24xx_serial_ops,//对UART操作的函数

.flags= UPF_BOOT_AUTOCONF,

.line= 1,

}

},

#if CONFIG_SERIAL_SAMSUNG_UARTS >2

[2] = {

.port = {

.lock= __SPIN_LOCK_UNLOCKED(s3c24xx_serial_ports[2].port.lock),

.iotype= UPIO_MEM,

.irq= IRQ_S3CUART_RX2,

.uartclk= 0,

.fifosize= 16,

.ops= &s3c24xx_serial_ops,//对UART操作的函数

.flags= UPF_BOOT_AUTOCONF,

.line= 2,

}

},

#endif

#if CONFIG_SERIAL_SAMSUNG_UARTS >3

[3] = {

.port = {

.lock= __SPIN_LOCK_UNLOCKED(s3c24xx_serial_ports[3].port.lock),

.iotype= UPIO_MEM,

.irq= IRQ_S3CUART_RX3,

.uartclk= 0,

.fifosize= 16,

.ops= &s3c24xx_serial_ops,//对UART操作的函数

.flags= UPF_BOOT_AUTOCONF,

.line= 3,

}

}

#endif

};

在端口的定义中,我们知道s3c24xx_uart_port中定义了一个uart_port结构体,继续跟踪对UART的操作函数

static struct uart_ops s3c24xx_serial_ops = {

.pm= s3c24xx_serial_pm,

.tx_empty= s3c24xx_serial_tx_empty,//发送是否忙

.get_mctrl= s3c24xx_serial_get_mctrl,

.set_mctrl= s3c24xx_serial_set_mctrl,

.stop_tx= s3c24xx_serial_stop_tx,

.start_tx= s3c24xx_serial_start_tx,//类似于write

.stop_rx= s3c24xx_serial_stop_rx,

.enable_ms= s3c24xx_serial_enable_ms,

.break_ctl= s3c24xx_serial_break_ctl,

.startup= s3c24xx_serial_startup,//类似于open

.shutdown= s3c24xx_serial_shutdown,//类似于close

.set_termios= s3c24xx_serial_set_termios,//设置线路规程

.type= s3c24xx_serial_type,

.release_port= s3c24xx_serial_release_port,//释放端口资源

.request_port= s3c24xx_serial_request_port,//申请端口资源

.config_port= s3c24xx_serial_config_port,//配置端口

.verify_port= s3c24xx_serial_verify_port,

};

对于上述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串口总线驱

相关新闻

走安顺进定西 海信冰箱再现教育扶贫“山海情”
2022-01-17 13:48:41
最强性能二合一轻薄本ROG幻X 1月24日即将开启预约
2022-01-17 13:48:30
小米竖向折叠屏 价格有惊喜主打女性市场
2022-01-17 13:48:19
QQ飞车手游S联赛总决赛 真我GT2系列成2022官方指定用机
2022-01-17 13:48:08
免费获得小米有品会员!小米有品有鱼App3月停运给用户送福利
2022-01-17 13:47:57
曝真我GT2 Pro春节前上市 20日举行预沟通会
2022-01-17 13:46:06
【手慢无】240GB固态秒杀促销 仅售168元
2022-01-17 12:12:24
AMD新款Radeon Pro专业卡:终于用上6nm
2022-01-17 12:12:16
《永劫无间》再曝新英雄 顾清寒傲立雪中
2022-01-17 12:12:07
三星新品发布会2月9日召开 S22系列即将登场
2022-01-17 12:12:00
12月显卡出货量下降19%,还是涨价的锅
2022-01-17 12:11:52
Intel i5-12400性能暴涨30%!还是超频管用
2022-01-17 12:11:44
黑鲨和玩家同在!新机沿用SSD存储?
2022-01-17 12:11:36
是买不起的样子:3090ti起步2万3
2022-01-17 12:11:27
无线充电加持!曝iPad Pro 6升级M2处理器
2022-01-17 12:11:19
宁德时代:不差钱还融资是为了增产
2022-01-17 12:11:11
好评94%!7万在线!《战神》PC版疯了
2022-01-17 12:11:00
【必买】支持MagSafe磁吸功能 魅族PANDAER“黑化独角兽”手机壳支持iPhone 13系列
2022-01-17 12:10:53
腾讯游戏:寒假打游戏的时间最多14个小时
2022-01-17 12:10:43
1小时游玩假?腾讯春节防沉迷日历发布
2022-01-17 12:10:34
2月9日亮相 Galaxy S22全新配色将来袭
2022-01-17 12:10:23
京东2022年将招聘超2万高校毕业生
2022-01-17 12:10:15
美国拍卖5G频谱 运营商投入超300亿美元
2022-01-17 12:10:06
8088元起 微软Surface Pro 8 商用版正式开售
2022-01-17 12:09:58
起售或是250欧元 Redmi Note 11将在欧洲发布
2022-01-17 12:09:50
曝真我GT2 Pro春节前上市 20日举行预沟通会
2022-01-17 12:08:06
好料好味道,有礼有年味——京味客祝您虎年福礼满满
好料好味道,有礼有年味——京味客祝您虎年福礼满满
2022-01-17 10:59:35
iPad Pro 6曝光:配置拉满 3月发布 7000起
2022-01-17 10:58:23
非公RTX 3090 Ti显卡海外竟上架:最贵2.9万 翻了一倍
2022-01-17 10:58:14
三星2月9日发布S22系列:真机在官网曝光
2022-01-17 10:58:03
三星S21手机限时立减1450 现3549 今晚截止
2022-01-17 10:56:24
2022年第五届CRO全球责任峰会成功举办
2022年第五届CRO全球责任峰会成功举办
2022-01-17 10:55:22
三星全年卖3亿台手机:卖最多的不是S21
2022-01-17 10:55:01
售价过万!曝三星Galaxy S22 Ultra有1TB版
2022-01-17 10:54:49
2022年PS5必买游戏榜单:照着买没错
2022-01-17 10:54:40
【手慢无】新装机神器 i5-12400F处理器1499元热销
2022-01-17 10:54:30
英特尔13代酷睿或将增大缓存容量 L2 + L3达到68 MB
2022-01-17 10:54:20
功耗爆表 i5-12400超频至 5.2 GHz
2022-01-17 10:54:07
配有手写笔 moto G Stylus手机视频曝光:屏幕开孔位于中央
2022-01-17 10:53:50
小米MIX FOLD2真机上手图曝光 内屏无挖孔
2022-01-17 10:53:38
通话变吵闹?iPhone13移除电话降噪功能
2022-01-17 10:53:25
曝真我GT2 Pro春节前上市 20日举行预沟通会
2022-01-17 10:49:36
周秉钧韩银山一行参观广东东江纵队纪念馆
周秉钧韩银山一行参观广东东江纵队纪念馆
2022-01-17 09:21:35
小米新机海外发售:竟然比小米12 Pro强
2022-01-17 09:09:34
曝真我GT2 Pro春节前上市 20日举行预沟通会
2022-01-17 09:08:04
iPad Pro 6曝光:升级M2处理器并支持120HZ高刷新率
iPad Pro 6曝光:升级M2处理器并支持120HZ高刷新率
2022-01-17 08:41:04
苹果新旗舰AR设备曝光:可支持8K分辨率,售价超万元
苹果新旗舰AR设备曝光:可支持8K分辨率,售价超万元
2022-01-17 08:38:24
三星S22 Ultra曝光:12GB+512GB版本售价超万元
三星S22 Ultra曝光:12GB+512GB版本售价超万元
2022-01-17 08:33:04
成本上升!曝AMD EPYC处理器涨价10%~30%!
成本上升!曝AMD EPYC处理器涨价10%~30%!
2022-01-17 08:31:18
中国区12月显卡出货量出炉:七彩虹近20万出货量稳坐第一
中国区12月显卡出货量出炉:七彩虹近20万出货量稳坐第一
2022-01-17 08:28:59
Intel i5-12400全核超频5.2GHz:最大加速功耗117W
Intel i5-12400全核超频5.2GHz:最大加速功耗117W
2022-01-17 08:27:51
微信iOS版更新加入语音暂停功能:长语音消息可暂停并继续播放
微信iOS版更新加入语音暂停功能:长语音消息可暂停并继续播放
2022-01-17 08:26:14
低级错误!火狐浏览器无法上网原因竟是程序员大小写搞错了
低级错误!火狐浏览器无法上网原因竟是程序员大小写搞错了
2022-01-17 08:24:11
藏起来我就用不了了?教你如何在Win11上找出隐藏IE浏览器
藏起来我就用不了了?教你如何在Win11上找出隐藏IE浏览器
2022-01-17 08:22:23
一键切换不用愁!Win11必备小工具让体验更顺手
一键切换不用愁!Win11必备小工具让体验更顺手
2022-01-17 08:18:40
想让Win11运行Win10开始菜单 下载这个小程序 1秒解决
2022-01-17 07:42:21
曝真我GT2 Pro春节前上市 20日举行预沟通会
2022-01-17 07:40:45
专业卡也用上6nm?AMD新款Radeon Pro专业卡曝光
2022-01-17 06:11:37
PC画质居然更优秀?《战神4》三平台对比
2022-01-17 06:11:29
显卡盲盒!800块有机会抽到RTX3090
2022-01-17 06:11:22
Intel 13代酷睿缓存或将提升至68MB
2022-01-17 06:11:14
三星Galaxy S22发布会将在2月9日23:00开启
2022-01-17 06:11:07
Powerbeats用户集体起诉苹果
2022-01-17 06:10:59
史上最烂《战地》续作!外挂都不想为其更新
2022-01-17 06:10:52
44万人强力围观 小米之家山西分舵开了个话题直接上热搜
2022-01-17 06:10:44
Win11测试出现乱码!中文阅读受到影响
2022-01-17 06:10:34
雷蛇灵刃14发布:标配锐龙9 6900HX 顶配3080Ti 售价1.3万
2022-01-17 06:10:25
美国玩家也氪金!《原神》2021年在美国狂赚近25亿人民币
2022-01-17 06:10:17
小米平板5系列全量更新MIUI13 不会更新的看这里
2022-01-17 06:10:09
苹果首次允许App内第三方支付
2022-01-17 06:10:00
十年了!Windows11新音量调节指示器
2022-01-17 06:09:52
买得起Kindle看不起书 到底谁在为电子水墨屏买单?
2022-01-17 06:09:44
摩托罗拉新机曝光 搭载骁龙SM8475+125W快充
2022-01-17 06:09:34
威刚秀肌肉!PCIe 5.0固态读取速度恐怖!14GB/s
2022-01-17 06:09:25
曝真我GT2 Pro春节前上市 20日举行预沟通会
2022-01-17 06:08:02
曝真我GT2 Pro春节前上市 20日举行预沟通会
2022-01-16 22:46:35
曝iPhone 14全系标配120Hz:起售价还是5999
2022-01-16 21:09:44
ROG新品!在CES推出42英寸显示器 OLED面板
2022-01-16 21:09:33
12代酷睿新品!雷神推出游戏/设计新主机
2022-01-16 21:09:21
曝真我GT2 Pro春节前上市 20日举行预沟通会
2022-01-16 21:08:01
Moto新机曝光,即将开启两亿像素新时代
2022-01-16 19:41:57
小米11系列开启推送MIUI 13系统,公测反馈良好
2022-01-16 19:41:44
红魔7跑分、配置曝光,单核1219,多核3732
2022-01-16 19:40:37
Redmi K50 高配版有望搭载索尼 IMX766 传感器
2022-01-16 19:40:15
解决镀金端子氧化发黑问题 苹果将推新版Lightning充电线
2022-01-16 19:40:02
120Hz高刷 OPPO平板电脑现身跑分网站
2022-01-16 19:39:51
曝真我GT2 Pro春节前上市 20日举行预沟通会
2022-01-16 19:38:29
2000元到手 骁龙680版Redmi Note11要来
2022-01-16 18:10:05
2月9日见!三星S22系列手机发布会定档
2022-01-16 18:09:49
小米 11 Ultra开启内测NFC“读写勿扰”与“解锁后使用”功能
2022-01-16 18:09:35
后置四摄 红米Redmi Note 11S渲染图曝光
2022-01-16 18:09:21
曝真我GT2 Pro春节前上市 20日举行预沟通会
2022-01-16 18:08:02
现磨咖啡5元一杯 蜜雪冰城讨好小镇青年
2022-01-16 17:18:11
又一家中资企业打入日本加密货币市场 Amber数亿日元买下持牌交易所
2022-01-16 17:17:59
电动车 没有新革命
2022-01-16 17:17:47
电动车“私桩共享可行吗”引热议 威马汽车创始人给答案
2022-01-16 17:17:37
防疲劳、还是导航信号?高速路上的绿色激光灯有什么用?
2022-01-16 17:17:25
AT&T、Dish和T-Mobile投入数十亿美元购买更多5G频谱
2022-01-16 17:17:14
美国税局可能会对NFT和加密货币征收不同的税
2022-01-16 17:17:03
虚拟偶像满足粉丝想象?专家预警或影响结婚生子
2022-01-16 17:16:50

热门文章

热点专题