linux内核驱动
FrakeJim
这个作者很懒,什么都没留下…
展开
-
Linux input按键设备驱动
本文基于mini2440开发板,Linux版本号是:linux-2.6.32.2一. input模块的注册input模块被当成了一个字符设备,注册到内核中。#define INPUT_MAJOR 13static int __init input_init(void){ int err; err = register_chrdev(INPUT_MAJOR, "input"...原创 2019-03-31 22:52:01 · 1734 阅读 · 0 评论 -
root hub 接口device和接口driver的注册(六)
在介绍root hub usb设备和驱动的匹配时,usb_set_configuration函数会从usb设备描述符里面知道有多少个配置,多少个接口,多少个设置,多少个端口,然后会为每一个接口添加一个设备。这里看一下root hub的接口driver的注册。在usb_init函数初始化时:static int __init usb_init(void){ …… retval...原创 2019-04-28 22:37:34 · 317 阅读 · 0 评论 -
root hub接口device和接口driver的匹配(七)
前面root hub 接口device和接口driver都是用的总线usb_bus_type。但是这个时候device的类型是usb_if_device_type,不在是usb_device_type,也就是usb接口设备,而不是usb设备。那么注册设备的时候,会自动遍历总线上的所有驱动,看看那个驱动能匹配上;注册驱动的时候,也会遍历总线上的所有设备,看看那个设备能匹配上;usb_bus_t...原创 2019-04-28 22:42:50 · 1025 阅读 · 1 评论 -
发现新的usb设备(八)
在创建主机控制器设备时,创建了一个定时器hcd->rh_timer,定时器的执行函数是rh_timer_func,这个定时器在后面会用到。在hub_configure函数中创建了一个中断urb请求。static int hub_configure(struct usb_hub *hub, struct usb_endpoint_descriptor *endpoint){ …… h...原创 2019-04-28 22:45:48 · 1301 阅读 · 0 评论 -
注册新的usb设备(九)
在hub_events函数中,如果确实检测到端口状态有变化,这个变化有可能是物理上,也有可能是逻辑上的。那么调用hub_port_connect_change函数。这个变化主要有三种:一个是连接有变化;二个是端口本身重新使能,即所谓的enable,这种情况通常就是为了对付电磁干扰的;第三种情况就是在复位一个设备的时候发现其描述符变了,这通常对应的是硬件本身有了升级;看一下hub_port_...原创 2019-04-28 22:47:59 · 1282 阅读 · 0 评论 -
新的usb设备和驱动的匹配(十)
新的usb设备的总线是usb_bus_type,类型是usb_device_type。根据前面root hub设备的device和driver的匹配可知,这里的probe函数还是调用的generic_probe。跟root hub usb设备和驱动的匹配走的流程是一样的:先选择一个合适的配置,然后调用usb_set_configuration函数去设置;根据configured可以知道有多少...原创 2019-04-28 22:51:00 · 1777 阅读 · 0 评论 -
新的usb设备的接口device和接口driver的注册匹配(十一)
新的usb接口设备的dev参数,接口设备在函数usb_set_configuration中注册。intf->dev.bus = &usb_bus_type;intf->dev.type = &usb_if_device_type;intf->dev.groups = usb_interface_groups;总线是usb_bus_type,设备类型是us...原创 2019-04-28 22:56:55 · 1585 阅读 · 0 评论 -
USB的一些相关知识点(一)
本文是基于mini2440开发板Linux版本号是linux-2.6.32.2的学习笔记参考于:https://blog.csdn.net/qq_16777851/column/info/32105/2一. 配置,接口,设置,端口配置:每个USB设备,可以有一个或多个配置(在probe期间,需要选择一种配置)。不同的配置体现出不同的组合接口。比如一个MP4设备,可以有按键,视屏,音频,旋...原创 2019-04-28 22:19:19 · 821 阅读 · 0 评论 -
Linux音频驱动之一:音频驱动注册流程
本文是基于mini2440开发板Linux版本号是linux-2.6.32.2的学习笔记一.uda134x平台设备的注册static struct s3c24xx_uda134x_platform_data s3c24xx_uda134x_data = { .l3_clk = S3C2410_GPB(4), .l3_data = S3C2410_GPB(3), .l3_mode = S3...原创 2019-04-21 14:08:05 · 4221 阅读 · 0 评论 -
bus总线相关的注册函数
一. bus_type结构体描述struct bus_type { const char *name; //总线类型的名称 struct bus_attribute *bus_attrs; //总线属性 struct device_attribute *dev_attrs; ...原创 2019-05-05 22:34:11 · 903 阅读 · 0 评论 -
device的注册流程
一. device结构体描述struct device { struct device *parent; //该设备的父设备,一般是该设备所从属的bus、controller等设备 struct device_private *p; //device的私有数据 struct kobject kobj; ...原创 2019-05-05 22:34:49 · 797 阅读 · 0 评论 -
driver的注册流程
一.device_driver结构体描述struct device_driver { const char *name; //该driver的名称 struct bus_type *bus; //该driver所驱动设备的总线设备 struc...原创 2019-05-05 22:35:55 · 841 阅读 · 0 评论 -
class注册流程
一. class结构体描述struct class{ const char *name; //class的名称,会在“/sys/class/”目录下体现 struct module *owner; struct class_attribute *class_attrs; //该class的默认attribute ...原创 2019-05-05 22:36:44 · 1101 阅读 · 0 评论 -
root hub usb设备和驱动的匹配(五)
注册driver的函数是driver_register,device_driver传参如下:new_udriver->drvwrap.for_devices = 1;new_udriver->drvwrap.driver.name = (char *) new_udriver->name;new_udriver->drvwrap.driver.bus = &u...原创 2019-04-28 22:35:23 · 1944 阅读 · 0 评论 -
root hub设备驱动的注册(四)
usb_init代表整个usb模块的初始化,在usb_init中:static int __init usb_init(void){ …… //注册USB device driver,device driver对应的是整个设备,而不是某个接口 retval = usb_register_device_driver(&usb_generic_driver, THI...原创 2019-04-28 22:31:41 · 331 阅读 · 0 评论 -
Linux I2C驱动详解
本文基于mini2440开发板,Linux版本号是:linux-2.6.32.2一.IIC总线device 硬件信息#define S3C2410_PA_IIC (0x54000000)static struct resource s3c_i2c_resource[] = { [0] = { .start = S3C_PA_IIC, .end = S3C_PA_IIC +...原创 2019-03-31 23:13:55 · 3785 阅读 · 1 评论 -
Linux Nand Flash设备驱动详解
本文基于mini2440开发板,Linux版本号是:linux-2.6.32.2一. Nand Flash 设备注册nand flash控制器的起始地址/* NAND flash controller */#define S3C2410_PA_NAND (0x4E000000)2.该nand flash设备的名称.name = "s3c2410-nand",3.该...原创 2019-04-01 00:10:39 · 1200 阅读 · 0 评论 -
Linux watchdog驱动详解
本文是基于mini2440开发板Linux版本号是linux-2.6.32.2的学习笔记一. watchdog硬件信息watchdog的device信息如下:static struct resource s3c_wdt_resource[] = { [0] = { .start = S3C24XX_PA_WATCHDOG, .end = S3C24XX_PA_WATCHDOG...原创 2019-04-21 14:06:22 · 1779 阅读 · 0 评论 -
Linux LCD设备驱动详解
本文是基于mini2440开发板Linux版本号是linux-2.6.32.2的学习笔记一. LCD device硬件信息1.LCD控制器的寄存器地址从 0X4D000000开始2.lcd device的名称:s3c2410-lcdstruct platform_device s3c_device_lcd = { .name = "s3c2410-lcd", .id = ...原创 2019-04-21 14:07:13 · 4621 阅读 · 0 评论 -
Linux uart底层设备驱动详解
本文是基于mini2440开发板Linux版本号是linux-2.6.32.2的学习笔记一. uart 基本信息S3C2440A提供了3个独立的串口。串口的操作使用中断或DMA模式。串口的接受和发送缓存为 64-byte。二. uart硬件初始化uart初始化调用的函数是:s3c24xx_init_uarts,这个函数被mini2440_map_io调用,mini2440_map...原创 2019-04-21 14:07:45 · 10000 阅读 · 0 评论 -
Linux音频驱动之二:Control接口的调用
本文是基于mini2440开发板Linux版本号是linux-2.6.32.2的学习笔记一. control接口说明Control接口主要让用户空间的应用程序(alsa-lib)可以访问和控制音频codec芯片中的多路开关,滑动控件等。二.control接口的open由Linux 音频驱动这篇文章可知,control device调用的是snd_ctl_dev_register函数注册的。...原创 2019-04-21 14:08:25 · 3543 阅读 · 1 评论 -
Linux音频驱动之三:pcm接口的调用流程
本文是基于mini2440开发板Linux版本号是linux-2.6.32.2的学习笔记一.pcm设备的open由“Linux音频驱动之一:音频驱动注册流程” 这篇文章可知,pcm device调用的是snd_pcm_dev_register函数注册的。snd_pcm_dev_registererr = snd_register_device_for_dev(devtype, pcm-&g...原创 2019-04-21 14:08:38 · 7038 阅读 · 0 评论 -
Linux音频驱动之四:I2S 总线操作接口
本文是基于mini2440开发板Linux版本号是linux-2.6.32.2的学习笔记一. I2S driver 的probe函数映射虚拟内存,IIS寄存器的起始地址是:0x55000000s3c24xx_i2s.regs = ioremap(S3C2410_PA_IIS, 0x100);获取iis时钟,并使能iis时钟s3c24xx_i2s.iis_clk = clk_ge...原创 2019-04-21 14:08:52 · 7399 阅读 · 0 评论 -
Linux音频驱动之五:UDA1341芯片操作接口
本文是基于mini2440开发板Linux版本号是linux-2.6.32.2的学习笔记一. uda1341的硬件信息CPU通过L3接口控制uda1341芯片,分别是:L3DATA: 数据线L3MODE: 模式控制线,置0时,地址模式;置1时,数据模式L3CLOCK: 时钟线地址模式:data[7:2]:表示的是设备地址,UDA1341TS芯片的设备地址是 000101data[...原创 2019-04-21 14:09:06 · 912 阅读 · 0 评论 -
Linux音频驱动之六:基于I2S和UDA1341的操作接口
本文是基于mini2440开发板Linux版本号是linux-2.6.32.2的学习笔记一. s3c24xx_uda134x_startup函数这个函数里面主要是获取系统时钟1.时钟来源: PCLK和 MPLLin2.PCLK需要设置分频系数,MPLLin则不需要设置分频系数3.PCLK和 MPLLin都可以设置除数,256或者3844.s3c24xx_u...原创 2019-04-21 14:09:18 · 892 阅读 · 0 评论 -
Linux USB总线设备驱动(二)
一. USB的4中传输类型控制传输:突发,非周期性,主机软件启动的请求/响应通信,通常用于命令/状态操作。等时传输:主机和设备之间的定期,连续通信,通常用于与时间相关的信息。 此传输类型还保留了封装在数据中的时间概念。 然而,这并不意味着此类数据的交付需求始终是实时的。中断传输:低频,有界延迟通信,数据量小,非周期,主要用于向主机通知设备的服务请求,它是由设备发起的通信。批量传输:非周期性...原创 2019-04-28 22:26:05 · 352 阅读 · 0 评论 -
root hub设备注册(三)
一. 申请并初始化root hub设备struct usb_device *usb_alloc_dev(struct usb_device *parent, struct usb_bus *bus, unsigned port1){ struct usb_device *dev; struct usb_hcd *usb_hcd = container_of(bus, struct...原创 2019-04-28 23:05:57 · 1367 阅读 · 0 评论 -
linux内核并发控制
1.local_irq_disable()和local_irq_enable()都只能禁止和使能本CPU内的中断,因此,并不能解决SMP多CPU引发的竞态。因此,单独使用中断屏蔽通常不是一种值得推荐的避免竞态的方法(换句话说,驱动中使用local_irq_disable/local_irq_enable通常意味着一个bug)。2.自旋锁保护的临界区内不允许睡眠操作,但是信号量,互斥体可以。原因...原创 2019-05-11 12:27:54 · 442 阅读 · 0 评论