![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
linux底层驱动
linux底层驱动
诺谦
热爱生活 活在当下
展开
-
50.Linux-分析ifconfig到内核的调用过程,实现内核启机自动设MAC地址(原)
内核版本: Linux version 3.10.141.由于每次开发板开机的网卡eth0的物理地址都是随机的.然后在网上找到可以通过命令行实现设置mac物理地址:ifconfig eth0 downifconfig eth0 hw ether 1234567890abifconfig eth0 up然后带着好奇,想看看命令行ifconfig是如何与内核交互的,想试试如何...原创 2019-01-18 20:04:00 · 719 阅读 · 0 评论 -
49.Linux-wpa_cli使用之WIFI开启,扫描热点,连接热点,断开热点,WIFI关闭(49)
本章学习内容:1.WIFI如何开启2.扫描热点3.连接热点4. 断开热点5.关闭WIFI本节使用的是wpa_supplicant工具,它主要包含wpa_supplicant(命令行模式)与wpa_cli(交互模式)两个程序。1.WIFI如何开启ifconfig wlan0 up wpa_supplicant -Dnl80211 -i wlan0 -c /dat...原创 2018-12-26 17:49:00 · 709 阅读 · 2 评论 -
linux内核里的字符串转换 ,链表操作常用函数(转)
1.对双向链表的具体操作如下:list_add———向链表添加一个条目 list_add_tail———添加一个条目到链表尾部 __list_del_entry———从链表中删除相应的条目 list_replace———用新条目替换旧条目 list_del_init———从链表中删除条目后重新初始化 list_move———从一个链表中删除并加入为另一个链表的头部 ...原创 2018-12-25 17:07:00 · 93 阅读 · 0 评论 -
7.自己写中断方式按键驱动程序(详解)
request_irq()和free_irq()分析完毕后,接下来开始编写上升沿中断的按键驱动如下图,需要设置4个按键的EINT0, EINT2, EINT11, EINT19的模式为双边沿,且设置按键引脚为中断引脚这里我们只需要使用request_irq函数就行了, 在request_irq函数里会初始chip->set_type(设置引脚和中断模式)1.首先添加头文件#i...原创 2017-09-11 20:07:00 · 185 阅读 · 0 评论 -
48.Linux-普通U盘以及多分区U盘自动挂载
在上章学习33.Linux-实现U盘自动挂载(详解)后,只是讲解了普通U盘挂载,并没有涉及到多分区U盘,接下来本章来继续学习1.多分区U盘和普通U盘区别1)U盘插上只会创建一个/dev/sda文件,这种一般表示该U盘没有分区,这个sda文件便代表该U盘总大小,我们只需要挂载/dev/sda即可2)另一种U盘则会创建/dev/sda以及/dev/sda1文件,这种一般表示该u盘只有一...原创 2018-12-12 11:14:00 · 214 阅读 · 0 评论 -
47.Linux-DEVICE_ATTR()介绍及使用示例
1.介绍使用DEVICE_ATTR,可以实现驱动在sys目录自动创建文件,我们只需要实现show和store函数即可.然后在应用层就能通过cat和echo命令来对sys创建出来的文件进行读写驱动设备,实现交互.2.DEVICE_ATTR()宏定义DEVICE_ATTR()定义位于include/linux/device.h中,定义如下所示:#define DEVICE_ATTR(_n...原创 2018-10-16 18:22:00 · 162 阅读 · 0 评论 -
46.Linux-创建rc红外遥控平台设备,实现重复功能(2)
上章链接:46.Linux-分析rc红外遥控平台驱动框架,修改内核的NEC解码函数BUG(1)在上章分析了红外platform_driver后,已经修改bug后,接下来我们自己创建一个红外platform_device平台设备,其实写一个平台设备很简单.创建红外platform_device平台设备步骤为:1) 创建一个platform_device设备,其中.name= "gpi...原创 2018-10-13 19:49:00 · 222 阅读 · 0 评论 -
46.Linux-分析rc红外遥控平台驱动框架,修改内核的NEC解码函数BUG(1)
内核版本 : Linux 3.10.14rc红外接收类型: GPIO 类型的NEC红外编码本章内容1) rc体系结构分析2) 分析红外platform_driver平台驱动框架3) 分析内核自带的NEC红外解码过程4) 修改内核自带的NEC红外解码BUG,实现按键重复按下下章内容1) 自己创建一个红外platform_device平台设备2) ...原创 2018-10-13 18:13:00 · 462 阅读 · 0 评论 -
46.Linux电源管理-休眠与唤醒
1.休眠方式在内核中,休眠方式有很多种,可以通过下面命令查看# cat /sys/power/state //来得到内核支持哪几种休眠方式. 常用的休眠方式有freeze,standby, mem, diskfreeze: 冻结I/O设备,将它们置于低功耗状态,使处理器进入空闲状态,唤醒最快,耗电比其它standby, mem, disk方式高stand...原创 2018-09-11 19:09:00 · 389 阅读 · 0 评论 -
45.work_struct和delayed_work的工作队列使用
介绍在中断处理中,经常用到工作队列,这样便能缩短中断处理时的时间中断中通过调用schedule_work(work)来通知内核线程,然后中断结束后,再去继续执行work对应的func函数示例当中断来了,立马调用schedule_work(work),然后退出.中断结束后,内核便会调用_work对应的func函数,最后才来读取按键值,上报按键值,这样就大大缩短了中断处理时间work_s...原创 2018-09-11 18:04:00 · 274 阅读 · 0 评论 -
44.Linux君正X1000-添加st7789v显示
由于板子LCD旧屏是ili9335型号的,旧屏有时候会断货,如果断货则使用一个st7789v型号的LCD它们两个屏的区别在于初始化屏的参数不同,引脚都一样,也就是说需要使板子同时支持ili9335型号和st7789v型号思路:1.uboot在显示LOG(初始化屏参数)之前,通过命令来读LCD型号,来检测LCD型号,然后来修改初始化屏的参数.2.如果屏是新屏,则设置bootargs,向内...原创 2018-08-09 19:22:00 · 545 阅读 · 0 评论 -
43.Linux调试测试输入思路
当产品要发布之前,都会进行反复的测试输入,比如:测试按键,遥控,触摸等等.当出现bug时,就还需要不停地找规律,修改程序,直到修复成功,会显的非常麻烦答:可以通过之前在35.Linux-分析并制作环形缓冲区里学的,使用myprintf()保存到环形缓冲区.当出错时,直接可以通过缓冲区里的数据来“复现”输入....原创 2017-12-22 15:40:00 · 89 阅读 · 0 评论 -
42.Linux应用调试-初步制作系统调用(用户态->内核态)
1首先来讲讲应用程序如何实现系统调用(用户态->内核态)?我们以应用程序的write()函数为例:1)首先用户态的write()函数会进入glibc库,里面会将write()转换为swi(SoftwareInterrupt)指令,从而产生软件中断,swi指令如下所示:swi #val //val: bit[23:0]立即数,该val用来判断用户函数需要调用哪个内核函数...原创 2017-12-20 18:35:00 · 122 阅读 · 0 评论 -
41.Linux应用调试-修改内核来打印用户态的oops
1.在之前第36章里,我们学习了通过驱动的oops定位错误代码行第36章的oops代码如下所示:Unable to handle kernel paging request at virtual address 56000050 //无法处理内核页面请求的虚拟地址56000050pgd = c3850000[56000050] *pgd=00000000Internal ...原创 2017-12-15 23:14:00 · 151 阅读 · 0 评论 -
40.Linux应用调试-使用gdb和gdbserver
1.gdb和gdbserver调试原理通过linux虚拟机里的gdb,来向开发板里的gdbserver发送命令,比如设置断点,运行setp等,然后开发板上的gdbserver收到命令后,便会执行应用程序做相应的动作,来实现调试的功能和之前学的裸板GDB调试 一样,只不过之前学的是在win下的,本次是在linux里的gdb1.1同样,它们都会需要一个带调试信息的编译文件.通过Makefil...原创 2017-12-13 18:07:00 · 140 阅读 · 0 评论 -
38.Linux驱动调试-根据系统时钟定位出错位置
当内核或驱动出现僵死bug,导致系统无法正常运行,怎么找到是哪个函数的位置导致的?答,通过内核的系统时钟,因为它是由定时器中断产生的,每隔一定时间便会触发一次,所以当CPU一直在某个进程中时,我们便在中断函数中打印该进程的信息1.先来回忆下 在之前的第5章内核中断运行过程:http://www.cnblogs.com/lifexy/p/7506504.html分析过,当内核中断产生时,会...原创 2017-12-11 18:16:00 · 109 阅读 · 0 评论 -
37.Linux驱动调试-根据oops的栈信息,确定函数调用过程
上章链接入口:http://www.cnblogs.com/lifexy/p/8006748.html在上章里,我们分析了oops的PC值在哪个函数出错的本章便通过栈信息来分析函数调用过程1.上章的oops栈信息如下图所示:9fe0: 代表最初的栈顶SP寄存器位置9e80:代表函数出错的SP寄存器位置2.我们先来分析上图的栈信息,又是怎样的过程呢?2.1内核主要是通过...原创 2017-12-09 16:53:00 · 102 阅读 · 0 评论 -
36.Linux驱动调试-根据oops定位错误代码行
1.当驱动有误时,比如,访问的内存地址是非法的,便会打印一大串的oops出来1.1以LED驱动为例将open()函数里的ioremap()屏蔽掉,直接使用物理地址的GPIOF,如下图所示:1.2然后编译装载26th_segmentfault并执行测试程序后,内核便打印了oops出来,如下图所示:2.接下来,我们便来分析oops:Unable to handle kernel ...原创 2017-12-08 18:49:00 · 155 阅读 · 0 评论 -
35.Linux-分析并制作环形缓冲区
在上章34.Linux-printk分析、使用printk调试驱动里讲述了: printk()会将打印信息存在内核的环形缓冲区log_buf[]里,可以通过dmesg命令来查看log_buf[]1.环形缓冲区log_buf[]又是存在内核的哪个文件呢?位于/proc/kmsg里,所以除了dmesg命令查看,也可以使用cat /proc/kmsg来查看2.但是,dmesg命令和...原创 2017-12-07 18:38:00 · 198 阅读 · 0 评论 -
34.Linux-printk分析、使用__FILE__, __FUNCTION__, __LINE__ 调试
本节学习目的1)分析printk()函数2)使用printk()调试驱动1.在驱动调试中,使用printk(),是最简单,最方便的办法当uboot的命令行里的“console=tty1”时,表示printk()输出在开发板的LCD屏上当uboot的命令行里的“console=ttySA0,115200”时,表示printk()输出在串口UART0上,波特率=115200当ubo...原创 2017-12-06 15:56:00 · 271 阅读 · 0 评论 -
32.Linux-2440下的DMA驱动(详解)
DMA(Direct Memory Access)即直接存储器访问, DMA 传输方式无需 CPU 直接控制传输,通过硬件为 RAM 、I/O 设备开辟一条直接传送数据的通路,能使 CPU 的效率大为提高。学了这么多驱动,不难推出DMA的编写套路: 1)注册DMA中断,分配缓冲区 2)注册字符设备,并提供文件操作集合fops -> 2.1)file_operations里...原创 2017-11-22 18:47:00 · 251 阅读 · 0 评论 -
31.Linux-wm9876声卡驱动(移植+测试)
本节学习目的1)分析Linux中的OSS声卡系统2)移植wm9876声卡3)使用madplay应用程序播放mp31.声音三要素采样频率音频采样率是指录音设备在一秒钟内对声音信号的采样次数, 常用的采样率有:8KHz - 电话所用采样率, 对于人的说话已经足够清除22.05KHz- 无线电广播所用采样率32KHz - miniDV 数码视频、DAT所用采...原创 2017-11-20 19:03:00 · 342 阅读 · 0 评论 -
30.Linux-RTC驱动分析及使用
linux中的rtc驱动位于drivers/rtc下,里面包含了许多开发平台的RTC驱动,我们这里是以S3C24xx为主,所以它的RTC驱动为rtc-s3c.c1.进入./drivers/rtc/rtc-s3c.c还是首先进入入口函数,如下图所示:这里注册了一个“s3c2410-rtc”名称的平台设备驱动而“s3c2410-rtc”的平台设备,在./arch/arm/plat-s...原创 2017-11-15 16:28:00 · 183 阅读 · 0 评论 -
29.使用register_chrdev_region()系列来注册字符设备
1.之前注册字符设备用的如下函数注册字符设备驱动:register_chrdev(unsigned int major, const char *name,const struct file_operations *fops);但其实这个函数是linux版本2.4之前的注册方式,它的原理是:(1)确定一个主设备号(2)构造一个file_operations结构体, 然后放在chrde...原创 2017-11-13 18:29:00 · 283 阅读 · 0 评论 -
28.Linux-IIC驱动(详解)
上一节 我们学习了: IIC接口下的24C02 驱动分析:http://www.cnblogs.com/lifexy/p/7793686.html接下来本节, 学习Linux下如何利用linux下I2C驱动体系结构来操作24C021. I2C体系结构分析1.1首先进入linux内核的driver/i2c目录下,如下图所示:其中重要的文件介绍如下:1)algos文件夹(alg...原创 2017-11-10 20:33:00 · 361 阅读 · 0 评论 -
22.Linux-块设备驱动之框架详细分析(详解)
本节目的: 通过分析2.6内核下的块设备驱动框架,知道如何来写驱动1.之前我们学的都是字符设备驱动,先来回忆一下字符设备驱动:当我们的应用层读写(read()/write())字符设备驱动时,是按字节/字符来读写数据的,期间没有任何缓存区,因为数据量小,不能随机读取数据,例如:按键、LED、鼠标、键盘等2.接下来本节开始学习块设备驱动块设备: 块设备是i/o设备中的一类, ...原创 2017-10-11 17:16:00 · 158 阅读 · 0 评论 -
21.Linux-写USB键盘驱动(详解)
本节目的: 根据上节写的USB鼠标驱动,来依葫芦画瓢写出键盘驱动1.首先我们通过上节的代码中修改,来打印下键盘驱动的数据到底是怎样的先来回忆下,我们之前写的鼠标驱动的id_table是这样:所以我们要修改id_table,使这个驱动为键盘的驱动,如下图所示:然后修改中断函数,通过printk()打印数据:我们先按下按键A为例,打印出0x04,如下图:我们再同时按...原创 2017-10-10 14:41:00 · 200 阅读 · 0 评论 -
20.Linux-USB鼠标驱动
在上一章分析完USB总线驱动程序后, 接下来开始写一个USB驱动:本节目的: 将USB鼠标的左键当作L按键,将USB鼠标的右键当作S按键,中键当作回车按键参考/drivers/hid/usbhid/usbmouse.c(内核自带的USB鼠标驱动)1.本节需要用到的宏如下:struct usb_device_id usbmouse_id_table []=USB_INTERFACE_I...原创 2017-10-09 16:24:00 · 148 阅读 · 0 评论 -
USB_4大描述符
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/aaa6695798/archive/2009/11/06/4776202.aspx在USB描述符中,从上到下分为四个层次:USB设备描述符(usb_device_descriptor)、USB配置描述符(usb_config_descriptor)、USB接口描述符(usb_interface_desc...原创 2017-10-07 12:37:00 · 125 阅读 · 0 评论 -
19.Linux-USB总线驱动分析
如下图所示,以windows为例,我们插上一个没有USB设备驱动的USB,就会提示你安装驱动程序为什么一插上就有会提示信息? 是因为windows自带了USB总线驱动程序,USB总线驱动程序负责:识别USB设备,给USB设备找到对应的驱动程序新接入的USB设备的默认地址(编号)是0,在未分配新编号前,PC主机使用0地址和它通信。然后USB总线驱动程序都会给它分配一个地址(编号)...原创 2017-10-06 18:00:00 · 199 阅读 · 0 评论 -
18.Llinux-触摸屏驱动(详解)
本节的触摸屏驱动也是使用之前的输入子系统1.先来回忆之前第12节分析的输入子系统其中输入子系统层次如下图所示,其中事件处理层的函数都是通过input_register_handler()函数注册到input_handler_list链表中搜索input_register_handler注册函数,就可以看到都是事件处理层里的函数:所以最终如下图所示:右边的驱动事件处理,内核是...原创 2017-10-05 11:01:00 · 353 阅读 · 0 评论 -
17.tslib安装以及使用
1.先在网上下载tslib-1.4.tar.gz压缩包2.然后在ubuntu编译:tar xzf tslib-1.4.tar.gzcd tslib./autogen.sh mkdir tmp //创建安装目录echo "ac_cv_func_malloc_0_nonnull=yes" >arm-linux.cache ...原创 2017-10-05 10:07:00 · 125 阅读 · 0 评论 -
16.Linux-LCD驱动(详解)
在上一节LCD层次分析中,得出写个LCD驱动入口函数,需要以下4步:1) 分配一个fb_info结构体: framebuffer_alloc();2) 设置fb_info3) 设置硬件相关的操作4) 使能LCD,并注册fb_info: register_framebuffer()本节需要用到的函数:void *dma_alloc_writecombine(struct device...原创 2017-09-27 22:53:00 · 198 阅读 · 0 评论 -
15.linux-LCD层次分析(详解)
如果我们的系统要用GUI(图形界面接口),这时LCD设备驱动程序就应该编写成frambuffer接口,而不是像之前那样只编写操作底层的LCD控制器接口。什么是frambuffer设备? frambuffer设备层是对图像设备的一种抽象,它代表了视频硬件的帧缓存,使得应用程序通过定义好的接口就可以访问硬件。所以应用程序不需要考虑底层的(寄存器级)的操作。应用程序对设备文件的访问一般在/de...原创 2017-09-27 18:42:00 · 140 阅读 · 0 评论 -
27.Linux-DM9000C网卡移植(详解)
上一节 我们学习了: 网卡驱动介绍以及制作虚拟网卡驱动: http://www.cnblogs.com/lifexy/p/7763352.html接下来本节,学习网卡芯片DM9000C,如何编写移植DM9000C网卡驱动程序。1.首先来看DM9000C原理图如下图所示: (#:表示低电平有效)SD0~15:16位数据线,有CMD引脚决定访问类型CMD: 命...原创 2017-11-03 14:12:00 · 146 阅读 · 0 评论 -
26.Linux-网卡驱动介绍以及制作虚拟网卡驱动(详解)
1.描述网卡的驱动其实很简单,它还是与硬件相关,主要是负责收发网络的数据包,它将上层协议传递下来的数据包以特定的媒介访问控制方式进行发送, 并将接收到的数据包传递给上层协议。网卡设备与字符设备和块设备不同, 网络设备并不对应于/dev目录下的文件,不过会存放在/sys/class/net目录下如下图所示,我们通过ls /sys/class/net/ 命令,可以看到有两个网卡:2.Li...原创 2017-10-31 19:53:00 · 604 阅读 · 0 评论 -
10.按键之互斥、阻塞机制(详解)
本节目标:学习原子操作和互斥信号量,实现互斥机制,同一时刻只能一个应用程序使用驱动程序学习阻塞和非阻塞操作当设备被一个程序打开时,存在被另一个程序打开的可能,如果两个或多个程序同时对设备文件进行写操作,这就是说我们的设备资源同时被多个进程使用,对共享资源(硬件资源、和软件上的全局变量、静态变量等)的访问则很容易导致竞态。显然这不是我们想要的,所以本节引入互斥的概念:实现同一时刻,...原创 2017-09-13 16:07:00 · 254 阅读 · 0 评论 -
25.Linux-Nor Flash驱动(详解)
1.nor硬件介绍:从原理图中我们能看到NOR FLASH有地址线,有数据线,它和我们的SDRAM接口相似,能直接读取数据,但是不能像SDRAM直接写入数据,需要有命令才行1.1其中我们2440的地址线共有27根(LADDR0~26),为什么是27根?因为2440共有7个bank内存块,每个bank=128MB=(2^27)B,所以共有27根数据线1.2为什么Nor Flash的地址...原创 2017-10-26 15:44:00 · 274 阅读 · 0 评论 -
24.Linux-Nand Flash驱动(分析MTD层并制作NAND驱动)
1.本节使用的nand flash型号为K9F2G08U0M,它的命令如下:1.1我们以上图的read id(读ID)为例,它的时序图如下:首先需要使能CE片选1)使能CLE2)发送0X90命令,并发出WE写脉冲3)复位CLE,然后使能ALE4)发送0X00地址,并发出WE写脉冲5)设CLE和ALE为低电平6)while判断nRE(读使能)是否为低电平7)读出8个I/O...原创 2017-10-20 19:29:00 · 377 阅读 · 1 评论 -
23.Linux-块设备驱动(详解)
通过上节的块设备驱动分析,本节便通过内存来模拟块设备驱动 ,方便我们更加熟悉块设备驱动框架参考内核自带的块设备驱动程序:drivers/block /xd.c drivers/block /z2ram.c 1.本节需要的结构体如下:1.1 gendisk磁盘结构体: struct gendisk { int major; /...原创 2017-10-13 15:36:00 · 198 阅读 · 0 评论