- 博客(202)
- 收藏
- 关注
原创 PC上简单驱动的Makefile模板
obj-m := hello.oKERNELDIR ?= /lib/modules/$(shell uname -r)/buildPWD := $(shell pwd)all: $(MAKE) -C $(KERNELDIR) M=$(PWD)clean: rm -rf *.o *~ core .depend .*.cmd *.ko *.
2014-05-15 14:28:11
633
原创 OV9712 CMOS基于JZ4775调试(三)
新拿到的硬件,是好是坏,或者有没有一些大意或细节的错误,当然需要驱动程序并结合一些电气工具如(示波器)去检测.1.SCCB: 当然这是最首检测也是必须检测的.这里我是用iic-tools工具(LINUX平台支持用户空间驱动的项目,需要内核编译相关的支持).源码可以网上搜索移植.后续会提供我这边提供整理简化的IIC-TOOLS源码.iic-tools是LINUX平台调试IIC设备的利器.一共
2014-04-04 11:46:16
5934
原创 OV9712 CMOS基于JZ4775调试(二)
下面列出这几天在JZ4775平台折腾OV9712的调试编程步骤.1.DATASHEET AND SAMPLE CODE: 数据手册和参考代码,这一点最好向厂家或其下的代理商要,一般都有会,也会给. 1-1.DATASHEET: 拿到DATASHEET首先要看的当然是features这一章节,在这一章节我们可以知道CMOS功能和宏观特性.如OV9712关于featu
2014-04-04 11:45:16
3696
原创 OV9712 CMOS基于JZ4775调试(一)
前几天在JZ4775平台(LK3.0内核)折腾OV9712COMS.作下笔记,一方面备忘,另一方面分享给有需要的网友参考. 1.调试过程中遇到的问题: 下面先概述下调试过程中遇到的主要问题:1-1.DVP接口: 官方提供的硬件参考原理图是10根数据线的DVP,而这边的硬件是8根数据线的DVP.并且在官方提供的datasheet并没有找到DVP配置的寄
2014-04-04 11:44:06
4102
1
原创 内核中与驱动相关的内存操作之十七(DMA)
DMA,即Direct Memory Access,直接内存访问.主要是考虑到CPU和外设之间拷贝大量数据时提升性能的一种硬件策略.
2014-03-18 16:16:23
2958
原创 内核中与驱动相关的内存操作之十六(异步I/O)
1.异步IO: 异步IO机制是指:一旦设备就绪,则主动通知应用程序,这样应用程序就不需要查询设备状态了.当设备就绪条件满足时,设备驱动发一个信号给对应的用户空间程序即可.对关设备是否可操作内核提供了三套机制:阻塞IO、非阻塞IO(poll)、异步通知.主要特性如下:
2014-03-18 16:14:11
1002
原创 内核中与驱动相关的内存操作之十五(标准I/O)
标准IO又叫缓存IO,内核默认的就是标准IO机制.大多数文件系统的默认I/O操作都是缓存 I/O,比如用户将要写到磁盘的数据会被标准IO缓存,在一定的时机内核会把缓冲的数据写到物理磁盘上.其思想框架如下图所示: 标准IO有以下优点:•缓存 I/O 使用了操作系统内核缓冲区,在一定程度上分离了应用程序空间和实际的物理设备;•缓存 I/O 可以减少读盘的次数,从而提高性能;
2014-03-18 16:13:45
922
原创 内核中与驱动相关的内存操作之十四(直接I/O)
1.直接IO的宏观思想: 直接I/O,它是指数据可以直接在磁盘和应用程序地址空间进行传输,而不用路由内核提供的数据缓冲区.宏观框架示意图如下:2.直接IO出现的原因: 标准I/O即缓冲I/O,大多数文件系统的默认操作就是标准I/O.它的存在,缓冲了应用程序到实质物理设备的数据,内核会根据一定的时机更新到实质的物理设备和应用程序空间里面去.像一些应用程序,它有
2014-03-18 16:11:02
1018
原创 内核中与驱动相关的内存操作之十三(/dev/mem)
在不少平台,包括嵌入式的,如jz4730,pxa-166等都把CPU可访问的整个物理地址空间(逻辑地址空间)映射到用户空间去.其和用户交互的设备节点就是/dev/mem.用户空间通过这个设备节点可以直接访问整个CPU可访的物理地址空间(逻辑地址空间).这里的映射,从宏观来讲,是一种"中介",一种"逻辑转换". 如果我们因为某种特殊需求需要在用户空间编写程序的话(现在有很多用户空间的驱动,
2014-03-18 16:10:08
1513
原创 内核中与驱动相关的内存操作之十二(mmap)
mmap是标准的用户空间的系统调用API.最为常见的就是用户空间对LCD的操作.mmap允许用户直接对硬件设备实现直接访问操作,因此,其效率是很高的.要正确使用mmap机制,首先重温一下VMA.
2014-03-18 16:09:15
1122
原创 内核中与驱动相关的内存操作之十一(IO内存)
设备通常会提供一组寄存器用于控制设备、读定设备和获取设备状态,即控制寄存器、数据寄存器和状态寄存器.这些寄存器可能位于I/O空间,也可能位于内存空间.当位于I/O空间时,通常被称为I/O端口,位于内存空间时,对应的内存空间被称为I/O内存.在嵌入式LINUX中,我们接触最多的就是I/O内存:#define request_mem_region(start,n,name) __request_r
2014-03-18 16:08:44
795
原创 内核中与驱动相关的内存操作之十(内存屏障)
虽然实际驱动中不常用,但是阅读内核比较深层的代码经常会遇到.为什么存在内存屏障呢?先看一下下面的场景: 编译器和处理器为了提高效率,可能对读和写操作重新进行了排序,例如:在某些处理器上,以下代码: A = 1; B = 2; 有可能在A中存放新值之前就在B中存放新值. 但是,我们在操作内存或者和硬件交互时,常常需要确保一个给定的顺序.
2014-03-18 16:05:04
739
原创 内核中与驱动相关的内存操作之九(重映射)
ioremap()函数也是需要建立新的页表,但是不会分配内存.它的功能是将一个物理地址转换成内核需要的虚拟地址(逻辑地址),从而实际硬件的操作.其相反的动作为iounmap(). 以S3C2440的RTC驱动为例:struct platform_device s3c_device_rtc = { .name = "s3c2410-rtc", .id
2014-03-18 16:04:10
869
原创 内核中与驱动相关的内存操作之七(slab)
slab分配器,是内核为了达到高效利用内存的一种管理算法,它以牺牲一些内存空间的代价,收获了代码在时间上的利益. 1.slab的动机: 在操作系统动作过程中,经常会涉及到大量对象的重复生成、使用与释放.在LINUX系统中所用到的对象,比较典型的例子是inode、task_struct等.这些大量的常用的对象如果每次都要从无到有生成、投入使用、使用完再释放,类似这样的操作频率很高.
2014-03-18 16:01:20
1346
原创 内核中与驱动相关的内存操作之六(vmalloc)
vmalloc是在整个虚拟空间分配出一段内存,它所面向的处理对象是CPU整个虚拟内存空间,而kmalloc是CPU的逻辑地址空间.逻辑地址空间也是"虚拟"的,只不过它和物理地址空间保持着线性关系的一种"虚拟地址空间",可以说,逻辑地址是虚拟地址的一个子集.1.原型: 2.参数说明: 3.返回值: 4.应用场景: 5.实例:
2014-03-18 16:00:46
865
原创 内核中与驱动相关的内存操作之五(kmalloc)
在内核空间里面获取一段内存区域,最常用到的API就是kmalloc.1.原型(lk2.6.22)如下:static inline void *kmalloc(size_t size, gfp_t flags) 2.参数说明:size: 要分配内存空间的大小,以字节为单位.flags: 分配标志,用来控制kmalloc的行为.主要如下:
2014-03-18 15:59:51
2658
原创 内核中与驱动相关的内存操作之三(内存模型)
1 页内核把物理页作为内存管理单元.大多数32全体系结构支持4KB的页.从虚拟内存角度来说,页就是最小单位.struct page结构体定义于中: Page结构与物理页相关的,而并非与虚拟页相关.因此,该结构对页的描述只是短暂的.即使页中所包含的数据继续存在,由于交换等原因,它们可能不再和同一个page结构关联.内核仅仅用这个数据结构来描述当前时刻在相关的物理页存放的东西.这种数据结构
2014-03-18 15:59:15
944
原创 内核中与驱动相关的内存操作之二(cache)
ARM处理器的主频比较高,而一般的主存储器的主频比较低.这样,如果指令和数据都存放在主存储器中,主存储器的速度将会严重制约整个系统的性能.为解决这一矛盾,引入了高速缓冲存储器(cache)和写缓冲区(write buffers).它位于主存储器和CPU之间,用来提高存储系统的性能的一种策略.其流程如下:CPUCache/WriteBufferRAM 1.高速缓冲存储器和写
2014-03-18 15:57:16
833
转载 u盘自动挂载-udev
Linux传统上使用静态设备创建的方法,在dev下创建了大量的节点,而不管这些节点相应的硬件设备是否存在。采用udev的方法,系统检测到设备才会往创建这些设备对应的节点。 这里我们简单的说一下udev的工作原理: Udev是依靠于sysfs的,当系统中添加一个新的设备后,内核检测到后就会产生一个hotplug event并查找/proc/sys/kernel/hotplug往找出治理设
2014-03-03 16:03:15
789
原创 关于筛选输入设备的设备节点
对于一些输入设备,尤其是热插拔的USB设备,其会自动生成或者关联设备节点--/dev/input/eventX(X = 0,1,2,...),这时候,我们需要找到我们要操作的目标设备节点,下面是一个示例,可以根据输入设备的name域判断.如下:/*Function: This Demo Is To Detect What The Input Types Is--Base on
2014-02-21 14:25:23
580
原创 shell与运算的一个示例
之前对shell写一个脚本,判断两文件是否同时存在走了些弯路,主要是由shell语法不熟悉,特此记下,作为笔记.#!/bin/shCurrentDir=/tmpif [ -f $CurrentDir/usb_hid_camera.txt ] && [ -f $CurrentDir/usb_hid_barcode.txt ]; then e
2014-02-21 14:16:58
452
转载 Linux 中直接 I/O 机制的介绍
Linux 中直接 I/O 机制的介绍黄 晓晨, 软件工程师, IBM黄晓晨,IBM system Z 自动化技术支持软件工程师。简介: 对于传统的操作系统来说,普通的 I/O 操作一般会被内核缓存,这种 I/O 被称作缓存 I/O。本文所介绍的文件访问机制不经过操作系统内核的缓存,数据直接在磁盘和应用程序地址空间进行传输,所以该文件访问的机制称作为直接 I/O。Lin
2014-01-03 14:55:24
692
原创 LINUX中时间相关的概念与操作
一切东西离开了时间便失去了其存在的意义,内核也不例外.下面是经常在内核驱动中经常谈及到的时间的概念和具体的操作应用.1.HZ: HZ在内核中表征时钟中断间隔.与具体体系结构相关.可以理解为"秒".经常用它来派生更短的延时,如毫秒.如下: #define TIMEOUT_WIEGAND HZ/100 表示10毫秒. 它也常和ji
2013-12-16 11:16:46
960
原创 设备文件指针操控llseek
llseek主要用来操作文件的指针.其实质是内核依赖filp->f_ops执行文件的定位. 1.原型:loff_t (*llseek)(struct file *,loff_t,int); 各参数意义如下:
2013-12-13 21:55:01
2271
原创 异步通知fasync
最基本的read()和write()函数实现的数据最基本的交互.等待队列实现了读写阻塞策略,针对一些比较长时间才可以获取资源的设备进程进行休眠处理进而优化了系统资源的利用率;poll机制可以实现设备的监听,可以进一步提高读写机制的命中时机.而异步通知则类似于硬件上的中断,当设备资源准备就绪,向指定进程发送信号,从而唤醒进程对此信号进行处理. 从而言之,读写是必须的核心动作,而wait_q
2013-12-12 16:04:00
1901
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人