随笔分类 -  3.linux底层驱动

摘要:本节学习目的 1)分析printk()函数 2)使用printk()调试驱动 1.在驱动调试中,使用printk(),是最简单,最方便的办法 当uboot的命令行里的“console=tty1”时,表示printk()输出在开发板的LCD屏上 当uboot的命令行里的“console=ttySA0, 阅读全文
posted @ 2017-12-06 15:56 诺谦 阅读(6072) 评论(2) 推荐(2) 编辑
摘要:1.当我们每次插入u盘后,都会自动创键U盘的设备节点/dev/sda%d 这是因为里面调用了device_create()实现的, busybox的mdev机制就会根据主次设备号等信息,在/dev下创建设备节点,如下图所示: 而想使用上面的sda1设备节点,读写数据时,还需要使用mount /dev 阅读全文
posted @ 2017-11-24 18:28 诺谦 阅读(27269) 评论(1) 推荐(11) 编辑
摘要:DMA(Direct Memory Access) 即直接存储器访问, DMA 传输方式无需 CPU 直接控制传输,通过硬件为 RAM 、I/O 设备开辟一条直接传送数据的通路,能使 CPU 的效率大为提高。 学了这么多驱动,不难推出DMA的编写套路: 1)注册DMA中断,分配缓冲区 2)注册字符设 阅读全文
posted @ 2017-11-22 18:47 诺谦 阅读(8024) 评论(0) 推荐(0) 编辑
摘要:本节学习目的 1)分析Linux中的OSS声卡系统 2)移植wm9876声卡 3)使用madplay应用程序播放mp3 1.声音三要素 采样频率 音频采样率是指录音设备在一秒钟内对声音信号的采样次数, 常用的采样率有: 8KHz - 电话所用采样率, 对于人的说话已经足够清除 22.05KHz - 阅读全文
posted @ 2017-11-20 19:03 诺谦 阅读(4248) 评论(0) 推荐(1) 编辑
摘要:linux中的rtc驱动位于drivers/rtc下,里面包含了许多开发平台的RTC驱动,我们这里是以S3C24xx为主,所以它的RTC驱动为rtc-s3c.c 1.进入./drivers/rtc/rtc-s3c.c 还是首先进入入口函数,如下图所示: 这里注册了一个“s3c2410-rtc”名称的 阅读全文
posted @ 2017-11-15 16:28 诺谦 阅读(8839) 评论(2) 推荐(1) 编辑
摘要:1.之前注册字符设备用的如下函数注册字符设备驱动: 但其实这个函数是linux版本2.4之前的注册方式,它的原理是: (1)确定一个主设备号 (2)构造一个file_operations结构体, 然后放在chrdevs数组中 (3)注册:register_chrdev 然后当读写字符设备的时候,就会 阅读全文
posted @ 2017-11-13 18:29 诺谦 阅读(7154) 评论(0) 推荐(3) 编辑
摘要:上一节 我们学习了: IIC接口下的24C02 驱动分析: http://www.cnblogs.com/lifexy/p/7793686.html 接下来本节, 学习Linux下如何利用linux下I2C驱动体系结构来操作24C02 1. I2C体系结构分析 1.1首先进入linux内核的driv 阅读全文
posted @ 2017-11-10 20:33 诺谦 阅读(19712) 评论(1) 推荐(10) 编辑
摘要:上一节 我们学习了: 网卡驱动介绍以及制作虚拟网卡驱动: http://www.cnblogs.com/lifexy/p/7763352.html 接下来本节,学习网卡芯片DM9000C,如何编写移植DM9000C网卡驱动程序。 1.首先来看DM9000C原理图 如下图所示: (#:表示低电平有效) 阅读全文
posted @ 2017-11-03 14:12 诺谦 阅读(6898) 评论(2) 推荐(3) 编辑
摘要:1.描述 网卡的驱动其实很简单,它还是与硬件相关,主要是负责收发网络的数据包,它将上层协议传递下来的数据包以特定的媒介访问控制方式进行发送, 并将接收到的数据包传递给上层协议。 网卡设备与字符设备和块设备不同, 网络设备并不对应于/dev目录下的文件,不过会存放在/sys/class/net目录下 阅读全文
posted @ 2017-10-31 19:53 诺谦 阅读(17598) 评论(5) 推荐(8) 编辑
摘要:1.nor硬件介绍: 从原理图中我们能看到NOR FLASH有地址线,有数据线,它和我们的SDRAM接口相似,能直接读取数据,但是不能像SDRAM直接写入数据,需要有命令才行 1.1其中我们2440的地址线共有27根(LADDR0~26),为什么是27根? 因为2440共有7个bank内存块,每个b 阅读全文
posted @ 2017-10-26 15:44 诺谦 阅读(9992) 评论(1) 推荐(1) 编辑
摘要:1.本节使用的nand flash型号为K9F2G08U0M,它的命令如下: 1.1我们以上图的read id(读ID)为例,它的时序图如下: 首先需要使能CE片选 1)使能CLE 2)发送0X90命令,并发出WE写脉冲 3)复位CLE,然后使能ALE 4)发送0X00地址,并发出WE写脉冲 5)设 阅读全文
posted @ 2017-10-20 19:29 诺谦 阅读(17058) 评论(0) 推荐(6) 编辑
摘要:通过上节的块设备驱动分析,本节便通过内存来模拟块设备驱动 ,方便我们更加熟悉块设备驱动框架 参考内核自带的块设备驱动程序: drivers/block /xd.c drivers/block /z2ram.c 1.本节需要的结构体如下: 1.1 gendisk磁盘结构体: 1.2 request申请 阅读全文
posted @ 2017-10-13 15:36 诺谦 阅读(12267) 评论(6) 推荐(4) 编辑
摘要:本节目的: 通过分析2.6内核下的块设备驱动框架,知道如何来写驱动 1.之前我们学的都是字符设备驱动,先来回忆一下 字符设备驱动: 当我们的应用层读写(read()/write())字符设备驱动时,是按字节/字符来读写数据的,期间没有任何缓存区,因为数据量小,不能随机读取数据,例如:按键、LED、鼠 阅读全文
posted @ 2017-10-11 17:16 诺谦 阅读(22690) 评论(7) 推荐(5) 编辑
摘要:本节目的: 根据上节写的USB鼠标驱动,来依葫芦画瓢写出键盘驱动 1.首先我们通过上节的代码中修改,来打印下键盘驱动的数据到底是怎样的 先来回忆下,我们之前写的鼠标驱动的id_table是这样: 所以我们要修改id_table,使这个驱动为键盘的驱动,如下图所示: 然后修改中断函数,通过printk 阅读全文
posted @ 2017-10-10 14:41 诺谦 阅读(9982) 评论(0) 推荐(2) 编辑
摘要:在上一章分析完USB总线驱动程序后, 接下来开始写一个USB驱动: 本节目的: 将USB鼠标的左键当作L按键,将USB鼠标的右键当作S按键,中键当作回车按键 参考/drivers/hid/usbhid/usbmouse.c(内核自带的USB鼠标驱动) 1.本节需要用到的宏如下: USB_INTERF 阅读全文
posted @ 2017-10-09 16:24 诺谦 阅读(6384) 评论(4) 推荐(4) 编辑
摘要:本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/aaa6695798/archive/2009/11/06/4776202.aspx 在USB描述符中,从上到下分为四个层次: USB设备描述符(usb_device_descriptor)、 USB配置描述符(usb_ 阅读全文
posted @ 2017-10-07 12:37 诺谦 阅读(7961) 评论(1) 推荐(2) 编辑
摘要:如下图所示,以windows为例,我们插上一个没有USB设备驱动的USB,就会提示你安装驱动程序 为什么一插上就有会提示信息? 是因为windows自带了USB总线驱动程序, USB总线驱动程序负责: 识别USB设备,给USB设备找到对应的驱动程序 新接入的USB设备的默认地址(编号)是0,在未分配 阅读全文
posted @ 2017-10-06 18:00 诺谦 阅读(8737) 评论(8) 推荐(7) 编辑
摘要:本节的触摸屏驱动也是使用之前的输入子系统 1.先来回忆之前第12节分析的输入子系统 其中输入子系统层次如下图所示, 其中事件处理层的函数都是通过input_register_handler()函数注册到input_handler_list链表中 搜索input_register_handler注册函 阅读全文
posted @ 2017-10-05 11:01 诺谦 阅读(25699) 评论(0) 推荐(3) 编辑
摘要:1.先在网上下载 tslib-1.4.tar.gz压缩包 2.然后在ubuntu编译: 3.然后进入开发板,使用nfs: 若内核没有触摸驱动和LCD驱动,就安装触摸驱动和LCD驱动 修改参数: 然后装载驱动,再配置LCD和触摸屏环境: 校验测试: 校验界面如下图所示: 运行测试如下图所示: 测试数据 阅读全文
posted @ 2017-10-05 10:07 诺谦 阅读(4777) 评论(0) 推荐(0) 编辑
摘要:在上一节LCD层次分析中,得出写个LCD驱动入口函数,需要以下4步: 1) 分配一个fb_info结构体: framebuffer_alloc(); 2) 设置fb_info 3) 设置硬件相关的操作 4) 使能LCD,并注册fb_info: register_framebuffer() 本节需要用 阅读全文
posted @ 2017-09-27 22:53 诺谦 阅读(13907) 评论(1) 推荐(1) 编辑