自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

知秋一叶

这世界里的每一个人,每一个东西,包括高山大海,刀剑风云,其本质都是一串数字流。

  • 博客(70)
  • 资源 (2)
  • 收藏
  • 关注

原创 Linux USB 驱动开发实例(二)—— USB 鼠标驱动注解及测试

参考2.6.14版本中的driver/usb/input/usbmouse.c。鼠标驱动可分为几个部分:驱动加载部分、probe部分、open部分、urb回调函数处理部分。 一、驱动加载部分static int __init usb_mouse_init(void){ int retval = usb_register(&usb_mouse_driver);//注册鼠标驱动

2016-03-28 20:05:25 8979 1

原创 CortexM0开发 —— UART时序分析

通用异步收发传输器(UniversalAsynchronousReceiver/Transmitter),通常称作UART,是一种异步收发传输器。将数据由串行通信与并行通信间作传输转换,作为并行输入成为串行输出的芯片UART是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。 1、UART通信协议      UART作为异步串口通信协议的一种,工作原理是

2016-03-27 22:06:02 3566

原创 CortexM0开发 —— LPC11C14的UART使用方法

【实验目的】:1、学习常用UART的原理2、学习PL-2303HX芯片3、掌握LPC11C14的UART使用方法【实验环境】:1、FS_11C14开发板2、FS_Colink  V2.03、RealView MDK(Keil uVision4)4、串口调试助手【实验步骤】:先看一下板子上UART的原理图PL-2303HX是一款UART-USB芯片,这

2016-03-27 17:19:20 8520

原创 Linux USB 驱动开发(三)—— 编写USB 驱动程序

Linux的设备驱动都遵循一个惯例——表征驱动程序(用driver更贴切一些,应该称为驱动器比较好吧)的结构体,结构体里面应该包含了驱动程序所需要的所有资源。用术语来说,就是这个驱动器对象所拥有的属性及成员。一、usb-skeleton       下面先看一下Linux内核源码中的一个usb-skeleton(就是usb驱动的骨架咯),其定义的设备结构体就叫做usb-skel:s

2016-03-26 15:10:13 26462 2

原创 Linux USB 驱动开发(二)—— USB 驱动几个重要数据结构

前面我们学习了USB 驱动的一个描述符,下面来学习 USB 驱动的几个重要数据结构一、struct usb_interface  接口函数struct usb_interface{ struct usb_host_interface *altsetting; struct usb_host_interface *cur_a

2016-03-26 15:03:27 8123

原创 Linux USB 驱动开发实例(一) —— USB摄像头驱动实现源码分析

Spac5xx的实现是按照标准的USB VIDEO设备的驱动框架编写(其具体的驱动框架可参照/usr/src/linux/drivers/usb/usbvideo.c文件),整个源程序由四个主体部分组成:设备模块的初始化模块和卸载模块,上层软件接口模块,数据传输模块。具体的模块分析如下: 一、初始化设备模块        该驱动采用了显式的模块初始化和消除函数,即调用mod

2016-03-25 22:57:36 17705 4

原创 Linux USB 驱动开发(一)—— USB设备基础概念

在终端用户看来,USB设备为主机提供了多种多样的附加功能,如文件传输,声音播放等,但对USB主机来说,它与所有USB设备的接口都是一致的。一个USB设备由3个功能模块组成:USB总线接口、USB逻辑设备和功能单元:a -- 这里的USB总线接口指的是USB设备中的串行接口引擎(SIE);b -- USB逻辑设备被USB系统软件看作是一个端点的集合;c -- 功能单元被客户软件看作是一个

2016-03-25 21:42:23 30844 5

原创 DS18B20 驱动编写

嵌入式开发平台:mini2440DS18B20 所用GPIO:S3C2410_GPF(3)一、DS18B20 时序分析        DS18B20的一线工作协议流程是:初始化→ROM操作指令→存储器操作指令→数据传输,其工作时序包括:初始化时序、写时序、读时序。1、初始化时序       主机首先发出一个480-960微秒的低电平脉冲,然后释放总线变为高电平,并在

2016-03-24 18:38:47 18784 2

原创 Linux 驱动面试题总结

1、 Linux设备中字符设备与块设备有什么主要的区别?请分别列举一些实际的设备说出它们是属于哪一类设备。    字符设备:字符设备是个能够像字节流(类似文件)一样被访问的设备,由字符设备驱动程序来实现这种特性。字符设备驱动程序通常至少实现open,close,read和write系统调用。字符终端、串口、鼠标、键盘、摄像头、声卡和显卡等就是典型的字符设备。    块设备:和字符设备类似,

2016-03-20 20:51:11 23608 3

原创 Exynos4412 中断处理流程详解

Linux 中,当外设触发中断后,大体处理流程如下:a -- 具体CPU architecture相关的模块会进行现场保护,然后调用machine driver对应的中断处理handler;b -- machine driver对应的中断处理handler中会根据硬件的信息获取HW interrupt ID,并且通过irq domain模块翻译成IRQ number;c --  调用该

2016-03-19 00:36:03 9121

原创 Exynos4412 中断驱动开发相关问题总结

1、Linux 中如何标识一个外部中断?     在linux kernel中,我们使用下面两个ID来标识一个来自外设的中断:a -- IRQ number      CPU需要为每一个外设中断编号,我们称之IRQ Number。这个IRQ number是一个虚拟的interrupt ID,和硬件无关,仅仅是被CPU用来标识一个外设中断。b -- HW interrupt ID

2016-03-18 21:43:41 2768

原创 Exynos4412 IIC 总线驱动开发相关问题总结

一 、问题1、IIC总线上的设备是怎么描述的?struct i2c_client{struct device dev;...};2、IIC总线上的驱动是怎么描述的?struct i2c_driver{struct device_driver driver;};3、IIC总线上的设备和驱动是怎么匹配的1)、对于 Cortex - A

2016-03-18 20:58:30 3384

原创 Exynos4412 IIC总线驱动开发(二)—— IIC 驱动开发

前面在Exynos4412 IIC总线驱动开发(一)—— IIC 基础概念及驱动架构分析 中学习了IIC驱动的架构,下面进入我们的驱动开发过程,         首先看一张代码层次图,有助于我们的理解       上面这些代码的展示是告诉我们:linux内核和芯片提供商为我们的的驱动程序提供了 i2c驱动的框架,以及框架底层与硬件相关的代码的实现。   剩下的就是针对挂

2016-03-17 22:15:31 8628 4

原创 Exynos4412 IIC总线驱动开发(一)—— IIC 基础概念及驱动架构分析

关于Exynos4412 IIC 裸机开发请看 :Exynos4412 裸机开发 —— IIC总线 ,下面回顾下 IIC 基础概念一、IIC 基础概念IIC(Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。IIC总线产生于在80年代,最初为音频和视频设备开发,如今主要在服务器管理中使用,其中包括单个组件状态

2016-03-17 20:45:18 15539 5

原创 Exynos4412 ADC 设备驱动开发

具体ADC硬件知识及裸机驱动请看: Exynos4412裸机开发 —— A/D转换器1、原理图如下:2、相关寄存器信息ADC_BASE      0x126C0000ADCCON        0x0000               1ADCDLY          0x0008               ADCDAT         0x000C

2016-03-17 20:35:56 7417 4

原创 Exynos4412 中断驱动开发(三)—— 设备树中中断节点的创建

提到中断就必须了解到GIC,下面先了解一下GIC一、GIC概念        GIC(Generic Interrupt Controller)是ARM公司提供的一个通用的中断控制器。GIC通过AMBA(Advanced Microcontroller Bus Architecture)这样的片上总线连接到一个或者多个ARM processor上。        下面是Exynos44

2016-03-17 19:10:38 13641 6

原创 Exynos4412 中断驱动开发(二)—— 中断处理流程分析

前面已经学习了中断的注册过程,下面由一张流程图来看一下当中断发生时的处理流程:中断发生之后处理流程a -- 具体的CPU architecture相关模块进行现场保护,然后调用machine driver执行对应的中断处理handler;b -- machine driver对应中断处理handler会根据硬件的信息获取HW interrupt  id,然后通过irq

2016-03-16 21:58:56 4672

原创 Exynos4412 中断驱动开发(一)—— 中断基础及中断的注册过程

一、中断基础概念        所谓中断,指CPU在执行程序的过程中,出现了某些突发事件即待处理,CPU必须暂停当前的程序。转去处理突发事件,处理完毕后CPU又返回原程序被中断的位置并继续执行。1、中断分类a -- 内部中断和外部中断      根据中断的的来源,中断可以分为内部中断和外部中断:内部中断,其中断源来自CPU内部(软件中断指令、溢出、除法错误等),例如,操作系统从

2016-03-16 20:45:31 7903 2

原创 Linux 设备驱动中的 I/O模型(二)—— 异步通知和异步I/O

阻塞和非阻塞访问、poll() 函数提供了较多地解决设备访问的机制,但是如果有了异步通知整套机制就更加完善了。      异步通知的意思是:一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态,这一点非常类似于硬件上“中断”的概念,比较准确的称谓是“信号驱动的异步I/O”。信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一

2016-03-16 19:54:06 2397

原创 Linux 设备驱动中的 I/O模型(一)—— 阻塞和非阻塞I/O

在前面学习网络编程时,曾经学过I/O模型

2016-03-15 21:04:05 5270 1

原创 Linux 设备驱动的并发控制

Linux 设备驱动中必须要解决的一个问题是多个进程对共享的资源的并发访问,并发的访问会导致竞态,即使是经验丰富的驱动工程师也常常设计出包含并发问题bug 的驱动程序。一、基础概念1、Linux 并发相关基础概念a -- 并发(concurrency)      并发指的是多个执行单元同时、并发被执行,而并发的执行单元对共享资源(硬件资源和软件上的全局变量、静态变量等)的访

2016-03-15 19:26:31 5871 2

原创 Linux 设备驱动开发 —— 设备树在platform设备驱动中的使用

关与设备树的概念,我们在Exynos4412 内核移植(六)—— 设备树解析 里面已经学习过,下面看一下设备树在设备驱动开发中起到的作用         Device Tree是一种描述硬件的数据结构,设备树源(Device Tree Source)文件(以.dts结尾)就是用来描述目标板硬件信息的。Device Tree由一系列被命名的结点(node)和属性(property)组成,而结点本

2016-03-14 20:47:15 29124 9

原创 Linux 设备驱动开发 —— platform设备驱动应用实例解析

前面我们已经学习了platform设备的理论知识Linux 设备驱动开发 —— platform 设备驱动 ,下面将通过一个实例来深入我们的学习。       一、platform 驱动的工作过程        platform模型驱动编程,需要实现platform_device(设备)与platform_driver(驱动)在platform(虚拟总线)上的注册、匹配,相互绑定,然后

2016-03-14 19:27:40 45075 25

原创 进程上下文、中断上下文及原子上下文

谈论进程上下文 、中断上下文 、 原子上下文之前,有必要讨论下两个概念:a -- 上下文       上下文是从英文context翻译过来,指的是一种环境。相对于进程而言,就是进程执行时的环境;       具体来说就是各个变量和数据,包括所有的寄存器变量、进程打开的文件、内存信息等。b -- 原子       原子(atom)本意是“不能被进一步分割的最小粒子”,而原子操作(

2016-03-13 15:21:13 6214

原创 内联函数 —— C 中关键字 inline 用法解析

一、什么是内联函数       在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗,为了解决,特别的引入了inline修饰符,表示为内联函数。       栈空间就是指放置程式的局部数据也就是函数内数据的内存空间,在系统下,栈空间是有限的,假如频繁大量的使用就会造成因栈空间不足所造成的程式出错的问题,函数的死循环递归调用的最终结果就是导致栈内存空

2016-03-13 13:37:36 138011 30

原创 Linux 设备驱动开发 —— Tasklets 机制浅析

一 、Tasklets 机制基础知识点1、Taklets 机制概念      Tasklets 机制是linux中断处理机制中的软中断延迟机制。通常用于减少中断处理的时间,将本应该是在中断服务程序中完成的任务转化成软中断完成。      为了最大程度的避免中断处理时间过长而导致中断丢失,有时候我们需要把一些在中断处理中不是非常紧急的任务放在后面执行,而让中断处理程序尽快返回。在老版本的

2016-03-13 13:07:39 4446 1

原创 Linux 设备驱动开发 —— platform 设备驱动

一、platform总线、设备与驱动        一个现实的Linux设备和驱动通常都需要挂接在一种总线上,对于本身依附于PCI、USB、I2C、SPI等的设备而言,这自然不是问题,但是在嵌入式系统里面,SoC系统中集成的独立的外设控制器、挂接在SoC内存空间的外设等确不依附于此类总线。基于这一背景,Linux发明了一种虚拟的总线,称为platform总线,相应的设备称为platform_d

2016-03-12 14:45:56 14085 5

原创 Linux 文件系统与设备文件系统 (二)—— sysfs 文件系统与Linux设备模型

提到 sysfs 文件系统 ,必须先需要了解的是Linux设备模型,什么事Linux设备模型呢?一、Linux 设备模型1、设备模型概述     从2.6版本开始,Linux开发团队便为内核建立起一个统一的设备模型。在以前的内核中没有独立的数据结构用来让内核获得系统整体配合的信息。尽管缺乏这些信息,在多数情况下内核还是能正常工作的。然而,随着拓扑结构越来越复杂,以及要支持诸如电源管理等

2016-03-12 12:19:28 12029 2

原创 Linux 文件系统与设备文件系统 (一)—— udev 设备文件系统

一、什么是Linux设备文件系统      首先我们不看定义,定义总是太抽象很难理解,我们先看现象。当我们往开发板上移植了一个新的文件系统之后(假如各种设备驱动也移植好了),启动开发板,我们用串口工具进入开发板,查看系统/dev目录,往往里面没有或者就只有null、console等几个系统必须的设备文件在这儿外,没有任何设备文件了。那我们移植好的各种设备驱动的设备文件怎么没有啊?如果要使用这些

2016-03-12 10:55:35 15277 3

原创 Linux 字符设备驱动开发基础(六)—— VFS 虚拟文件系统解析

一、VFS 虚拟文件系统基础概念        Linux 允许众多不同的文件系统共存,并支持跨文件系统的文件操作,这是因为有虚拟文件系统的存在。虚拟文件系统,即VFS(Virtual File System)是 Linux 内核中的一个软件抽象层。它通过一些数据结构及其方法向实际的文件系统如 ext2,vfat 提供接口机制。        Linux 有两个特性:a --  跨

2016-03-11 23:39:49 6607 2

原创 Linux 字符设备驱动开发基础(五)—— ioremap() 函数解析

一、 ioremap() 函数基础概念       几乎每一种外设都是通过读写设备上的寄存器来进行的,通常包括控制寄存器、状态寄存器和数据寄存器三大类,外设的寄存器通常被连续地编址。根据CPU体系结构的不同,CPU对IO端口的编址方式有两种:a -- I/O 映射方式(I/O-mapped)       典型地,如X86处理器为外设专门实现了一个单独的地址空间,称为"I/O地址空间"或

2016-03-11 23:26:18 34336 2

原创 Linux 字符设备驱动开发基础(四)—— ioctl() 函数解析

解析完 open、close、read、write 四个函数后,终于到我们的 ioctl() 函数了一、 什么是ioctl         ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等。下面是其源代码定义:函数名: ioctl功 能: 控制I/O设备用 法: int

2016-03-11 22:55:02 15378 5

原创 Linux 字符设备驱动开发基础(三)—— read()、write() 相关函数解析

我们在前面讲到了file_operations,其是一个函数指针的集合,用于存放我们定义的用于操作设备的函数的指针,如果我们不定义,它默认保留为NULL。其中有最重要的几个函数,分别是open()、read()、write()、ioctl(),下面分别对其进行解析      下面先写一下打开和关闭设备的函数      int (*open) (struct inode *, struc

2016-03-11 22:16:23 20538 6

原创 Linux 字符设备驱动开发基础(二)—— 编写简单 PWM 设备驱动

编写驱动的第一步仍是看原理图:       可以看到,该蜂鸣器由 GPD0_0 来控制 ,查手册可知该I/O口由Time0 来控制,找到相应的寄存器:a -- I/O口寄存器及地址      GPD0CON  0x114000a0b -- Time0 寄存器及地址      基地址为:TIMER_BASE 0x139D0000       这些物理寄存器地址都是相邻

2016-03-11 21:25:37 12659 4

原创 Linux 字符设备驱动开发基础(一)—— 编写简单 LED 设备驱动

现在,我们来编写自己第一个字符设备驱动 —— 点亮LED。硬件平台:Exynos4412(FS4412)编写驱动分下面几步:a -- 查看原理图、数据手册,了解设备的操作方法;b -- 在内核中找到相近的驱动程序,以它为模板进行开发,有时候需要从零开始;c -- 实现驱动程序的初始化:比如向内核注册这个驱动程序,这样应用程序传入文件名,内核才能找到相应的驱动程序;d

2016-03-10 22:48:11 12332 10

原创 Linux 字符设备驱动结构(四)—— file_operations 结构体知识解析

前面在 Linux 字符设备驱动开发基础 (三)—— 字符设备驱动结构(中) ,我们已经介绍了两种重要的数据结构 struct inode{...}与 struct file{...} ,下面来介绍另一个比较重要数据结构struct _file_operationsstruct _file_operations在Fs.h这个文件里面被定义的,如下所示:struct file_ope

2016-03-10 22:20:30 22885

原创 Linux 字符设备驱动结构(三)—— file、inode结构体及chardevs数组等相关知识解析

前面我们学习了字符设备结构体cdev Linux 字符设备驱动开发 (一)—— 字符设备驱动结构(上)  下面继续学习字符设备另外几个重要的数据结构。       先看下面这张图:

2016-03-10 20:58:48 13048 2

原创 Linux 字符设备驱动结构(二)—— 自动创建设备节点

上一篇我们介绍到创建设备文件的方法,利用cat /proc/devices查看申请到的设备名,设备号。第一种是使用mknod手工创建:mknod filename type major minor第二种是自动创建设备节点:利用udev(mdev)来实现设备文件的自动创建,首先应保证支持udev(mdev),由busybox配置。在驱动初始化代码里调用class_create为该设备创建一个

2016-03-10 20:46:35 19398 3

原创 Linux 字符设备驱动结构(一)—— cdev 结构体、设备号相关知识解析

一、字符设备基础知识1、设备驱动分类      linux系统将设备分为3类:字符设备、块设备、网络设备。使用驱动程序:字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据。字符设备是面向流的设备,常见的字符设备有鼠标、键盘、串口、控制台和LED设备等。块设备:是指可以从设备的任意位置读取一定长度数据的设备。块

2016-03-09 23:12:34 58801 31

原创 Linux 驱动开发之内核模块开发(四)—— 符号表的导出

Linux内核头文件提供了一个方便的方法用来管理符号的对模块外部的可见性,因此减少了命名空间的污染(命名空间的名称可能会与内核其他地方定义的名称冲突),并且适当信息隐藏。 如果你的模块需要输出符号给其他模块使用,应当使用下面的宏定义:EXPORT_SYMBOL(name);EXPORT_SYMBOL_GPL(name);   //只适用于包含GPL许可权的模块;     这两个宏均用于

2016-03-09 21:30:51 5205

98DX3336芯片手册

98DX3336

2016-07-06

vim配置(程序自动补全)

使用过Source Insight的人一定对它的自动补全功能印象深刻,在很多的集成开发环境中,也都支持自动补全。vim做为一个出色的编辑器,这样的功能当然少不了。至于如何实现程序自动补全,网上教程很多。这里,我将自己用的配置文件发给大家,大家可以移步(待会会补上地址),只要简单的两步,就能实现vim的程序自动补全功能,大大增加了在vim上的开发效率。

2015-12-26

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除