![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
linux驱动开发
文章平均质量分 89
KjfureOne
熟悉ARM平台,x86平台,下linux驱动开发,流行单片机裸驱开发,以及移动开发,有五年工作经验。
展开
-
linux设备模型之内核对象kobject
linux中一切皆文件 1.内核对象kobjectstruct kobject { const char *name; //对象的名字 struct list_head entry; struct kobject *parent;//对象的上层 struct kset *kset; //当前对象属于的kset指针 stru原创 2016-05-10 21:40:34 · 1523 阅读 · 0 评论 -
linux设备驱动模型之sysfs
linux设备驱动模型(一)sysfs是基于RAM的一种文件系统,在启动时挂载在 /sys目录下 sysfs在内核空间初始化注册过程void __init start_kernel(void) vfs_caches_init(totalram_pages); void __init mnt_init(void) err = sysfs_init();原创 2016-05-03 22:06:37 · 593 阅读 · 0 评论 -
linux内核中的.config
经过make menuconfig 生成 .config 决定哪些编译到内核,哪些编译为模块eg: 在.config 中有 CONFIG_DM9000 = ygrep "CONFIG_DM9000 " * -R发现相关的三类:1. c文件中arch/arm/mach-s5pv210/mach-tq210.c:#ifdef CONFIG_DM9000原创 2015-11-22 22:23:49 · 840 阅读 · 0 评论 -
linux启动start_kernel之console_init
linux启动start_kernel之console_initasmlinkage void __init start_kernel(void) printk(KERN_NOTICE "%s", linux_banner); setup_arch(&command_line);//获取command_line printk(KERN_NOTICE "Kernel comma原创 2016-05-15 00:13:55 · 998 阅读 · 0 评论 -
linux 设备与驱动的绑定
1.设备通过device_register函数向bus注册,将device注册到bus的设备链表的尾端,同时试图将设备与总线上的驱动对象进行绑定操作。 2.驱动通过diver_register函数将某一驱动注册到bus的驱动链表上,同时试图将驱动与总线的设备进行绑定操作。//分析int device_register(struct device *dev){ device_initia原创 2016-05-29 17:38:08 · 1916 阅读 · 0 评论 -
linux input设备驱动分析
linux input设备驱动分析工作机制输入设备工作机制: 输入动作–》产生中断–》CPU通过总线或者IO读取数据到缓冲区构架层次 app//-------------------- input_event_driver//-------------------- input_core//-------------------- input_device_driver原创 2016-06-09 15:57:32 · 1367 阅读 · 0 评论 -
i2c协议
一、关于I2CI2C为( Inter-IC bus)是用于主从设备通信的协议,具有如下特点:由两条双向物理连线构成CLK与SDA,可简化布线要求。具有广泛的支持,常用于传感器控制、数据传输等低数据流要求场合。通过仲裁可以拥有多个主设备,主设备具备分时操作所有从设备的能力,但在同一时间只有一对设备处于工作状态。每一个I2C设备都有独立的I2C地址。丛设转载 2016-06-12 21:33:11 · 926 阅读 · 0 评论 -
LCD(一) TFT液晶时序图
RGB时序eg 一个TFT液晶的时序图(1)VSYNC信号有效时,表示一帧数据的开始 (2)VSPW表示VSYNC信号的脉冲宽度为(VSPW+1)个HSYNC信号周期,即(VSPW+1)行,这(VSPW+1)行的数据无效。 (3)VSYNC信号脉冲之后,还要经过(VBPD+1)个HSYNC信号周期,有效的行数据才出现。所以,在VSYNC信号有效后要经过(VSPW+1+VBPD+1)个无效的行,第原创 2016-06-14 20:41:39 · 14375 阅读 · 0 评论 -
linux内核启动head.s
linux内核启动head.s已知条件: 1.首先通过分析Kernel的Makefile的链接知道 之后内核启动执行的第一个脚本是:../arch/arm/kernel/head.S 2.u-boot启动内核:theKernel(0,bd->bi_arch_number,bd->bi_boot_params) //启动内核 bd->bi_arch_number //机器id b原创 2016-05-14 11:00:50 · 858 阅读 · 0 评论 -
start_kernel之挂载根文件系统
start_kernelhead.s最终会调用start_kernel函数 执行start_kernel的目的:挂载根文件系统,启动应用APP环境asmlinkage void __init start_kernel(void) printk(KERN_NOTICE "%s", linux_banner); setup_arch(&command_line);//获取cm原创 2016-05-14 23:36:03 · 765 阅读 · 0 评论 -
linux workqueue
1. 什么是workqueueLinux中的Workqueue机制就是为了简化内核线程的创建。通过调用workqueue的接口就能创建内核线程。并且可以根据当前系统CPU的个数创建线程的数量,使得线程处理的事务能够并行化。workqueue是内核中实现简单而有效的机制,他显然简化了内核daemon的创建,方便了用户的编程.工作队列(workqueue)是另外一种将工作推后执行的形式.工转载 2017-08-07 12:17:09 · 391 阅读 · 0 评论 -
linux内核中断
尽管有些设备仅通过它们的I/O寄存器就可以得到控制,但现实中的大部分设备却比这复杂一些。设备需要与外部世界打交道,如旋转的磁盘,绕卷的磁带,远距离连接的电缆等。这些设备的许多工作通常是在与处理器完全不同的时间周期内完成的,并且总是要比处理器慢。这种让处理器等待外部事件的情况总是不能令人满意,所以必须有一种方法可以让设备在产生某个事件时通知处理器,这种方法就是中断。在大多数情况下,一个驱动程序只需要转载 2017-08-14 11:59:49 · 476 阅读 · 0 评论 -
HZ 与 jiffies
jiffies在内核中是一个全局变量,它用来统计系统启动以来系统中产生的总节拍数,这个变量定义在include/Linux/jiffies.h中,定义形式如下。unsigned long volatile jiffies;想要理解jiffies的含义,我们需要首先理解时钟 节拍率 节拍的概念。一、时钟时钟应用于处理器的定时信号,它使得处理器在时钟中运行,依靠信号转载 2017-08-01 11:23:27 · 772 阅读 · 0 评论 -
linux notifier
Linux庞大系统中,各个模块是相对独立的,那么模块间通信该如何做呢?当然你也可以使用全局资源,如果这样的话系统缺少独立性,会带来稳定性问题的。如果你说,使用共享内存,进程通信等,那么你曲解我的意思了,因为你说的大多是user space的,而我说的是内核模块级别的。notifier_chain,对就是它,实质上这个机制就是一个回调函数链表的操作,回调函数的注册,注销,调用。源系统处(比如A子转载 2017-08-07 19:36:06 · 606 阅读 · 0 评论 -
USB标准请求传输下的linux驱动
1.设备请求(装载)在枚举过程中,USB主机会向USB设备请求参数,用于读取描述符信息,为USB设备分配设备地址等等。USB设备通过默认控制管道响应这些请求,这些请求参数在SETUP数据包中,长度为8个字节。Linux对于请求参数结构体定义如下:146 struct usb_ctrlrequest {147 __u8 bRequestType;148转载 2017-05-10 12:09:12 · 419 阅读 · 0 评论 -
linux串口查找
1、查看串口是否可用 可以对串口发送数据比如对com1口,echo /dev/ttyS02、查看串口名称使用 ls -l /dev/ttyS* 一般情况下串口的名称全部在dev下面,如果你没有外插串口卡的话默认是dev下的ttyS* ,一般ttyS0对应com1,ttyS1对应com2,当然也不一定是必然的;3、查看串口驱动 cat /proc/tty/dr转载 2017-03-16 11:47:26 · 919 阅读 · 0 评论 -
HDMI EDID
1.何为EDID现在的显示设备比如显示器,电视等都HDMI接口,那通常每个HDMI接口都保留有一份EDID数据,这个数据可以存在程序里面由系统启动过程中来初始化,更常见的做法是每个HDMI口会有一个EEPROM来保存这份数据,这个EEPROM也只是有256bytes大小。外接设备如DVD播放器在HDMI热插拔的时候就会通过HDMI的DDC通道来读取EDID数据。EDID里面主要是定义了这显示设转载 2017-03-24 17:38:48 · 984 阅读 · 0 评论 -
linux mmap原理(详细)
一. mmap系统调用1. mmap系统调用 mmap将一个文件或者其它对象映射进内存。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。munmap执行相反的操作,删除特定地址区域的对象映射。当使用mmap映射文件到进程后,就可以直接操作这段虚拟地址进行文件的读写等操作,不必再调用read,write等系统调用.转载 2016-10-12 12:04:14 · 601 阅读 · 0 评论 -
LCD(二) linux驱动分析
数据结构//struct fb_infostruct fb_info { int node; int flags; struct mutex lock; /* Lock for open/release/ioctl funcs */ struct mutex mm_lock; /* Lock for fb_mmap and smem_* fie原创 2016-06-19 11:29:16 · 561 阅读 · 0 评论 -
调色板原理
调色板原理 & 编程 逻辑调色板结构LOGPALETTE,该结构定义如下: typedef struct tagLOGPALETTE { WORD palVersion; //调色板的板本号,应该指定该值为0x300; WORD palNumEntries;//调色板中的表项数,对于灰度图像该值为256; PALETEENTRY pa转载 2016-06-19 11:30:26 · 1522 阅读 · 0 评论 -
I2C时序分析
I2C时序要求 在SCL位高电平时数据保持稳定,在低电平时数据变化,因此可以认为时序要求: 在SCL的下降沿对数据进行采样输出 在SCL的上升沿对数据采样输入,即准备数据如图:thd为保持时间,在SCL下降沿对数据进行采样后,数据还需要保持的时间 tsu为建立时间,在SCL上升沿开始采样输入,数据已经稳定的时间原创 2016-09-23 16:11:58 · 1365 阅读 · 0 评论 -
linux内核mmap原理
应用空间返回一段映射好的虚拟地址,操作这个虚拟地址就能操作到设备的物理地址void * mmap(void *start,size_t length,int port,int flags,int fd,offset)系统调用syscall内核do_mmap_pgoff mmap_region //在当前的进程空间分配一个mmap区域,分配一个struct vm_area_struct对象原创 2016-10-10 15:35:16 · 801 阅读 · 0 评论 -
PCIe之DMA (二)
APIvoid *dma_alloc_writecombine(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp){ return __dma_alloc(dev, size, handle, gfp, pgprot_writecombine(pgprot_kernel));}函原创 2016-07-09 11:14:29 · 2999 阅读 · 0 评论 -
linux总线对象bus_type
linux总线对象bus_typestruct bus_type { const char *name; //总线名字 struct bus_attribute *bus_attrs; struct device_attribute *dev_attrs; struct driver_attribute *drv_attrs; int (*mat原创 2016-05-29 17:33:16 · 1071 阅读 · 0 评论 -
kobject的容器kset与hotplug
kobject的容器kset与hotplugPS: linux 无法登录ssh 1.检查linux下sshd 服务 ps -e | grep ssh* 2.重启服务 service /etc/ssh restart 3.ufw disbale 关闭防火墙struct kset:struct kset { struct list_head list; spinlock_t l原创 2016-05-29 17:23:35 · 595 阅读 · 0 评论 -
内核设备模型之为kobject添加属性文件
内核设备模型之为kobject添加属性文件//为内核对象添加属性文件//如何通过文件系统配置内核空间的kobject的属性//对属性文件操作 struct kobj_type *ktype;struct kobj_type { void (*release)(struct kobject *kobj); const struct sysfs_ops *sysfs_ops;原创 2016-05-15 22:31:47 · 805 阅读 · 0 评论 -
linux i2c设备驱动
linux下i2c设备驱动框架linux下i2c体系结构分为三部分: 1. i2c core 层:提供设备驱动,总线驱动的接口API,i2c 通讯方法,探测设备。 2. i2c 总线驱动:实现i2c硬件体系结构中适配器(解决通讯中怎么发数据)。 3. i2c 设备驱动: 寻找i2c适配器与CPU交换数据(解决通讯中向谁发数据与发什么数据)。框架图:原创 2016-05-06 23:25:43 · 900 阅读 · 0 评论 -
USB枚举
USB枚举过程为什么要枚举 ?枚举就是从设备读取一些信息,知道设备是什么样的设备,如何进行通信,这样主机就可以根据这些信息来加载合适的驱动程序,完成主从通讯。控制传输1.USB设备的枚举过程中都是使用控制传输。 2.控制传输分为三个过程: ①建立过程。 ②可选的数据过程。 ③状态过程。 建立(Setup)过程都是由USB主机发起,它开始于一个Setup令牌包,后面紧跟一个DATA0包。如果原创 2016-09-23 14:36:44 · 345 阅读 · 0 评论 -
libusb
介绍: libusb是一个开源库,可以帮助开发者在用户空间的层面上与USB设备进行通讯。如果想了解更多,可以查看他们的主页:http://libusb.org/ 在其文档中,建议首先阅读USB2的规格说明:http://www.usb.org/developers/docs/,这可以帮助真正地了解USB是如何工作的。libusb的安装: 你可以从官方的主页上获取源代码,并且编译安装。或者转载 2016-09-23 12:01:51 · 898 阅读 · 0 评论 -
Linux spi驱动 (一)
1、概要Linux 中的spi驱动主要是由spi子系统来管理的,其核心代码位于kernel/drivers/spi/spi.c中。具体的spi控制器驱动也在kernel/drivers/spi/目录中。目前spi子系统只支持spi主机模式,还不支持spi从机模式。 spi通常是由spiI控制器、spi总线和连接在spi总线上的设备构成:这里的总线只是指物理的spi连线,并不是指Linux设备模型转载 2016-06-25 20:06:30 · 510 阅读 · 0 评论 -
Linux spi驱动(二)
1、概览对于ARM平台来说,大多数CPU都是SoC。spi控制器被集成在CPU内部。spi总线上的数据传输过程通常就是这个spi控制器来控制的。为了使spi控制器能工作在linux spi子系统中,我们就需要针对CPU内部的spi控制器编写一个驱动。前面的博文提到过,在linux spi系统中struct spi_master对象就对应了一个spi控制器。编写spi控制器驱动其实就是实现struct转载 2016-06-25 23:21:32 · 751 阅读 · 0 评论 -
Linux spi驱动 (三)
1、概览spi子系统中分为spi控制器驱动和spi设备驱动。前面已经讲述了spi控制器驱动。下面讲述一下spi设备驱动。所谓的spi设备驱动,就是挂在spi总线上形形色色的芯片驱动。它可能是一个Flash芯片,一个声音编解码芯片,也可能是一个网卡芯片。这些芯片如果要正常工作,那就必须为之编写对应的驱动,这个驱动就是spi设备驱动。下面将讲解如何实现一个spi设备驱动2、向内核注册spi设备如果希望一转载 2016-06-26 19:23:58 · 618 阅读 · 0 评论 -
PCIe之DMA (一)
DMA概念DMA的英文拼写是“Direct Memory Access”,汉语的意思就是直接内存访问。内存与内存(外设)交换数据不经过CPU。使用DMA的好处就是它不需要CPU的干预而直接服务外设,这样CPU就可以去处理别的事务,从而提高系统的效率,对于慢速设备,如UART,其作用只是降低CPU的使用率,但对于高速设备,如硬盘,它不只是降低CPU的使用率,而且能大大提高硬件设备的吞吐量。因为对于原创 2016-07-06 21:15:06 · 10674 阅读 · 1 评论 -
PCIe之DMA (三)
linux下DMA编程dam的一致性问题一致性问题 :DAM针对内存区域的目标地址与cache缓存对象存在重叠区域,经过DMA后, cache中的值发生改变,但CPU不知道cache中的值改变了,它任然认为Cache中的数据就是 内存中的数据,以后访问cache映射的内存时,它任然使用陈旧的cache数据,就造成Cache 与内存之间的数据不一致。 解决办法:直接禁止DMA目标地址范围内的C原创 2016-07-10 21:49:11 · 4518 阅读 · 2 评论 -
PCIe 基础(一)操作配置空间
PCI配置空间PCI有三种地址空间:I/O空间,内存地址空间,PCI配置空间。在启动时bootloader 或者内核会遍历PCI总线并分配资源,如中断和内存,设备驱动程序通过PCI配置空间 找到资源分配。大小为256字节。 配置空间图:原创 2016-07-17 10:25:57 · 12904 阅读 · 0 评论 -
linux 设备树及节点引用
1、ARM Linux社区为什么要引入设备树Linux之父Linus Torvalds闲来无事,在翻看ARM Linux代码的时候,有一天终于忍不住了。他在2011年3月17日的ARM Linux邮件列表中说道:“This whole ARM thing is a f*cking pain in the ass”。这句话迫使ARM Linux社区引入了设备树。Linus Tor转载 2016-07-20 21:59:11 · 8210 阅读 · 1 评论 -
linux USB子系统(一)
框架原创 2016-08-20 11:11:24 · 510 阅读 · 0 评论 -
linux设备插拔
热插拔系统启动后插入的设备成为热插拔,内核检测到插拔事件后通过netlink(socket) 发送给守护进程udevd。冷插拔系统启动前插入的设备系统启动时,内核为所在的设备sys下创建uevent文件,并记录设备链信息,当udevd启动后,去读取设备链接信息,创建设备。原创 2017-08-31 20:00:05 · 8869 阅读 · 0 评论