Linux内核和驱动学习
文章平均质量分 82
miketang1419
这个作者很懒,什么都没留下…
展开
-
Linux GPIO驱动 - 驱动框架概述
GPIO是嵌入式开发中最常见的接口,之前自己就有写过小的GPIO驱动,提供ioctl接口给用户空间操作。但直到最近才发现Linux自身就有完善的GPIO驱动框架,并且通过sysfs向用户空间提供操作接口。Linux的GPIO驱动框架层次及数据结构如下:最上层是用来向向用户空间提供接口,用户可以通过该接口方去控制GPIO PIN脚。GPIO通用接口层主要是维护了一个GPIO PIN的数组gpio原创 2015-11-11 18:37:06 · 1400 阅读 · 0 评论 -
Linux tty驱动学习 - 在用户空间设置串口参数操作流程
用户在使用串口的时候,需要在用户空间设置串口属性,一种是直接通过驱动的ioctl去操作,但常用的方法是使用glibc的库函数来操作,比如常用的tcsetattr()和tcgetattr()函数。以tcsetattr()为例,该函数定义在glibc的tcsetattr.c中。tcsetattr()的第一个参数为打开的串口设备描述符,第三个参数为要设置的串口新属性,第二个参数为设置操作的模式,TCSA原创 2016-01-14 18:24:51 · 5289 阅读 · 1 评论 -
Linux tty驱动学习 - UART驱动的read操作流程
在用户空间对tty设备进行读操作,经过系统调用进入到tty核心层执行的第一个函数是tty_read()。在tty_read()函数中,从文件描述符file的私有数据结构中获得tty_struct,然后再从tty_struct中获取线路规程描述符。取得线路规程描述符后,直接调用线路规程的read()函数。static ssize_t tty_read(struct file *file, cha原创 2016-01-12 11:23:59 · 7899 阅读 · 2 评论 -
Linux tty驱动学习 - UART驱动的write操作流程
从tty核心层到最后把数据写入到硬件,整个操作流程如下:tty_write() -> do_tty_write() -> n_tty_write() -> uart_write() -> serial8250_start_tx() -> serial_out()。也就是从tty核心层到线路规程,然后到tty驱动层,再到UART驱动层,最后到UART端口的输出寄存器中。首先看tty核心的写操作t原创 2016-01-06 19:43:59 · 8191 阅读 · 2 评论 -
Linux tty驱动学习 - 串口通信,UART及UART驱动概述
数据在单条传输线上,一位接一位地按顺序传送的方式称为串行通信。串行通信有两种方式:异步方式和同步方式。实现串行通信的接口叫串行接口,它主要的功能就是实现CPU与输入输出设备之间的串并行转换。把从CPU传送过来的并行数据转换成串行从输出设备输出,以及把从输入设备输入的串行数据转换成并行数据送给CPU。串行通信中,因为数据是一位一位地传输,所以为了是接收端能够识别接收到每位数据的具体意思,收发双方就需原创 2015-12-21 19:46:26 · 3779 阅读 · 1 评论 -
Linux tty驱动学习 - UART驱动的open操作
/dev/ttyS*属于字符设备,所以在用户空间调用open系统调用打开该类设备,进入到tty核心层后调用的第一个函数是tty_fops中的tty_oepn。tty_open的前面三个判断是根据设备主次设备号来判断设备的类型,分别为/dev/tty(5,0),/dev/tty0(4.0),/dev/console(5,1),分别表示当前控制终端,当前虚拟终端,当前控制台终端。而uart设备对应的设原创 2016-01-02 20:18:18 · 3810 阅读 · 1 评论 -
Linux GPIO驱动 - GPIO通用层
如果在内核配置的时候有打开CONFIG_GPIO_SYSFS标志,内核就会在/sys目录下导出GPIO的用户空间操作接口。gpiolib_sysfs_init(drivers/gpio/gpiolib.c)是gpio lib的初始化函数,该函数首先在/sys/class/目录下面创建一个gpio的class,然后把所以注册到gpio lib的控制器导出到/sys/class/gpio/目录下面。原创 2015-11-26 18:50:49 · 1395 阅读 · 0 评论 -
Linux tty驱动学习 - UART驱动注册
8250/16550系列芯片为常见的UART芯片,该类芯片的驱动文件为8250.c,位于内核源码的/drivers/serial/目录下面。serial8250_init为该驱动的入口函数,nr_uarts和UART_NR在内核配置中定义,跟具体的平台相关,通常定义为4。由于CONFIG_SPARC没有被定义,所以做的第一件事情就是注册一个名为serial_8250_reg的UART驱动。stat原创 2015-12-28 19:05:17 · 1520 阅读 · 0 评论 -
Linux tty驱动学习 - LDD3的tty驱动
Linux中的tty驱动分三大类:串口,终端,PTY伪终端,控制台和PTY驱动内核已经编写好,所以在开发移植过程中接触到的通常是串口驱动。linux的tty驱动框架如下图所示,最上层的是tty核心层,该层负责把tty驱动注册成字符设备驱动,并提供使用接口给用户空间。tty线路规程用来实现用户空间和设备驱动之间的数据格式转换,比如采用UART接口的3G模块就会用到线路规程里面的ppp_ldisc设置原创 2015-12-14 18:41:01 · 1006 阅读 · 0 评论 -
Linux GPIO驱动 - 硬件及硬件抽象层
在很多的SOC芯片里,GPIO硬件接口都是和其它硬件接口共用Pin脚,然后通过特定的寄存器去设置Pin使用时的类型。比如目前手上的项目使用的是Marvell的SOC芯片,该芯片上有50个多功能Pin脚(MPP:Multi-Purpose Pins),每个Pin都可以配置成不同的功能。SOC提供了7个32位的寄存器用来配置MPP Pin的类型,寄存器的每4位对应一个Pin,一个寄存器控制可以8个Pi原创 2015-11-17 18:30:58 · 1981 阅读 · 0 评论