linux设备驱动
小小城御园
生命在于折腾,知识在于积累
展开
-
总线驱动和普通驱动的区别
1.总线驱动中不但有驱动的注册,还有设备的注册,当设备注册的时候会寻找与之匹配的驱动,相反的注册驱动的时候也会寻找与之匹配的设备,由函数match完成,如果匹配成功了那就表明这个设备已经可以使用了struct platform_device s3c_device_wdt ={ .name = "s3c2410-wdt", //设备名 .id = - 1, ....原创 2018-11-13 09:40:43 · 1258 阅读 · 2 评论 -
set_fs和get_fs函数在vfs_read和vfs_write使用时的作用
linux内核中文件的操作函数为: ssize_t vfs_read(struct file* filp, char __user* buffer, size_t len, loff_t* pos); ssize_t vfs_write(struct file* filp, const char __user* buffer, size_t len, loff_t* pos);注意...原创 2018-12-18 22:36:10 · 1828 阅读 · 0 评论 -
linux内核态文件操作函数
1.打开文件struct file *filp_open(const char *filename, int flags, int mode)filename:要打开的文件的路径 例:“/dev/ttyGS0”flags:打开文件的方式O_CREAT 创建O_RDWR 读写 O_RDONLY 只读O_WRONLY 只写O_TRUNC 清空...原创 2018-12-18 23:03:48 · 527 阅读 · 0 评论 -
%d几种输出方式
%d就是普通的输出了% 2d是将数字按宽度为2,采用右对齐方式输出,如果数据位数不到2位,则左边补空格。% -2d是将数字按宽度为2,采用左对齐方式输出,如果数据位数不到2位,则右边补空格。%02d:默认情况下,数据数据宽度不够2位是用空格填补的,但是因为2d前面有0,表示,数据宽度不足时用0填补。%.2d和% 02d一样例:#include <linux/init...原创 2018-12-18 23:16:07 · 4962 阅读 · 0 评论 -
__define_initcall(level,fn)和do_initcalls()的妙用
__define_initcall(level,fn)将一系列初始化函数的起始地址值按照一定的顺序放在一个section中。在内核初始化阶段,do_initcalls()将按顺序从section中以函数指针的形式取出这些函数的起始地址,来依次完成相应的初始化。由于内核某些部分的初始化需要依赖于其他某些部分的初始化的完成,因此这个顺序排列常常非常重要。一、分析__define_i...转载 2019-06-02 15:08:18 · 614 阅读 · 0 评论 -
module_init与module_exit的分析
在编写驱动模块的时候有两个函数经常被使用也必须被使用,分别是module_init和module_exit,这两个函数分别在加载和卸载驱动时被调用,即调用insmod和rmmod命令的时候,但是insmod和rmmod不能识别这两个函数,它只能识别init_module和cleanup_module,其实init_module和cleanup_module相当于是module_in...原创 2019-06-02 16:04:47 · 5846 阅读 · 0 评论 -
Linux SPI总线和设备驱动架构之一:系统概述
SPI是"Serial Peripheral Interface" 的缩写,是一种四线制的同步串行通信接口,用来连接微控制器、传感器、存储设备,SPI设备分为主设备和从设备两种,用于通信和控制的四根线分别是:CS 片选信号SCK 时钟信号MISO...转载 2019-06-02 20:12:17 · 166 阅读 · 0 评论 -
Linux SPI总线和设备驱动架构之二:SPI通用接口层
通过上一篇文章的介绍,我们知道,SPI通用接口层用于把具体SPI设备的协议驱动和SPI控制器驱动联接在一起,通用接口层除了为协议驱动和控制器驱动提供一系列的标准接口API,同时还为这些接口API定义了相应的数据结构,这些数据结构一部分是SPI设备、SPI协议驱动和SPI控制器的数据抽象,一部分是为了协助数据传输而定义的数据结构。另外,通用接口层还负责SPI系统与Linux设备模型相...转载 2019-06-02 20:53:51 · 239 阅读 · 0 评论 -
Linux SPI总线和设备驱动架构之三:SPI控制器驱动
通过第一篇文章,我们已经知道,整个SPI驱动架构可以分为协议驱动、通用接口层和控制器驱动三大部分。其中,控制器驱动负责最底层的数据收发工作,为了完成数据的收发工作,控制器驱动需要完成以下这些功能:申请必要的硬件资源,例如中断,DMA通道,DMA内存缓冲区等等; 配置SPI控制器的工作模式和参数,使之可以和相应的设备进行正确的数据交换工作; 向通用接口层提供接口,使得上层的协...转载 2019-06-02 21:00:53 · 290 阅读 · 0 评论 -
Linux SPI总线和设备驱动架构之四:SPI数据传输的队列化
我们知道,SPI数据传输可以有两种方式:同步方式和异步方式。所谓同步方式是指数据传输的发起者必须等待本次传输的结束,期间不能做其它事情,用代码来解释就是,调用传输的函数后,直到数据传输完成,函数才会返回。而异步方式则正好相反,数据传输的发起者无需等待传输的结束,数据传输期间还可以做其它事情,用代码来解释就是,调用传输的函数后,函数会立刻返回而不用等待数据传输完成,我们只需设置一个回...转载 2019-06-02 21:08:50 · 430 阅读 · 1 评论 -
构造和运行模块
目录当前进程浮点计算编译模块版本宏符号表初始化错误处理驱动参数当前进程内核模块不像应用程序那样顺序的执行,但是内核执行的大多数操作还是和某个进程相关。内核代码可以通过访问全局项current来获得当前进程的信息,current定义在<asm/current.h>中,是一个指向struct task_struct的指针,struct task_stru...原创 2019-08-17 14:20:07 · 187 阅读 · 0 评论 -
linux I2C驱动框架之总线驱动(二)
目录总线驱动注册与加载添加设备到系统中总线驱动侧处理I2C总线通信方式总线驱动注册与加载以S3C-2410为例:由于总线控制器通常是在内存上的,所以它本身也连接在platform总线上,要通过platform_driver和platform_device的匹配来执行。S3C-2410的i2c_adapter框架是基于 platform_bus_type 的,当设备或驱动...原创 2019-09-01 22:33:28 · 429 阅读 · 0 评论 -
linux I2C驱动框架之I2C核心(三)
I2C 核心(drivers/i2c/i2c-core.c)中提供了一组不依赖于硬件平台的接口函数,这个文件一般不需要被工程师修改,但是理解其中的主要函数非常关键,因为I2C 总线驱动和设备驱动之间依赖于I2C 核心作为纽带。I2C 核心中的主要函数如下。 增加/删除i2c_adapter。 int i2c_add_adapter(struct i2c_adapter *ada...原创 2019-09-01 22:59:56 · 177 阅读 · 0 评论 -
function declaration isn’t a prototype错误解决办法
一般出现该问题的原因为,一个函数在没有参数的情况下没有赋参数void。例:程序如下#include <linux/init.h>#include <linux/module.h>static int globalfifo_setup_cdev(){ return 1;}static int __init globalfifo_init(voi...原创 2018-12-13 22:51:03 · 16422 阅读 · 0 评论 -
void value not ignored as it ought to be解决方法
编译时出现“void value not ignored as it ought to be”错误,原因是因为,一个函数的返回值为void,但是你又把这个函数的返回值赋值给了一个具体类型的变量。例:代码如下#include <linux/init.h>#include <linux/module.h>struct globalfifo_dev { unsi...原创 2018-12-13 22:34:39 · 80220 阅读 · 0 评论 -
linux如何判断哪一个串口是当前正在使用
使用cat /proc/tty/driver/serialserinfo:1.0 driver revision:0: uart:16550A port:000003F8 irq:4 tx:0 rx:0 CTS|DSR|CD1: uart:16550A port:000002F8 irq:3 tx:0 rx:0 CTS|DSR|CD2: uart:unknown port...原创 2018-11-11 20:36:09 · 9689 阅读 · 3 评论 -
申请设备号时两个函数使用上的差异
一、Linux上向系统申请设备号的时候分为两种情况 在已知设备号的情况使用如下函数 函数原型如下:int register_chrdev_region(dev_t from, unsigned count, const char *name); from:设备号 count:是你请求的连续设备数量. na...原创 2018-11-13 11:57:39 · 244 阅读 · 0 评论 -
tty驱动之tty_operations结构体详解
struct tty_operations { struct tty_struct * (*lookup)(struct tty_driver *driver, struct inode *inode, int idx);//返回对应的tty设备, 若为NULL则返回ERR_PTR, 在tty_mutex函数中调用 ...原创 2018-11-13 22:49:54 · 2179 阅读 · 1 评论 -
uart_ops结构体分析之amba_pl011_pops
static struct uart_ops amba_pl011_pops = { .tx_empty = pl01x_tx_empty, //串口的tx_fifo是否为空 .set_mctrl = pl011_set_mctrl, //设置串口的modem控制,xyz .get_mctrl = pl01x_get_mctrl, ...原创 2018-11-15 23:09:13 · 1692 阅读 · 0 评论 -
tty_operations结构体之uart_ops分析
static const struct tty_operations uart_ops = { .open = uart_open, .close = uart_close, .write = uart_write, .put_char = uart_put_char,//单字符写入函数 .flush_chars = uart_flush_chars, .write_room...原创 2018-11-15 23:22:30 · 2172 阅读 · 0 评论 -
uart tty console amba 驱动详解
好难啊原创 2018-11-12 20:14:47 · 532 阅读 · 1 评论 -
spi协议详解
1.概念SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口。SPI,是一种高速的,全双工(可以同时接收和发送数据),同步的通信总线(接收端和发送端必须在同一时刻接收和发送),并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议。 ...原创 2018-08-27 23:42:54 · 2549 阅读 · 0 评论 -
I2C协议详解
1 I2C总线知识1.1 I2C总线物理拓扑结构 I2C 总线在物理连接上非常简单,分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成。通信原理是通过对SCL和SDA线高低电平时序的控制,来产生I2C总线协议所需要的信号进行数据的传递。在总线空闲状态时,这两根线一般被上面所接的上拉电阻拉高,保持着高电平。1.2 I2C总线...原创 2018-08-27 22:15:49 · 4925 阅读 · 1 评论 -
win10下汇编环境搭建心得
1 工具准备 1)下载DOSBOX 工具介绍:DOSBox 是一个 DOS 模拟程序,由于它采用的是 SDL 库,所以可以很方便的移植到其他的平台。目前,DOSBox 已经支持在 Windows、Linux、Mac OS X、BeOS 、palmOS、Android 、webOS、os/2等系统中运行。 2)下载MASM32 工具介绍:MASM32...原创 2018-01-24 20:59:56 · 588 阅读 · 0 评论 -
tty驱动框架分析
tty框架如下图所示:整个 uart 框架大概的样子如上图所示,大致可以分为四层,一层是下层我们的串口驱动层,它直接与硬件相接触,我们需要填充一个 struct uart_ops 的结构体,再向上是tty核心层,在向上是线路规程,再向上是是直接和用户空间对接的,它们每一层都有一个 Ops 结构,用户空间通过tty注册的字符设备节点来访问,这么说来如上图所示涉及到了4个 ops 结构了,层层...原创 2018-11-25 23:05:37 · 1710 阅读 · 0 评论 -
usb骨架程序学习
Linux 内核源代码中的driver/usb/usb-skeleton.c 文件为我们提供了一个最基础的USB 驱动程序,即USB骨架程序,可被看做一个最简单的USB 设备驱动实例。尽管具体USB 设备驱动千差万别,但其骨架则万变不离其宗。首先看看 USB 骨架程序的usb_driver 结构体定义,如代码清单1.1所示。static struct usb_driver skel_driv...原创 2018-11-27 23:41:15 · 207 阅读 · 0 评论 -
usb设备配置接口端点
在 USB 设备的逻辑组织中,包含设备、配置、接口和端点4 个层次。每个 USB 设备都提供了不同级别的配置信息,可以包含一个或多个配置,不同的配置使设备表现出不同的功能组合(在探测/连接期间需从其中选定一个),配置由多个接口组成。 在 USB 协议中,接口由多个端点组成,代表一个基本的功能,是USB 设备驱动程序控制的对象,一个功能复杂的USB 设备可以具有多个接口。每...原创 2018-12-03 22:35:05 · 1370 阅读 · 0 评论 -
驱动编译进内核没问题,编译成模块报函数未定义错误
报错形式如下所示:其中test为函数名WARNING: "test"[*******.ko] undefined!解决办法为:将函数test导出符号到内核符号表。可以使用如下两种方式EXPORT_SYMBOL(符号名);//函数名 = 符号名EXPORT_SYMBOL_GPL(符号名);导出的符号将可以被其他模块使用,使用前声明一下即可。EXPORT_SYMBOL_GPL...原创 2018-12-13 22:12:16 · 1928 阅读 · 0 评论 -
module license 'unspecified' taints kernel解决方法
当加载驱动出现如下字样:module license 'unspecified' taints kernel 或Disabling lock debugging due to kernel taint需要加入MODULE_LICENSE("GPL");模块许可证,就可以避免这个错误。模块许可证(LICENSE)声明描述内核模块的许可权限,如果不声明LICENSE,模块被加载时...原创 2019-09-13 09:48:02 · 8920 阅读 · 1 评论