- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
自己写的,intel8250,串口芯片驱动
一:前言
串口是一种常用的接口,嵌入式开发环境中,开发板通常都会提供串口与PC相连,方便开发者进行测试。在较早的网络环境中。UNIX主机通过串口连moden再接通电话线来连通对方电脑。类似于今天的telnet。串口经常用来做远程终端使用。类似于我们之前分析的终端控制台驱动。不过,不相同的是,终端驱动的输入数据是从键盘鼠标等I/O外设中来,到显示器上显示。而串口终端的数据来源跟数据输出都是串口。对于运行中的进程来说,它不需要知道运行在什么样的终端。Tty层把终端层给封装起来了.
查找了一相有关PC平台上的8250串口芯片资料,结合之前分析的uart架构自己写了一个串口驱动。
在写驱动的过程中,并没有参考linux自带的8250芯片驱动。目的是为了在写完之后,和linux 自带的驱动比较,就能发现自己的不足。
在驱动中,按着对端设备的数据模式设定了波特率和数据格式。并末实现termios库中关于串口参数的设定。不过在驱动中都写好了接口函数。按操作接口将其链入即可。
另外:忽略了moden信号的处理。
二:串口的硬件架构
在pc中常使用的串口芯片是8250,16450,16450A等。这些芯片都是从8250发展而来的。都往下与8250保持兼容。由于我手头只有8250和16450的详细的资料,代码分析时侧重于这两种类型的芯片分析. 如果有朋友能够提供其它芯片的资料,我会感激不尽^_^.
8250提共了9个寄存器。严格说来,只有8个。因为其中有两个寄存器是共享同一个寄存器。各寄存器的作用与寄存位的含义如下表所示:
?
?
?
?
?
在上图的端口地址标识中,小括号中还有一个地址。这是因为在PC中。一般都会有两个串口。括号外的是主串口的端口地址,而括号里面的是从串口地址。
从上图可以看到8250的寄存器比较繁多,操作比较复杂。我们依次来看每个寄存器的含义:
数据接收寄存器(RBR): 存放接收到的数据。这些数据是已经去掉了发送位,停止位和奇偶检验位了的。也就是串口接收到的有效数据。
?
数据发送寄存器(THR):用来存放要发送的数据。这是用户要写入的数据。不包含上述的附加位。
从上图中可以看到,RBR和THR的端口地址是一样的。也就是说,它们是操作的是同一个寄存器。只有在寄存器空闲的时候,才能写入数据。也就是说,我们在中断/轮询处理过程中,先把这个寄存器的值取出。然后再写入我们要发送的数据。
?
中断允许寄存器(IER):8250有四级中断。分别为:接收出错中断。接收寄存器满中断。发送寄存器空中断。Moden状态改变中断。四种中断都对应寄存器的1个位。剩余四位无意义,为0。从这里可以看到,发送数据并不是每次都要等接收中断来了,才能发送。也可以在发送寄存器空的中断处理中发送。
?
中断标识寄存器(IIS):既然8250对应有四种中断。那中断过来之后,怎么区分是哪种类型的中断呢?这就是中断标识寄存器的作用。IIS中有表示中断状态的对应位。都是相对于IER来说的。另外,与IER的高四位始终为0的情况相反的是,IIS的前二位能够驱分芯片的类型。如:8250的IIS前二位为00。而16550A芯片的IIS前二位为11。这里顺带提一下8250和16550A的区别:8250每次只能接收或者发送1个字节。,而16550A则提供了一个FIFO缓存区。有16个字节的缓存空间。这样就可以减轻CPU的负担。在16550A中,新增了一个寄存器FIFO控制寄存器(FCR).其中有一个标识可以启用或者禁用FIFO。
?
线路控制寄存器(LCR):可以用来控制数据的传输方式。比如说设置奇偶检验位,数据位的长度,停止位等。
?
Moden控制寄存器(MCR):用来向moden发送RTS/DTR信号。在这个寄存器中还要注意有二个特殊的位。一个是自检位。该位被置之后,数据在8250的内部移动。可以用来检测8250数据接收与发送功能。另外的一个位是中断允许位。它允许8250向CPU产生中断.
?
线路状态寄存器(LSR):用来检查线路的状态。例如数据包出错原因,发送寄存器/接收寄存器空状态标识以及终止符检测。
?
Moden状态寄存器检测(MSR):用来采集moden的状态。例如DSR和CTS信号检测。载波检测等.
?
除法寄存器:一般用来设定波特率:它是低8位在发送/读取寄存器。高8位在IER寄存器,通过LCR有最高位来控制除法寄存器是否可用。
?
三:驱动代码
Kernel版本:2.6.25
代码:见附件
调试:可以用minicom,选择设备节点为:/dev/8250X(主串口为0,次串口为1)。如果你没有配置udev或者hotplug,就需要手动在/dev/下mknod相关结点。
附运行时候的截图:
?
?
?
附件:
?
文件:
serial_driver.tar.b
文档评论(0)