linux内核驱动
文章平均质量分 77
HAOMCU
这个作者很懒,什么都没留下…
展开
-
Linux设备驱动第六篇:高级字符驱动操作之iotcl
在之前我们介绍了如何实现一个简单的字符设备驱动,并介绍了简单的open,close,read,write等驱动提供的基本功能。但是一个真正的设备驱动往往提供了比简单读写更高级的功能。这一篇我们就来介绍一些驱动动中使用的一些高级的操作的实现。大部分驱动除了提供对设备的读写操作外,还需要提供对硬件控制的接口,比如查询一个framebuffer设备能提供多大的分辨率,读取一个RTC设备的时间,设原创 2015-07-24 15:09:24 · 1962 阅读 · 0 评论 -
linux内核中对nand的坏块管理
闲来无事,追踪了下linux内核中对nand的坏块管理代码。大致记录一下。内核中对nand的坏块管理是在nand的驱动中实现的,一般情况下,我们在实现nand控制器的驱动时不用考虑坏块的管理,这些机制已经在nand驱动的通用框架中实现了,我们要做的就是在nand驱动的框架上对接上nand控制器私有的操作与参数就可以了,例如读写函数以及nand控制器支持的ecc布局等。当然,这里主要是分析坏块管原创 2012-11-14 14:46:15 · 8064 阅读 · 1 评论 -
NAND速度优化探索
使用的硬件平台为博通7231,NAND型号为K9GAG08U0E。最初的情况是这样的,此款cpu的nand控制器不支持DMA,另外默认的主频是108M的,经过测试flash的读速度为4M/s左右,对于系统性能有一定的限制(软件启动速度,系统开机速度等),后来更改nand控制器主频为206M,CE信号的低、高电平时间适量缩短(这个是最重要的,这个缩短之后,一个读周期就会大大缩短,比提高主频效果还原创 2012-10-31 11:01:20 · 2856 阅读 · 0 评论 -
MIPS 在linux中的内存映射
如图:一些说明:1.内核从什么地方开始运行:MIPS Linux内核的代码构建为在kseg0区运行;虚拟地址从0x80000000向上。这个范围的地址仅仅是一个到物理内存低512MB的窗口,无需TLB管理。2.异常入口点:大多数MIPS CPU中,这都是由硬件布线固化到kseg0底部附近。最新的CPU可以提供EBase寄存器,对异常入口重新定位。主要是让多个共享原创 2012-10-30 17:34:29 · 5918 阅读 · 0 评论 -
linux内核启动时间分析
1. 首先修改kernel的bootargs,在bootargs中添加以下内容: initcall_debugprintk.time=y 我使用的bootargs修改后如下: mem=64M console=ttySAC0,115200 noinitrd init=/linuxrc root=/dev/nfs r原创 2012-09-20 11:22:48 · 1670 阅读 · 0 评论 -
Linux内核中NAND Flash坏块管理
原文地址:http://blog.csdn.net/linux_xiaomugua/article/details/7529348由于NAND Flash的现有工艺不能保证NAND的Memory Array在其生命周期中保持性能的可靠,因此在NAND芯片出厂的时候,厂家只能保证block 0不是坏块,对于其它block,则均有可能存在坏块,而且NAND芯片在使用的过程中也很容易产生坏块。因此,转载 2012-07-24 19:24:47 · 3353 阅读 · 0 评论 -
一个驱动模块依赖多个C文件的Makefile写法
[guowenxue@localhost plat_driver]$ lsdev_gprs.c dev_skelton.c gprs.c include Makefile[guowenxue@localhost plat_driver]$ cat Makefile ARCH = AT91SAM9260PLAT ?= L300 CROSS转载 2012-07-25 10:20:33 · 3179 阅读 · 0 评论 -
UBI
翻译 - 来源MTD网站 http://www.linux-mtd.infradead.org/doc/ubi.htmlTable of contentsBig red noteOverviewSource codeMailing listUser-space toolsUBI headersUBI volume tableImplementation detail转载 2012-07-24 19:19:28 · 1751 阅读 · 0 评论 -
ARM 浮点运算详解
原帖地址:http://blog.sina.com.cn/s/blog_602f87700100r5xe.html一:早期ARM上的浮点模拟器:早期的ARM没有协处理器,所以浮点运算是由CPU来模拟的,即所需浮点运算均在浮点运算模拟器(float math emulation)上进行,需要的浮点运算,常要耗费数千个循环才能执行完毕,因此特别缓慢。直到今天,在ARM Kern转载 2012-06-19 18:19:27 · 5555 阅读 · 0 评论 -
linux 内核与用户空间通信之netlink使用方法
Linux中的进程间通信机制源自于Unix平台上的进程通信机制。Unix的两大分支AT&T Unix和BSD Unix在进程通信实现机制上的各有所不同,前者形成了运行在单个计算机上的System V IPC,后者则实现了基于socket的进程间通信机制。同时Linux也遵循IEEE制定的Posix IPC标准,在三者的基础之上实现了以下几种主要的IPC机制:管道(Pipe)及命名管道(Named转载 2012-03-20 09:41:52 · 41179 阅读 · 2 评论 -
UBI文件系统遇到的问题
记录使用UBI遇到的一些问题,会补充。1.UBI warning: ubi_scan: 35 PEBs are corruptedcorrupted PEBs are: 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 84 85 86ker原创 2012-11-22 15:04:12 · 3721 阅读 · 2 评论 -
创建linux内核git仓库
前一段时间创建linux内核的git仓库,遇到了几个很棘手的问题。这里记录一下。我使用的内核版本号为linux-3.3.8-1.3,如果正常的话,生成的include/generated/utsrelease.h文件内容应该为:#define UTS_RELEASE "3.3.8-1.3"。第一个问题:使用git初始化仓库,提交一次后,include/generated/utsre原创 2013-03-13 14:30:12 · 3522 阅读 · 2 评论 -
Linux设备驱动第七篇:高级字符驱动操作之阻塞IO
我们之前介绍过简单的read,write操作,那么会有一个问题:当驱动无法立即响应请求该怎么办?比如一个进程调用read读取数据,当没有数据可读时该怎么办,是立即返回还是等到有数据的时候;另一种情况是进程调用write向设备写数据,如果缓冲区满了或者设备正忙的时候怎么办,是立即返回还是继续等待直到设备可写?这种情况下,一般的缺省做法是使进程睡眠直到请求可以满足为止。本篇就介绍遇到这类问题驱动的处理原创 2015-07-31 14:27:33 · 2134 阅读 · 1 评论 -
Linux read系统调用
最近一个项目做了一个模拟u盘的设备,但是在read虚拟u盘的内容时必须每次都从磁盘内读取,而不是从系统的cache中读取,由于这个问题,就查资料看了下read的系统调用,以及文件系统的一些内容。由于文件系统涉及面较广,例如虚拟文件系统(VFS),页缓存,块缓存,数据同步等内容,不可能全部分析到位,这里只记录和read有关的两种使用方式。cached IO和direct IO。1. 什么是系原创 2015-06-19 10:03:07 · 2802 阅读 · 0 评论 -
linux设备驱动第三篇:写一个简单的字符设备驱动
在linux设备驱动第一篇:设备驱动程序简介中简单介绍了字符驱动,本篇简单介绍如何写一个简单的字符设备驱动。本篇借鉴LDD中的源码,实现一个与硬件设备无关的字符设备驱动,仅仅操作从内核中分配的一些内存。下面就开始学习如何写一个简单的字符设备驱动。首先我们来分解一下字符设备驱动都有那些结构或者方法组成,也就是说实现一个可以使用的字符设备驱动我们必须做些什么工作。1、主设备号和次设备号对于原创 2015-03-28 19:05:34 · 33466 阅读 · 2 评论 -
linux设备驱动第五篇:驱动中的并发与竟态
在上一篇介绍了linux驱动的调试方法,这一篇介绍一下在驱动编程中会遇到的并发和竟态以及如何处理并发和竞争。首先什么是并发与竟态呢?并发(concurrency)指的是多个执行单元同时、并行被执行。而并发的执行单元对共享资源(硬件资源和软件上的全局、静态变量)的访问则容易导致竞态(race conditions)。可能导致并发和竟态的情况有:SMP(Symmetric Multi-Pr原创 2015-04-11 13:23:10 · 3460 阅读 · 0 评论 -
linux设备驱动第四篇:从如何定位oops的代码行谈驱动调试方法
上一篇我们大概聊了如何写一个简单的字符设备驱动,我们不是神,写代码肯定会出现问题,我们需要在编写代码的过程中不断调试。在普通的c应用程序中,我们经常使用printf来输出信息,或者使用gdb来调试程序,那么驱动程序如何调试呢?我们知道在调试程序时经常遇到的问题就是野指针或者数组越界带来的问题,在应用程序中运行这种程序就会报segmentation fault的错误,而由于驱动程序的特殊性,出现此类原创 2015-04-02 07:48:17 · 3990 阅读 · 1 评论 -
linux设备驱动第二篇:构造和运行模块
printk的级别日志级别一共有8个级别,printk的日志级别定义如下(在include/linux/kernel.h中): #define KERN_EMERG 0/*紧急事件消息,系统崩溃之前提示,表示系统不可用*/ #define KERN_ALERT 1/*报告消息,表示必须立即采取措施*/ #define KERN_CRIT 2/*临界条件,通常涉及严重的硬件或软原创 2013-08-28 10:03:58 · 3324 阅读 · 0 评论 -
linux设备驱动第一篇:设备驱动程序简介
设备驱动程序在内核中的角色:他们是一个个独立的“黑盒子”,使某个特定的硬件响应一个定义良好的内部编程接口,这些接口完全隐藏了设备的工作细节。(说白了,驱动程序除了对外提供特定的接口外,任何实现细节对应用程序都是不可见的。)用户的操作通过一组标准化的调用执行,而这些调用独立于特定的驱动程序。驱动程序的任务是把这些标准化调用映射到实际硬件的设备特有操作上。在编写驱动程序时,程序员应该特别注意下面这原创 2013-08-24 21:08:28 · 6549 阅读 · 0 评论 -
用户层操作硬件寄存器等(通过/dev/mem)
直接贴代码:#include #include #include #include #include #include #include #define AMLOGIC_NORMAL_BOOT 0x0#define AMLOGIC_FACTORY_RESET_REBOOT 0x01010101#define AMLOGIC_UPDATE_REBOOT 0x02020202原创 2013-04-17 14:17:54 · 2782 阅读 · 0 评论 -
PF_NETLINK应用实例NETLINK_KOBJECT_UEVENT具体实现--udev实现原理
原文地址:http://www.cnblogs.com/hoys/archive/2011/04/09/2010759.html相对于linux来说,udev还是一个新事物。然而,尽管它03年才出现,尽管它很低调(J),但它无疑已经成为linux下不可或缺的组件了。udev是什么?它是如何实现的?最近研究Linux设备管理时,花了一些时间去研究udev的实现。 udev是什么转载 2012-03-20 09:33:10 · 2191 阅读 · 0 评论 -
linux2.6.20 sd/mmc卡驱动学习日记
原文来自http://www.cnblogs.com/hoys/archive/2011/08/04/2127925.htmllinux2.6.20 sd/mmc卡驱动学习日记1(基于s3c2440)首先,我们来看Makefile文件吧,Makefile中文件的目标文件的顺序是很重要的,因为这个会涉及到模块的依赖关系,比如说,如果这些源文件中 有module_i转载 2012-03-01 16:30:59 · 1490 阅读 · 0 评论 -
海思3716C平台添加m88dc2800+高斯贝尔(EN4020)tuner驱动总结
两个难点、重点:1.I2C通讯2.与海思平台的原有tuner驱动相融合,提供标准调用接口。(其实并没有什么难度)为什么把这两个列为重难点,这是因为demod驱动和tuner的驱动都可以从芯片厂商得到demo程序,按照demo程序编写完全没有问题,因为demod和tuener和cpu的通讯都是I2C,所以,只要I2C调通之后只要安装demo程序对demod和tuner进行设置就行原创 2011-11-16 10:56:04 · 6373 阅读 · 0 评论 -
Linux下C语言来检测USB设备以及自动挂载
/*下面是我根据网上一篇文章的思路整理的来的,以及测试验证通过,将其中的打印换成标准的C打印就可以直接拿来跑。目前只是验证了U盘,没有进行硬盘测试,以及一些异常测试。但是证明整个通道是OK的。该代码的作用是:在机顶盒上检测有USB的插拔,即可通知到应用,这个不难办到,关键是插拔之后应用还要能够访问U盘目录,所以就要进行手动的mount 和umount操作。*/http://www.转载 2011-11-23 18:00:10 · 14391 阅读 · 3 评论 -
关于“reset high speed USB device using ehci_hcd and address 2”
网上的一段解释:If you get this message there can be a couple things causing it. It will appear in your syslog and look something like this: Tower kernel: usb 2-1: reset high speed USB device using ehci_h原创 2011-11-30 12:40:17 · 10210 阅读 · 0 评论 -
Linux设备驱动程序学习之外设通信
在学习有关I/O总线的内容时,最好先看看相关的知识:从PC总线到ARM的内部总线I/O 端口和 I/O 内存每种外设都是通过读写寄存器来进行控制。在硬件层,内存区和 I/O 区域没有概念上的区别: 它们都是通过向在地址总线和控制总线发出电平信号来进行访问,再通过数据总线读写数据。因为外设要与I\O总线匹配,而大部分流行的 I/O 总线是基于个人计算机转载 2012-02-15 10:50:01 · 3158 阅读 · 0 评论 -
SPI的一些总结
到目前为止做了两个linux的spi设备,一个是一个mp3解码芯片vs1003,另一个是一个VFD 荧光屏,其中vs1003使用的arm自带的spi控制器驱动,VFD屏使用的GPIO模拟SPI实现的。这两个驱动都没有使用内核中的spi子系统框架,而是单独做了一个字符设备,当初因为感觉内核中的spi子系统太庞大,对其也不算太熟,而且这两个驱动并不是很大,所以就单独实现了。对与SPI本身来说,其实很简原创 2012-02-15 15:26:26 · 1317 阅读 · 0 评论 -
linux下使用3G拨号上网
linux下要实现3G拨号上网,除了3G网卡和对应的3G卡外,软件上需要对应的网卡驱动和pppd拨号程序,pppd拨号程序一般较容易得到,如果是嵌入式平台,交叉编译即可,编译过程中可能会遇到一些错误,但都不是大问题,一般很容易解决。而3G网卡驱动对于刚接触的人来说可能稍微难一点,大部分的3G模块内核中已经得到支持。如果不幸内核中没有得到支持,那么自己添加支持也是很容易的。下面介绍两种驱动3G网卡的原创 2012-02-23 10:15:48 · 13018 阅读 · 0 评论 -
关于移动硬盘的挂载问题
近来遇到一个问题,在公司的nxp平台上使用mdev进行移动硬盘的自动挂载时,系统启动后,自动挂载工作正常,所有分区都能成功挂载,但是,板子断电后先把移动硬盘插上然后再给板子上电,系统启动后发现移动硬盘的有些分区没有挂载上(几乎都是ntfs分区,fat分区基本上都能挂载上),开始的时候以为是挂载脚本不完善,后来加了一个循环,对ntfs分区的挂载重复挂载3次,以保证ntfs分区能挂上,但是还是会出现偶原创 2011-11-23 11:31:27 · 2606 阅读 · 0 评论 -
全局变量,局部变量,静态全局变量,静态局部变量
全局和静态变量都在堆里。 全局变量的作用范围是整个程序(如果程序是多个文件,必须在其他的文件中说明)。 静态变量的作用范围要看静态变量的位置,如果在函数里,则作用范围 就是这个函数。 静态全局变量,只在本文件可以用,虽然整个程序包含多个文件,但静态全局变量只能用在定义它的那个文件里,却不能用在程序中的其他文件里。它是定义存储因型为静态型的原创 2011-12-31 09:13:04 · 987 阅读 · 0 评论 -
android 平台USB wifi驱动移植及使用
一. Android平台Wifi的基本代码路径1. Wpa_supplicant源码部分external/wpa_supplicant_6/生成库libwpa_client.so和守护进程wpa_supplicant2. Wifi的HAL层代码位于hardware/libhardware_legary/wifi/3.原创 2012-02-17 11:13:50 · 9539 阅读 · 1 评论 -
进程上下文和中断上下文的区别
内核空间和用户空间是现代操作系统的两种工作模式,内核模块运行在内核空间,而用户态应用程序运行在用户空间。它们代表不同的级别,而对系统资源具有不同的访问权限。内核模块运行在最高级别(内核态),这个级下所有的操作都受系统信任,而应用程序运行在较低级别(用户态)。在这个级别,处理器控制着对硬件的直接访问以及对内存的非授权访问。内核态和用户态有自己的内存映射,即自己的地址空间。 系统的两种不同于转载 2011-09-19 15:52:04 · 1021 阅读 · 0 评论 -
linux驱动中的中断,tasklet,定时器,workequeue以及信号量
首先linux内核中获取信号量的三个函数:void down(struct semaphoore *sem);int down_interruptible(struct semaphore *sem);int down_trylock(struct semaphore *sem); 前两个在获取信号量的时候都可能休眠,不同的是down_interruptibl原创 2012-03-27 14:38:12 · 1810 阅读 · 0 评论 -
linux系统的休眠与唤醒简介
系统挂起(Suspend)是电源管理(APM&ACPI)的一个特性,给用户带来了很大的方便。Linux在2.6系列核心中对电源管理有了较好的支持,下面就谈谈Linux对系统挂起的支持情况。另外有一篇介绍android和linux内核对电源管理的支持的比较,代码级别的:Linux Kernel and Android 休眠与唤醒(中文版)一个网址是http://blo转载 2012-03-27 14:07:42 · 6690 阅读 · 2 评论 -
Linux USB 鼠标驱动程序解析
原文地址:http://www.cnblogs.com/hoys/archive/2011/04/01/2002406.htmlUSB 总线引出两个重要的链表! 一个 USB 总线引出两个重要的链表,一个为 USB 设备链表,一个为 USB 驱动链表。设备链表包含各种系统中的 USB 设备以及这些设备的所有接口,驱动链表包含 USB 设备驱动程序(usb device driver)转载 2012-03-05 12:24:35 · 1235 阅读 · 0 评论 -
内核初始化过程中的调用顺序
来自http://www.cnblogs.com/hoys/archive/2012/02/22/2363399.html所有的__init函数在区段.initcall.init中还保存了一份函数指针,在初始化时内核会通过这些函数指针调用这些__init函数指针,并在整个初始化完成后,释放整个init区段(包括.init.text,.initcall.init等)。 注意,这些函转载 2012-03-01 14:05:33 · 1064 阅读 · 0 评论 -
嵌入式Linux USB WIFI驱动的移植
硬件平台:飞思卡尔MX258开发板操作系统:Linux2.6.31WIFI: RT2860 USB WIFI模组交叉编译环境:gcc version 4.1.2 调试步骤:第一步:测试USB HOST接口在menuconfig中将USB HOST设置为内核模式: 重新编译内核后启动开发板,插入U盘并挂载:mount /dev/sda1 /tmp转载 2012-02-17 11:16:11 · 3116 阅读 · 2 评论 -
linux输入子系统(设备驱动与事件驱动)
内核的输入子系统是为了对分散的、多种不同类别的输入设备(如键盘、鼠标、轨迹球、操纵杆、辊轮、触摸屏、加速计和手写板)进行统一处理的驱动。输入子系统带来了如下好处: • 统一了物理形态各异的相似的输入设备的处理功能。例如,各种鼠标,不论PS/2、USB,还是蓝牙,都被同样处理。 • 提供了用于分发输入报告给用户应用程序的简单的事件(event)接口。你的驱动不必创建、管理原创 2012-02-24 14:48:13 · 4258 阅读 · 0 评论 -
基于Linux内核SPI子系统工作机制
基本思路,需要了解的知识点。硬件方面: 1:什么是SPI 2:三星的ARM9 s3c2440 的SPI寄存器的使用 3:什么是CAN总线 4:CAN总线的传输及特点 5:MCP2515 CAN控制器的使用软件方面: 1:了解并会使用linux内核 2.6.30.9的SPI子系统的框架及如何实现 2:掌握platform device(平台设备)的驱动写法 3转载 2012-02-15 14:43:05 · 3169 阅读 · 0 评论 -
linux下SPI驱动的补充
先转网上的一篇文章:【转】请教:Linux 2.6内核下spi驱动的编写如果你需要使用spi驱动的接口,不是去修改驱动的实现代码,因为它只负责完成spi的硬件交互功能。 你使用spi功能的代码只需要用到spi.h中定义的方法就可以了,这就是linux driver layers framework的可人之处。 我们通过一个简单的例子来实际原创 2012-02-16 10:10:08 · 1169 阅读 · 0 评论