### Linux串口驱动和中断共享知识点详解 #### 一、Linux串口接口及层次 Linux下的串口驱动设计已经十分成熟和完善,为开发者提供了统一的编程接口。串口驱动的核心工作在于针对不同的串口集成电路(IC)来实现特定的配置宏,这些配置宏涉及到读写操作、中断的开启与关闭(例如发送与接收中断)、接收状态处理等。如果串口支持FIFO(先进先出缓冲区),还需要处理FIFO的相关状态。 #### 1. 串口硬件资源的处理 以W83697和W83977为例,它们在EP93xx板子上的映射情况如下: - **W83697**:起始于0x20000000,占用1K的空间。 - **W83977**:起始于0x30000000,同样占用1K的空间。 由于串口设备的特殊性,它可以作为终端使用。然而,在内核尚未完全初始化之前,即在mem_init()函数执行前,无法通过ioremap进行物理内存到虚拟内存的映射。这是因为物理内存必须先由内核映射成虚拟内存后才能进行读写访问。 #### 2. 终端与串口的关联及层次 终端的注册和使用路径如下: ``` start_kernel → console_init → uart_console_init → ep93xx_uart_console_init → register_console → console_uart_console_write ``` 相比之下,FrameBuffer显卡驱动中物理内存的映射路径为: ``` start_kernel → rest_init → init(内核初始化线程) → do_basic_setup → do_initcalls → fbmem_init → lanrryfb_init ``` 这里提到的`__setup`和`__initcall`机制都是Linux内核中用于不同初始化阶段的标记。`__setup`通常用于早期的初始化过程,而`__initcall`则在内核初始化完成后被调用。 #### 3. 串口物理内存映射的时机 串口物理内存映射的关键在于找到合适的时机进行映射。根据以上路径分析,串口物理内存的映射必须在`mem_init`之后进行,也就是在内核内存初始化完成之后。 #### 4. 串口物理内存的映射方式 EP93xx板子上的所有物理I/O设备都一次性映射到了虚拟地址空间,映射的基址是`IO_BASE_VIRT`,其大小是`IO_SIZE`。 ``` /* Where in virtual memory the IO devices (timers, system controllers * and so on). This gets used in arch/arm/mach-ep93xx/mm.c. */ #define IO_BASE_VIRT 0xFF000000 // Virtual address of IO #define IO_BASE_PHYS 0x80000000 // Physical address of IO #define IO_SIZE 0x00A00000 // How much? ``` 映射函数`ep93xx_map_io`负责完成所有需要映射的内存区域,包括串口IC的映射。在`linux-2.4.21/include/asm-arm/arch-ep93xx/regmap.h`文件中定义了以下常量: ``` #define IO_W83697_UART_BASE 0x20000000 #define IO_W83697_UART_SIZE 0x1000 #define IO_W83977_UART_BASE 0x30000000 ``` #### 二、Linux的中断机制及中断共享机制 Linux的中断处理机制是操作系统中最核心的部分之一。对于多个设备共享同一个中断线的情况,Linux提供了中断共享机制,允许不同的设备通过软件区分各自的数据流,从而避免冲突。 #### 1. 中断处理机制 - **硬件中断**:当硬件检测到特定条件时,会向CPU发出中断信号。 - **软件中断**:由软件触发,例如在串口中断处理程序中可能会触发软中断来进行进一步处理。 #### 2. 中断共享机制 当多个设备共享同一个中断线时,需要一种机制来区分每个设备产生的中断信号。Linux通过以下几种方式实现了中断共享: - **IRQ亲和性**:设置中断线与CPU核心之间的亲和关系,使得特定的中断只在指定的CPU上处理。 - **中断优先级**:通过设置不同的优先级,使得高优先级的中断能够优先得到处理。 - **共享中断处理程序**:多个设备可以共用一个中断处理程序,通过特定的标识来区分各自的中断事件。 #### 三、Linux的软中断机制 软中断是一种由硬件中断引发的更高层次的中断处理机制,主要用于处理那些不紧急但需要及时响应的任务。在串口驱动中,软中断机制通常用来处理串口缓冲区的操作,比如读取或清除缓冲区。 #### 四、TTY与串口的具体关联 TTY(TeleTYpe)是一种将终端设备抽象化的概念,它将各种类型的输入/输出设备(如串口、虚拟控制台等)统一封装为TTY设备节点。串口作为TTY的一种,可以通过TTY接口进行数据交换。在Linux中,串口驱动与TTY层之间存在一个清晰的接口层次结构,使得串口设备可以像其他TTY设备一样被管理和使用。 #### 五、串口使用示例说明 在实际应用中,串口驱动的开发通常遵循以下步骤: 1. **硬件初始化**:配置串口IC的基础参数,如波特率、数据位数等。 2. **中断配置**:设置中断线的连接方式,并编写中断处理程序。 3. **TTY接口实现**:实现TTY层所需的接口,使串口设备能够作为一个标准的TTY设备使用。 4. **数据处理**:处理接收到的数据,包括错误检测、缓冲区管理等。 通过上述步骤,开发者可以创建一个功能完整的串口驱动程序,实现与其他设备的数据交互。






















剩余16页未读,继续阅读

- 粉丝: 10
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 基于JSP的校园网站的设计与实现论文.doc
- 利用单片机制作简单万年历.doc
- 正确选择财务管理软件[会计实务-会计实操].doc
- 学校开展“2022年网络安全宣传周”活动方案.docx
- 系统集成-大屏监控系统使用说明书.doc
- 普通高中语文教学导向深度学习实践研究方案.doc
- 计算机网络技术模拟试题及答案(最终).doc
- 幼儿园语言文字领导小组网络图.pdf
- 网络防火墙需求分析.doc
- 在Excel中判断单元格是否包含日期【会计实务操作教程】.pptx
- 井下人员定位系统与通信联络系统.ppt
- (源码)基于C++ROS框架的机器人控制系统.zip
- 工程项目管理团队建设.ppt
- 教你如何选择合适的财务软件 .pdf
- 基于单片机的AD转换电路与程序设计.doc
- 网络分析仪E6607C操作指导.ppt



- 1
- 2
- 3
前往页