09 2017 档案

摘要:在上一节LCD层次分析中,得出写个LCD驱动入口函数,需要以下4步: 1) 分配一个fb_info结构体: framebuffer_alloc(); 2) 设置fb_info 3) 设置硬件相关的操作 4) 使能LCD,并注册fb_info: register_framebuffer() 本节需要用 阅读全文
posted @ 2017-09-27 22:53 诺谦 阅读(14703) 评论(1) 推荐(1)
摘要:如果我们的系统要用GUI(图形界面接口),这时LCD设备驱动程序就应该编写成frambuffer接口,而不是像之前那样只编写操作底层的LCD控制器接口。 什么是frambuffer设备? frambuffer设备层是对图像设备的一种抽象,它代表了视频硬件的帧缓存,使得应用程序通过定义好的接口就可以访 阅读全文
posted @ 2017-09-27 18:42 诺谦 阅读(7203) 评论(1) 推荐(3)
摘要:echo:显示一段文字 比如: echo hello,串口上就显示hello echo hello > /dev/tty1, LCD上便显示hello字段 cat:查看一个文件的内容 比如: cat Makeflie,串口上就显示Makeflie文件的内容 cat Makeflie > /dev/t 阅读全文
posted @ 2017-09-27 12:26 诺谦 阅读(2436) 评论(0) 推荐(0)
摘要:描述: 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 快速排序 的平均时间复杂度为O(NlogN),是冒泡排序的一种改进版。 方法:快速排序主要 阅读全文
posted @ 2017-09-26 16:01 诺谦 阅读(28145) 评论(8) 推荐(2)
摘要:本节目标: 学习platform机制,如何实现驱动层分离 1.先来看看我们之前分析输入子系统的分层概念,如下图所示: 如上图所示,分层就是将一个复杂的工作分成了4层, 分而做之,降低难度,每一层专注于自己的事情, 系统只将其中的核心层和事件处理层写好了,所以我们只需要来写驱动层即可,接下来我们来分析 阅读全文
posted @ 2017-09-21 16:42 诺谦 阅读(15872) 评论(7) 推荐(6)
摘要:在上一节分析输入子系统内的intput_handler软件处理部分后,接下来我们开始写input_dev驱动 本节目标: 实现键盘驱动,让开发板的4个按键代表键盘中的L、S、空格键、回车键 1.先来介绍以下几个结构体使用和函数,下面代码中会用到 1)input_dev驱动设备结构体中常用成员如下: 阅读全文
posted @ 2017-09-19 20:16 诺谦 阅读(17516) 评论(9) 推荐(8)
摘要:hexdump: 查看文件的内容,比如二进制文件中包含的某些字符串,通常用来调试驱动用 描述: 我们以event1为例,当我们insmod挂载了键盘驱动后,出现一个event1设备, 此时没有按键按下,所以event1里面的数据是没有的,那么数据又是从来哪里来? 通过键盘驱动的read函数,若有按键 阅读全文
posted @ 2017-09-19 19:15 诺谦 阅读(6319) 评论(0) 推荐(1)
摘要:对于做驱动经常会使用exec来试验驱动,通过exec将-sh进程下的描述符指向我们的驱动,来实现调试 -sh进程常用描述符号: 0:标准输入 1:标准输出 2:错误信息 5:中断服务 exec命令使用: 实例: 1. 挂载开发板的键盘驱动(tty1) 2.挂载按键中断服务函数 如下图: 3.释放按键 阅读全文
posted @ 2017-09-19 18:08 诺谦 阅读(1973) 评论(7) 推荐(2)
摘要:描述: 晓萌有一个N×N的的棋盘,中间有N*N个正方形的1×1的格子,他随机在棋盘上撒上一些棋子(假设全部正好落在各个格子里)。他希望知道,当前的棋盘上有多少个不包含棋子的,由至少四个1×1的格子组成的正方形(正方形之间可以有重叠的部分)。 输入第1行为棋盘的边长N,第2行-第N+1组成一个每行有N 阅读全文
posted @ 2017-09-19 09:46 诺谦 阅读(2581) 评论(0) 推荐(0)
摘要:给定一个非负整数数组,假定你的初始位置为数组第一个下标。 数组中的每个元素代表你在那个位置能够跳跃的最大长度。 你的目标是到达最后一个下标,并且使用最少的跳跃次数。 例如: A=[2,3,1,1,4],到达最后一个下标的最少跳跃次数为 2。(先跳跃 1 步,从下标 0 到 1,然后跳跃 3 步,到达 阅读全文
posted @ 2017-09-18 23:59 诺谦 阅读(3579) 评论(0) 推荐(2)
摘要:在此节之前,我们学的都是简单的字符驱动,涉及的内容有字符驱动的框架、自动创建设备节点、linux中断、poll机制、异步通知、同步互斥/非阻塞、定时器去抖动。 其中驱动框架如下: 1)写file_operations结构体的成员函数: .open()、.read()、.write() 2)在入口函数 阅读全文
posted @ 2017-09-18 14:43 诺谦 阅读(24767) 评论(9) 推荐(19)
摘要:本节目标: 通过定时器来防止按键抖动,测试程序是使用上节的:阻塞操作的测试程序 1.如下图所示,在没有定时器防抖情况下,按键没有稳定之前会多次进入中断,使得输出多个相同信息出来 2.按键波形图,如下所示: 3.如何消去按键抖动 通过定时器延时10ms,然后每当按键进入中断时就更新定时器延时10ms, 阅读全文
posted @ 2017-09-14 18:29 诺谦 阅读(7967) 评论(0) 推荐(3)
摘要:本节目标: 通过DMA,无需中断,接收不定时长的串口数据 描述:当在串口多数据传输下,CPU会产生多次中断来接收串口数据,这样会大大地降低CPU效率,同时又需要CPU去做其它更重要的事情,我们应该如何来优化?比如四轴飞行器,当在不停地获取姿态控制方向时,又要去接收串口数据.答:使用DMA,无需CPU 阅读全文
posted @ 2017-09-14 00:07 诺谦 阅读(50658) 评论(18) 推荐(12)
摘要:本节目标: 当设备被一个程序打开时,存在被另一个程序打开的可能,如果两个或多个程序同时对设备文件进行写操作,这就是说我们的设备资源同时被多个进程使用,对共享资源(硬件资源、和软件上的全局变量、静态变量等)的访问则很容易导致竞态。 显然这不是我们想要的,所以本节引入互斥的概念:实现同一时刻,只能一个应 阅读全文
posted @ 2017-09-13 16:07 诺谦 阅读(4496) 评论(0) 推荐(4)
摘要:之前学的应用层都是: 1)查询方式:一直读 2)中断方式.同样一直读,直到中断进程唤醒 3)poll机制:一直在poll函数中睡眠,一定时间读一次 以上3种,我们都是让应用程序主动去读,本节我们学习异步通知,它的作用就是当驱动层有数据时,主动告诉应用程序,然后应用程序再来读, 这样,应用程序就可以干 阅读全文
posted @ 2017-09-12 10:28 诺谦 阅读(4048) 评论(0) 推荐(2)
摘要:本节继续在上一节中断按键程序里改进,添加poll机制. 那么我们为什么还需要poll机制呢。之前的测试程序是这样: 在没有poll机制的情况下,大部分时间程序都处在read中休眠的那个位置。如果我们不想让程序停在这个位置,而是希望当有按键按下时,我们再去read,因此我们编写poll函数,测试程序调 阅读全文
posted @ 2017-09-12 10:01 诺谦 阅读(8282) 评论(3) 推荐(5)
摘要:request_irq()和free_irq()分析完毕后,接下来开始编写上升沿中断的按键驱动 如下图,需要设置4个按键的EINT0, EINT2, EINT11, EINT19的模式为双边沿,且设置按键引脚为中断引脚 这里我们只需要使用request_irq函数就行了, 在request_irq函 阅读全文
posted @ 2017-09-11 20:07 诺谦 阅读(10173) 评论(0) 推荐(5)
摘要:上一节讲了如何实现运行中断,这些都是系统给做好的,当我们想自己写个中断处理程序,去执行自己的代码,就需要写irq_desc->action->handler,然后通过request_irq()来向内核申请注册中断 本节目标: 分析request_irq()如何申请注册中断,free_irq()如何注 阅读全文
posted @ 2017-09-11 19:43 诺谦 阅读(16205) 评论(0) 推荐(4)
摘要:本节目标: 分析在linux中的中断是如何运行的,以及中断3大结构体:irq_desc、irq_chip、irqaction 在裸板程序中(参考stmdb和ldmia详解): 1.按键按下, 2.cpu发生中断, 3.强制跳到异常向量入口执行(0x18中断地址处) 3.1使用stmdb将寄存器值保存 阅读全文
posted @ 2017-09-11 19:19 诺谦 阅读(9704) 评论(1) 推荐(4)
摘要:本节目标: 写second程序,内容:通过查询方式驱动按键 1.写出框架 1.1写file_oprations结构体,second_drv_open函数,second_drv_read函数 1.2写入口函数,并自动创建设备节点,修饰入口函数 1.3写出口函数,并自动注销设备节点,修饰出口函数 1.4 阅读全文
posted @ 2017-09-11 18:43 诺谦 阅读(5341) 评论(2) 推荐(2)
摘要:在上一节中已经将驱动程序框架搭建好了 接下来开始写硬件的操作(控制LED): (1)看原理图,确定引脚 (2)看2440手册 (3)写代码(需要使用ioremap()函数映射虚拟地址,在linux中只能使用虚拟地址) (4)修改上一节的测试程序 (5)使用次设备号来控制设备下不同的灯 1.看led引 阅读全文
posted @ 2017-09-11 18:30 诺谦 阅读(4455) 评论(2) 推荐(4)
摘要:先讲解驱动框架,然后写出first_drv驱动程序,来打印一些信息 写出first_drv驱动程序需要以下几步: (1)写出驱动程序first_drv_open first_drv_write (2)需要定义file_operations结构体来封装驱动函数first_drv_open first_ 阅读全文
posted @ 2017-09-11 18:11 诺谦 阅读(9776) 评论(21) 推荐(8)
摘要:u-boot的任务是启动内核,内核的任务是启动应用程序 ,应用程序会涉及很多文件和硬件操作(当然不会直接操作硬件),比如读写文件,点灯、获取按键值。 比如对于控制led灯的用户程序与驱动程序,最简单的实现方法是: 应用程序中需要打开led灯,就需要open函数,在内核中的驱动程序中也有对应的led_ 阅读全文
posted @ 2017-09-11 17:39 诺谦 阅读(5685) 评论(3) 推荐(6)
摘要:kill:指定将信号发送给某个进程,常用来杀掉进程,可以通过ps、top命令来查看进程 在默认情况下: 采用编号为15的TERM信号。TERM信号将终止所有不能捕获该信号的进程。 对于那些可以捕获该信号的进程就要用编号为9的kill信号,强行“杀掉”该进程。 可以使用kill -l 来列出所有型号名 阅读全文
posted @ 2017-09-07 14:49 诺谦 阅读(3896) 评论(0) 推荐(0)