韦东山驱动在高通平台的移植
在高通平台移植韦东山视频里的驱动,模仿韦东山视频里写驱动的方法,逐步完善驱动代码的框架直到最终实现功能。同时也包括一些驱动代码的测试方法。
茫茫大士
热爱编程
展开
-
韦东山驱动代码移植高通平台总论
将韦东山视频的代码在高通平台上移植,所有的代码参考韦东山一期驱动部分以及二期驱动,代码的扩充也是根据韦东山老师视频里的思路逐步的深入,由浅入深平台:MSM8917 32位内核版本:3.18.31操作系统:ubuntu12.04Android版本:7.1.21 驱动的编译1.a 直接编译到内核修改Makefile,在Makefile里添加(假设源文件名为foo)...原创 2019-04-06 13:21:46 · 866 阅读 · 0 评论 -
【韦东山驱动代码移植高通平台之二十二】sysfs节点的创建
sysfs节点的创建sysfs节点也可以用来导出内核测信息,通过还是也可以有用户空间写入数据。使用device_create_file可以创建一个sysfs节点出来也可以使用sysfs_create_group来创建一个sysfs目录,该目录下可以一次性创建一个或者多个文件节点出来。如果需要多个节点的话,这种创建方式效率比较高。#include <linux/module....原创 2019-04-02 21:25:12 · 768 阅读 · 0 评论 -
【韦东山驱动代码移植高通平台之二十一】proc节点的创建
proc节点的创建proc是一种特殊的,由软件创建的文件系统。内核可以使用它向外界导出信息,还可以由用户写入数据。使用proc_create函数来创建节点传入的file_operations结构体需要用户来定义,定义open, read, write等函数参考代码一#include <linux/module.h>#include <linux/in...原创 2019-04-02 21:24:36 · 506 阅读 · 0 评论 -
【韦东山驱动代码移植高通平台之三】自动创建设备节点
自动创建设备节点android的ueventd守护进程会对”/sys/class““/sys/block”“/sys/devices”三个目录扫描,打开所有子目录中的uevent属性文件,写入"add"命令,然后驱动会发出uevent事件,ueventd进程捕捉到后,自动创建设备节点。所以可以通过class_create创建一个类,这个类会在”/sys/class“目录下显示,然后在...原创 2019-03-21 19:28:02 · 461 阅读 · 0 评论 -
【韦东山驱动代码移植高通平台之二十】结构体的使用
结构体的使用将设备相关变量用结构体实现,用device tree 注册设备的地址 中断 key用平台设备驱动实现结构是一个或多个变量的集合,这些变量可以有不同的类型,为了方便处理将这些变量组织在一个名字之下。第十一个驱动程序里定义了许多静态全局变量static int irq;static struct input_dev *kinput;volatile unsigne...原创 2019-03-23 10:46:23 · 211 阅读 · 0 评论 -
【韦东山驱动代码移植高通平台之十九】平台设备通过device tree实现
平台设备通过device tree实现在设备树的soc节点下添加nodetestplat {compatible = "testfac,plat";};机器会根据设备树的节点来自动创建平台设备,platform_driver的driver成员里的of_match_table的compatible成员与设备树里的compatible属性匹配时,就会执行platform_drive...原创 2019-03-23 10:45:53 · 334 阅读 · 0 评论 -
【韦东山驱动代码移植高通平台之十八】平台设备驱动模型
平台设备驱动模型构造platform_driver结构体,用platform_driver_register来注册这个结构体构造platform_device结构体,用platform_device_register来注册这个结构体用platform_device_register来注册平台设备,如果有同名的平台驱动,执行平台驱动的probe函数用platform_driver_r...原创 2019-03-23 10:45:31 · 234 阅读 · 0 评论 -
【韦东山驱动代码移植高通平台之十七】原子变量
原子变量像i++这类操作,有的处理器可以以原子方式执行增加,但是我们不能指望它。完整的锁机制对一个整数来讲有点浪费,内核提供了一种以原子方式来操作整数类型,就是原子变量。参考代码#include <linux/module.h>#include <linux/init.h>#include <linux/major.h>#include...原创 2019-03-23 10:44:58 · 161 阅读 · 0 评论 -
【韦东山驱动代码移植高通平台之十六】信号量
信号量在打开设备时通过down_interruptible获得信号量,在关闭设备时通过up释放信号量参考代码#include <linux/module.h>#include <linux/init.h>#include <linux/major.h>#include <linux/cdev.h>#include <lin...原创 2019-03-23 10:44:23 · 182 阅读 · 0 评论 -
【韦东山驱动代码移植高通平台之十五】互斥量
互斥量这里用互斥量来保证每次只有第一个访问到该设备的应用程序才能正常访问到设备,后续设备只有在之前的设备释放互斥量后才能正常访问到设备在open设备时用mutex_lock上锁,在close设备时用mutex_unlock来释放锁参考代码#include <linux/module.h>#include <linux/init.h>#includ...原创 2019-03-23 10:43:53 · 203 阅读 · 0 评论 -
【韦东山驱动代码移植高通平台之十四】通过定时器上报键值
通过定时器上报键值定时器两要素:超时时间和超时处理函数通过init_timer初始化一个timer_list,然后指定超时处理函数在中断处理函数里调用mod_timer指定多少时间后执行超时处理函数参考代码:#include <linux/module.h>#include <linux/init.h>#include <linux/m...原创 2019-03-23 10:43:17 · 183 阅读 · 0 评论 -
【韦东山驱动代码移植高通平台之十三】通过工作队列上报键值
通过工作队列上报键值共享队列通过INIT_WORK填充一个work_struct在中断里用schedule_work将任务提交到共享队列共享队列参考代码#include <linux/module.h>#include <linux/init.h>#include <linux/major.h>#include <linu...原创 2019-03-23 10:42:40 · 284 阅读 · 0 评论 -
【韦东山驱动代码移植高通平台之十二】通过tasklet上报键值
通过tasklet上报键值通过tasklet_init初始化一个tasklet_struct,在中断处理函数里用tasklet_schedule来调度执行指定的tasklet参考代码#include <linux/module.h>#include <linux/init.h>#include <linux/major.h>#include ...原创 2019-03-23 10:42:07 · 190 阅读 · 0 评论 -
【韦东山驱动代码移植高通平台之十一】 通过input子系统上报按键值
通过input子系统上报按键值自己写得按键驱动程序只能自己用,其它应用程序想使用的话必须修改代码。linux系统大部分按键类驱动程序,都是使用input子系统来上报输入事件的。所以只要将按键的驱动程序融入到input子系统的框架里,很多应用程序直接就可以使用。一般的方法是(分配 设置 注册)通过input_allocate_device分配一个input_dev结构体设置这个in...原创 2019-03-23 10:41:06 · 655 阅读 · 0 评论 -
【韦东山驱动代码移植高通平台之十】ioctl通过指针返回按键值
ioctl通过指针返回按键值ioctl也可以通过指针返回数据。ioctl第三个参数可以是一个指针,通过指针可以向ioctl调用传递任意数据,这样设备可以喝用户空间交换任意数据量的数据。参考代码#include <linux/module.h>#include <linux/init.h>#include <linux/major.h>#inc...原创 2019-03-21 19:40:14 · 513 阅读 · 0 评论 -
【韦东山驱动代码移植高通平台之九】 通过ioctl返回值读取按键值
通过ioctl返回值读取按键值有的驱动程序不仅需要读取或者写入设备,还需要执行各种类型的硬件控制。比如设置串口的波特率,弹出介质等操作。这些操作通常通过ioctl实现。ioctl的系统调用原型如下SYNOPSIS#include <sys/ioctl.h>int ioctl(int d, int request, ...);改函数原型中的这些点并不是表示数目不...原创 2019-03-21 19:39:28 · 576 阅读 · 0 评论 -
【韦东山驱动代码移植高通平台之八】通过异步通知读取按键值
通过异步通知读取按键值阻塞型和非阻塞型组合以及select和poll方法可以有效地查询设备,但是在有的时候效率就不高了。假设一个进程在低优先级执行很长的计算,但又需要尽快地处理输入数据。可以让程序周期性地调用poll方法,但是在很多场景下还有更好的办法。通过使用异步通知,进程可以在数据有效时收到一个信号,而不需要不停地使用poll来关注数据。为了可以使用异步通知,需要在驱动的file_...原创 2019-03-21 19:38:27 · 229 阅读 · 2 评论 -
【韦东山驱动代码移植高通平台之七】通过poll机制读取按键值
通过poll机制读取按键值poll允许进程在一个或者多个文件描述符上做无阻塞的读取和写入,这些调用也会阻塞进程,但不是阻塞在read或者write系统调用上需要给file_operations添加poll函数poll函数里通过poll_wait函数向poll_table添加一个等待队列,返回描述哪个操作可以立即执行的位掩码,比如POLLIN表明可以无阻塞地读取,POLLOUT可以无阻塞...原创 2019-03-21 19:37:12 · 266 阅读 · 0 评论 -
【韦东山驱动代码移植高通平台之六】通过中断读取按键值
通过中断读取按键值使用循环读取按键值,需要应用程序一直查询设备节点,cpu占用率高。可以通过应用程序在read函数上休眠,当有按键中断时,唤醒应用程序读取按键值,读取之后继续在read函数上休眠,这样可以极大地减少CPU占用率。如何将GPIO配置成中断功能高通平台可以用gpio_to_irq()函数将GPIO配置成中断功能,该函数同时返回中断号使用返回的中断号,通过req...原创 2019-03-21 19:36:06 · 435 阅读 · 0 评论 -
【韦东山驱动代码移植高通平台之五】读取按键值
硬件电路分析查看原理图可知该按键使用的引脚是GPIO91,配置时将GPIO91上拉,因为按键的另一个触点是接地的,所以按下时GPIO会接地,电平为0,松开时,电平为1datasheet关于gpio的说明当将GPIO配置成输入模式并且上拉也就是将0x01000000+0x1000*91=0x105B000寄存器设置成0x03然后读取0x01000004+0...原创 2019-03-21 19:34:16 · 403 阅读 · 0 评论 -
【韦东山驱动代码移植高通平台之四】创建多个设备节点
创建多个设备节点一次性创建多个设备,共用一个file_operations结构体里的函数参考代码#include <linux/init.h>#include <linux/module.h>#include <linux/major.h>#include <linux/cdev.h>#include <linux/dev...原创 2019-03-21 19:31:42 · 556 阅读 · 0 评论 -
【韦东山驱动代码移植高通平台之二】创建了一个简单的字符设备驱动
字符设备驱动的框架主次设备号构造file operations结构体(open read write release函数)注册字符设备(cdev_add 或者 register_char_device)入口函数出口函数应用程序调用open函数时,调用对应驱动程序的open函数;应用程序调用read函数时,调用对应驱动程序的read函数;应用程序调用write函...原创 2019-03-21 19:25:39 · 513 阅读 · 0 评论 -
【韦东山驱动代码移植高通平台之一】驱动代码的结构
驱动代码的结构入口函数(用module_init修饰)出口函数(用module_exit修饰)最后加上协议(MODULE_LICENSE("GPL");)入口函数和出口函数被加到一个特殊的段,内核在执行时,会在适当时候执行入口函数参考代码#include <linux/init.h>#include <linux/module.h>...原创 2019-03-21 19:24:36 · 762 阅读 · 0 评论