![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
驱动程序
文章平均质量分 54
quyang0602
这个作者很懒,什么都没留下…
展开
-
sysfs: cannot create duplicate filename '/devices/virtual/misc/leds'问题处理
在mini2440平台下加载LED驱动模块出现以下错误:[root@FriendlyARM 5-3-2]# insmod mini2440_leds_misc.ko WARNING: at fs/sysfs/dir.c:491 sysfs_add_one+0x88/0xb0()sysfs: cannot create duplicate filename '/devices/virt原创 2012-03-28 11:17:22 · 7799 阅读 · 3 评论 -
自动创建设备结点
在刚开始写Linux设备驱动程序的时候,很多时候都是利用mknod命令手动创建设备节点,实际上Linux内核为我们提供了一组函数,可以用来在模块加载的时候自动在/dev目录下创建相应设备节点,并在卸载模块时删除该节点,当然前提条件是用户空间移植了udev。内核中定义了struct class结构体,顾名思义,一个struct class结构体类型变量对应一个类,内核同时提供了class_cre转载 2012-05-04 11:42:57 · 591 阅读 · 0 评论 -
Linux2.6.37内核异常跳转流程
1、 trap_init函数(在arch/arm/kernel/traps.c中)将异常向量表复制到0xffff0000处。ARM架构的CPU异常向量基地址可以是0x00000000,也可以是0xffff0000,Linux内核使用后者。所以需要将异常向量表拷贝至0xffff0000处。void __init trap_init(void){unsigned long ve原创 2012-05-12 11:44:23 · 682 阅读 · 0 评论 -
内核延时函数和定时器
一内核延时函数: 1.短延时: void ndelay(unsignedlong nsecs);Void udelay(unsigned long usecs);Void mdelay(unsigned long msecs); 前面三个函数都属于忙等延时,对于毫秒级以上的延时,内核提供了下面三个函数(可睡眠):转载 2012-06-02 11:26:35 · 580 阅读 · 0 评论 -
free_irq调试一则
static int __init pinpad_init(void) { /* Eventually set up IT */ request_irq(KEYBOARD_IRQ, pinpad_interrupt, SA_INTERRUPT, pinpad_name, NULL); } static void __exit pin转载 2012-06-05 15:00:04 · 1107 阅读 · 0 评论 -
POLL, SELECT & EPOLL 原理比较分析
因为需要了解底层设备访问的原理,所以惯用高层应用语言的我,需要了解一下Linux的设备访问机制,尤其是处理一组非阻塞IO的原理方法,标准的术语好像是叫多路复用。以下文章部分句子有引用之处,恕没有一一指出出处。 对于接触过Linux内核或设备驱动开发的读者,一定清楚poll和select系统调用,以及从2.5版本引入的epoll机制(epoll机制包含三个系统调用)。网上关于它们的文章,有说转载 2012-06-07 16:12:15 · 352 阅读 · 0 评论 -
异步通知程序编写方法
一、 初始化应用程序: signal(SIGIO, &input_handler); fcntl(fd, F_SETOWN, getpid()); oflags = fcntl(fd, F_GETFL); fcntl(fd, F_SETFL, oflags | FASYNC)原创 2012-06-12 10:21:44 · 511 阅读 · 0 评论 -
source insight 快捷键
Ctrl+K 复制一行 Ctrl+Shift+K 恰好复制该位置右边的该行的字符 Ctrl+U 剪切一行 Ctrl + ; 剪切该位置右边的该行的字符Shift+F8 高亮显示指定标识,快速浏览标识的使用情况。Ctrl+F转载 2012-05-25 09:42:06 · 484 阅读 · 0 评论 -
linux2.6.32中断处理流程
1、当发生中断时,PC指针通过异常向量表跳转到中断入口函数asm_do_IRQasm_do_IRQ是中断的C语言总入口函数,它在/arch/arm/kernel/irq.c中定义,声明如下:asmlinkage void __exception asm_do_IRQ(unsigned int irq, struct pt_regs *regs)此函数中调用了generic_handle原创 2012-05-24 11:35:35 · 741 阅读 · 0 评论 -
Linux2.6.32.2 中断注册与注销处理函数流程
一、注册中断处理函数使用request_threaded_irq( )函数来处理,函数声明如下:int request_threaded_irq(unsigned int irq, irq_handler_t handler, irq_handler_t thread_fn, unsigned long irqflags, const char *devname, vo原创 2012-05-24 10:49:31 · 1437 阅读 · 0 评论 -
linux2.6.37 内核定时器使用--定时执行某函数
#include #include #include #include //jiffies在此头文件中定义 #include #include struct timer_list mytimer;//定义一个定时器void mytimer_ok(unsigned long arg){ printk("Mytimer is ok\n");转载 2012-06-04 11:03:57 · 1051 阅读 · 0 评论 -
辞旧迎新重磅出击,教程之ucgui_向按钮发送一个按键消息的程序追踪
原发于www.ucgui.com @2007-7-4转帖请注明出处【献给初学者,若您是高手请不吝赐教,甚为感激!】把Msg的结构体写在最前面:typedef struct { int MsgId; /* type of message */ WM_HWIN hWin; /* Destination window */转载 2012-07-02 11:31:16 · 3364 阅读 · 0 评论 -
BUG: scheduling while atomic: swapper/0/0x00000100
BUG: scheduling while atomic: swapper/0/0x00000100 Modules linked in: iqs316原创 2012-07-02 11:17:45 · 6586 阅读 · 1 评论 -
Mni2440 linux PWM 驱动代码修改支持 频率,占空比修改--XiaoLin.Peng
linux2.6.32.2下PWM驱动实例,友善之臂提供:// /linux2.6.32.2/drivers/char/mini2440_pwm.c#include #include #include #include #include #include #include #include #include #include #include #转载 2012-07-16 08:53:30 · 1964 阅读 · 0 评论 -
浅谈I2C常见的问题
a.完全不能进行读写:(1) 通信协议不正确:有很多的I2C设备,并不支持所有的I2C协议,同时也不是一个比较标准的I2C设备;软件的通信时序不正确。(2)I2C设备地址不正确:有很多的I2C设备的地址是可以通过硬件设定的;也有器件资料提供的数据是错误的。(3)I2C通信线上没有加上拉电阻:由于I2C的从设备的SDA,SCL的PIN是输出开漏的,所以必须加上拉电阻,同时根据I2C设备的转载 2012-07-19 09:45:20 · 3186 阅读 · 0 评论 -
ioremap/remap_page_range
ioremap/remap_page_range作者:辛勤耕耘 来源:博客园 发布时间:2010-06-03 22:47 阅读:1244 次 原文链接 [收藏] [经典]Linux内核中ioremap映射的透彻理解// 300) { text = text + "\r\n\n本文来自CSDN博客,转载请标明出处:" + location.href; clipb转载 2012-08-03 10:53:05 · 946 阅读 · 0 评论 -
S3C2440 SDRAM内存驱动
++++++++++++++++++++++++++++++++++++++++++本文系本站原创,欢迎转载! 转载请注明出处:http://blog.csdn.net/mr_raptor/article/details/6555786++++++++++++++++++++++++++++++++++++++++++ SDRAM(Synchronous Dynamic R转载 2012-05-03 09:30:01 · 562 阅读 · 0 评论 -
ARM架构下LDR、STR、MOV和伪指令LDR指令理解
ARM是RISC结构,数据从RAM到CPU寄存器之间的移动只能通过L/S指令来完成,也就是ldr/str指令。比如想把数据从RAM中某处读取到CPU寄存器中,只能使用ldr比如:ldr r0, 0x12345678就是把0x12345678这个地址中的值存放到r0中。而mov不能干这个活,mov只能在CPU寄存器之间移动数据,或者把立即数移动到CPU寄存器中,这个和x86这种C转载 2012-05-02 11:33:55 · 3244 阅读 · 0 评论 -
Linux GPIO驱动相关笔记
打算跟着友善之臂的《mini2440 linux移植开发指南》来做个LED驱动,虽然LED的原理简单得不能再简单了,但是要把kernel中针对于s3c24**的GPIO的一些数据结构,还有函数搞清楚也不是那么轻松的事,所以本文主要简单地说明下LED驱动中的相关数据结构以及函数/宏的定义,并对驱动加以验证 *******************************************转载 2012-03-19 14:31:37 · 674 阅读 · 0 评论 -
驱动案例一:mini2440 LED驱动 (用ioremap实现访问CPU寄存器)
I/O 内存访问流程:1. request_mem_region() 申请IO内存2.ioremap() 将物理地址映射到虚拟地址3.ioread8() 、ioread16()、ioread32()、iowrite8()、iowrite16()、iowrite32() 读写4.iounmap() 释放虚拟内存5.release_mem_region() 释放IO内存注意:转载 2012-03-31 11:13:18 · 647 阅读 · 0 评论 -
cdev_alloc与cdev_init与cdev_add
内核中每个字符设备都对应一个 cdev 结构的变量,下面是它的定义:linux-2.6.22/include/linux/cdev.hstruct cdev {struct kobject kobj; // 每个 cdev 都是一个 kobjectstruct module *owner; // 指向实现驱动的模块const struct file转载 2012-03-15 17:00:53 · 502 阅读 · 0 评论 -
IO端口和IO内存
在驱动程序编写过程中,很少会注意到IO Port和IO Mem的区别。虽然使用一些不符合规范的代码可以达到最终目的,这是极其不推荐使用的。结合下图,我们彻底讲述IO端口和IO内存以及内存之间的关系。主存16M字节的SDRAM,外设是个视频采集卡,上面有16M字节的SDRAM作为缓冲区。1. CPU是i386架构的情况在i386系列的处理中,内存和外部IO是独立编转载 2012-03-31 15:14:06 · 303 阅读 · 0 评论 -
驱动案例二:mini2440 LED驱动 (用封装函数 s3c2410_gpio_*** 访问CPU寄存器;混杂设备驱动)
memdev.h#ifndef _MEMDEV_H_#define _MEMDEV_H_#include #define MEMDEV_IOC_MAGIC 'k'#define MEMDEV_IOCON _IO(MEMDEV_IOC_MAGIC, 1)#define MEMDEV_IOCOFF _IO(MEMDEV_IOC_MAGIC, 2)#define MEM转载 2012-04-01 16:36:30 · 426 阅读 · 0 评论 -
驱动案例三:platform按键驱动(一、设备)
plat_device.c#include #include #include #include #include #include #include #include #include static struct resource s3c_buttons_resource[] = { [0]={ .start = S3C24XX_PA_GP原创 2012-04-01 17:09:36 · 401 阅读 · 0 评论 -
error: unknown field ‘ioctl’ specified in initializer
异步通知的意思是:一旦设备就绪,则主动通知应用程序,这样应用程序就根本不需要查询设备的状态,这一点非常类似于硬件上的“中断”的概念,比较准确的称谓是“信号驱动的异步I/O”。信号是在软件层次上对中断机制的一种模拟,在原理上一个进程接收到一个信号与处理器接收到一个中断请求是一样的。1>在把驱动从2.6.32 移植到2.6.36时 报错 /home/kern转载 2012-03-16 10:58:08 · 785 阅读 · 0 评论 -
对于struct file_operations中ioctl消失的学习笔记
当年看《LDD3》的时候已经注意到了书中对ioctl的评价不是很好:“ioctl调用的非结构化本质导致众多内核开发者倾向于放弃它。” ,而在这次阅读3.0代码的时候,这个成员在struct file_operations中早已消失了。这个激起了我学习的兴趣,以下是对这个ioctl的学习小结:1、消失的确切时间 ioctl的消失到底是从哪个版本开始的?网上给出的时间是2.6.36开转载 2012-03-16 14:48:10 · 464 阅读 · 0 评论 -
驱动案例三:platform按键驱动(三、应用程序)
app-button.c#include #include #include #include #include #include #include #include #include #include int main(void){ int buttons_fd; int key_value; buttons_fd = open("/d转载 2012-04-01 17:21:31 · 328 阅读 · 0 评论 -
put_user & get_user
1. put_userName put_user -- Write a simple value into user space.Synopsis put_user( x, ptr); Arguments x Value to copy to user space. ptr Destination address,转载 2012-03-16 15:52:02 · 3110 阅读 · 0 评论 -
s3c2410_gpio_cfgpin函数解析
函数原型:s3c2410_gpio_cfgpin(unsigned int pin,unsigned int function)位置:/linux-2.6.32.2/arch/arm/plat-s3c24xx/gpio.c函数内容:void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function)转载 2012-04-01 16:56:36 · 424 阅读 · 0 评论 -
驱动案例三:platform按键驱动(二、驱动)
plat_buttondriver.c#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include原创 2012-04-01 17:19:27 · 485 阅读 · 0 评论 -
系统初始化函数集(subsys_initcall)和初始化段应用
前言:前段时间做一个项目需要设计一个动态库,并希望在加载库的同时自动执行一些初始化动作,于是联想到了linux内核众子系统的初始化,于是研究之,并在过这程中发现了初始化段的存在,利用初始化段实现了该功能。工作一年,笔记积累多了,慢慢变得杂乱无章,于是开博,一方面整理笔记,梳理知识,另一方面和大家交流,共同进步。keyword:subsys_initcall, init, init_call转载 2012-04-06 10:36:25 · 319 阅读 · 0 评论 -
内核里面writel是如何实现的
在邮件列表里讨论了一下writel是如何实现的,这个函数实现在操作系统层,有内存保护的情况下,往一个寄存器或者内存地址写一个数据。 在arch/alpha/kernel/io.c中有188 void writel(u32 b, volatile void __iomem *addr)189 {190 __raw_writel(b, addr);191 m转载 2012-04-06 10:59:28 · 598 阅读 · 0 评论 -
应用程序调用驱动中的write方法失败
今天在改驱动时,遇到个问题:应用程序中使用系统调用函数write,调用驱动中的write方法,返回值一直是 -1 ,驱动中的方法也未被调用。最终发现问题根源:应用程序中 fd = open("/dev/***", 0);其中的文件打开方式为0, 表示是O_RDONLY方式,此时无法进行write操作。原创 2012-04-10 16:17:53 · 769 阅读 · 0 评论 -
#error预处理
编译程序时,只要遇到 #error 就会跳出一个编译错误,既然是编译错误,要它干嘛呢?其目的就是保证程序是按照你所设想的那样进行编译的。下面举个例子:程序中往往有很多的预处理指令#ifdef XXX...#else...#endif 当程序比较大时,往往有些宏定义是在外部指定的(如makefile),或是在系统头文件中指定的,当你不太确定当前是否定义了 XXX 时转载 2012-04-13 17:21:33 · 333 阅读 · 0 评论 -
LCD和LCD控制器
一、LCD显示器1、LCD简介 LCD(Liquid Crystal Display),即液晶显示器,是一种采用液晶控制透光度技术来实现色彩的显示器,TFT(Thin FilmTransistor,薄膜晶体管)是目前最为主流的液晶显示类型; 2、LCD的接口 CPU或显卡发出的图像数据是TTL信号(0—5V,0—3.3V,0—2.5V,或0—1.8V)转载 2012-07-27 10:20:24 · 779 阅读 · 0 评论