随笔分类 -  013_linux驱动

1
摘要:(一)分配一个输入子系统结构体 static struct input_dev *buttons_dev; /*分配一个input_dev结构体*/ (二)设置这个输入子系统需要的动作 /* 1. 分配一个input_dev结构体 */ buttons_dev = input_allocate_de 阅读全文
posted @ 2018-09-22 16:24 陆小果哥哥 阅读(219) 评论(0) 推荐(0)
摘要:1. 功能:创建以个等待队列头 2. 函数原型 #define DECLARE_WAIT_QUEUE_HEAD (name) / wait_queue_head_t name = __WAIT_QUEUE_HEAD_INITIALIZER(name) #define __WAIT_QUEUE_HEA 阅读全文
posted @ 2018-09-22 15:42 陆小果哥哥 阅读(1710) 评论(0) 推荐(0)
摘要:阻塞操作 是指在执行设备操作时若不能获得资源则挂起进程,直到满足可操作的条件后再进行操作。 被挂起的进程进入休眠状态,被从调度器的运行队列移走,直到等待的条件被满足。 非阻塞操作 进程在不能进行设备操作时并不挂起,它或者放弃,或者不停地查询,直至可以进行操作为止。 fd = open("...", 阅读全文
posted @ 2018-09-22 15:38 陆小果哥哥 阅读(161) 评论(0) 推荐(0)
摘要:(一)定义一个timer_list定时器结构体,linux 内核定时器 timer_list详解 (二)初始化定时器,当超时时间expires到之后会调用buttons_timer_function函数 这里我们不设置超时时间,也就是说刚第一次初始化时候会调用buttons_timer_functi 阅读全文
posted @ 2018-09-22 15:38 陆小果哥哥 阅读(208) 评论(0) 推荐(0)
摘要:2. 信号量 信号量(semaphore)是用于保护临界区的一种常用方法,只有得到信号量的进程才能执行临界区代码。 当获取不到信号量时,进程进入休眠等待状态。 定义信号量 struct semaphore sem; 初始化信号量 void sema_init (struct semaphore *s 阅读全文
posted @ 2018-09-22 15:37 陆小果哥哥 阅读(232) 评论(0) 推荐(0)
摘要:1. 原子操作 原子操作指的是在执行过程中不会被别的代码路径所中断的操作。 常用原子操作函数举例: atomic_t v = ATOMIC_INIT(0); //定义原子变量v并初始化为0 atomic_read(atomic_t *v); //返回原子变量的值 void atomic_inc(at 阅读全文
posted @ 2018-09-22 15:36 陆小果哥哥 阅读(411) 评论(0) 推荐(0)
摘要:1. 首先看应用程序 1. 首先分析第二点使用函数signal(SIGIO, my_signal_fun);来设置,当驱动程序传递信号给应用程序时候会调用第一点的程序 2. 第三点是设置相关参数 (二)当应用程序调用到底三点时候,就会在驱动程序中调用到第一点 上面的驱动程序初始化了信号的相关参数,然 阅读全文
posted @ 2018-09-22 15:35 陆小果哥哥 阅读(307) 评论(0) 推荐(0)
摘要:1. 功能:poll的机制与select相似,与select在本质上没有多大差别。管理多个描写叙述符也是进行轮询,依据描写叙述符的状态进行处理,可是poll没有最大文件描写叙述符数量的限制。 2. 技术资料:poll多路复用 这篇文章写得很好 3. 技术资料:poll机制分析 4. 首先我们看应用程 阅读全文
posted @ 2018-09-22 15:34 陆小果哥哥 阅读(234) 评论(0) 推荐(0)
摘要:符号名 信号值 描述 是否符合POSIX SIGHUP 1 在控制终端上检测到挂断或控制线程死 亡 是 SIGINT 2 交互注意信号 是 SIGQUIT 3 交 互中止信号 是 SIGILL 4 检测到非法硬件的指令 是 SIGTRAP 5 从 陷阱中回朔 否 SIGABRT 6 异常终止信号 是 阅读全文
posted @ 2018-09-22 15:34 陆小果哥哥 阅读(204) 评论(0) 推荐(0)
摘要:1. 首先这篇博客讲解得挺好的,推荐 wait_event_interruptible 使用方法 2 .函数原型: #define wait_event_interruptible(wq, condition) \ ({ \ int __ret = 0; \ if (!(condition)) \ 阅读全文
posted @ 2018-09-22 15:33 陆小果哥哥 阅读(3104) 评论(0) 推荐(0)
摘要:1. 功能:获取引脚状态 2. 函数原型: unsigned int s3c2410_gpio_getpin(unsigned int pin) { void __iomem *base = S3C24XX_GPIO_BASE(pin); unsigned long offs = S3C2410_G 阅读全文
posted @ 2018-09-22 15:31 陆小果哥哥 阅读(341) 评论(0) 推荐(0)
摘要:1. request_irq()函数原型 int request_irq(unsigned int irq, irq_handler_t handler, unsigned long irqflags, const char *devname, void *dev_id) 2. 功能:注册中断服务函 阅读全文
posted @ 2018-09-22 15:30 陆小果哥哥 阅读(4635) 评论(0) 推荐(0)
摘要:1. copy_from_user函数的目的是从用户空间拷贝数据到内核空间 2. 解析原型: copy_from_user(void *to, const void __user *from, unsigned long n) 1. @*to 将数据拷贝到内核的地址 2. @*from 需要拷贝数据 阅读全文
posted @ 2018-09-22 15:29 陆小果哥哥 阅读(3821) 评论(0) 推荐(1)
摘要:1. 测试:配置S3C2440的GPF4,5,6为输出 2. 测试IO的地址从芯片手册中获取以下资料 3. 从上面可以看出配置输出对应的设置是01=输出,那么对应位如:[9:8]需要设置成=01 4. 解析配置之前我们需要先将对应IO使用命令“&”设置成00,然后使用命令“|”设置成01 5. 则可 阅读全文
posted @ 2018-09-22 15:29 陆小果哥哥 阅读(819) 评论(0) 推荐(0)
摘要:(一)学习linux驱动之初,对ioremap函数的个人理解 (二)博客:实验探究 ioremap 这篇文章作者通过验证来阐述自己的观点,个人觉得挺好的 (三)函数原型 基本简介 void * __ioremap(unsigned long phys_addr, unsigned long size 阅读全文
posted @ 2018-09-22 15:28 陆小果哥哥 阅读(2043) 评论(0) 推荐(1)
摘要:(一)解析class_device_create函数 (二)当我们使用class_create创建一个类之后我们就可以使用class_device_create函数在这个类下面创建一个设备了,class_create创建查看004_linux驱动之_class_create创建一个设备类 (三)cl 阅读全文
posted @ 2018-09-22 15:28 陆小果哥哥 阅读(3218) 评论(0) 推荐(0)
摘要:(一)解析:class_create函数和class_destroy函数 创建一个类 和 删除一个类。 (二)class_create函数原型 struct class *class_create(struct module *owner, const char *name); 1. 查看函数注释: 阅读全文
posted @ 2018-09-22 15:27 陆小果哥哥 阅读(5523) 评论(0) 推荐(0)
摘要:(一)解析file_operations函数 解析002_linux驱动之_register_chrdev注册字符设备中的问题 (二) 1. file_operations结构原型 2. 使用举例 (三)从上面的原型可以看出file_operations函数有很多类型,下面将解析一部分 1. 以.o 阅读全文
posted @ 2018-09-22 15:26 陆小果哥哥 阅读(476) 评论(0) 推荐(0)
摘要:(一)解析:register_chrdev函数和unregister_chrdev函数 (二)register_chrdev函数原型 int register_chrdev(unsigned int major, const char *name,const struct file_operatio 阅读全文
posted @ 2018-09-22 15:24 陆小果哥哥 阅读(3111) 评论(0) 推荐(0)
摘要:(一)驱动的安装: 1. 可以将驱动程序静态编译进内内核中 2. 也可以将它作为模块在使用的时候再加载 注:在配置内核时候,如果某个配置被设置为m,就表示它将会被编译成模块 (二)加载和卸载驱动使用命令(模块的拓展名为.ko) 1. insmod 命令加载 (使用示例:insmod first_dr 阅读全文
posted @ 2018-09-22 15:23 陆小果哥哥 阅读(2036) 评论(0) 推荐(0)

1