MTK Android添加驱动模块

2018-12-25 23:17

? 1 [编写linux驱动程序] 1.1 一、编写驱动核心程序 1.2 二、配置Kconfig 1.3 三、配置Makefile

1.4 四、配置系统的autoconfig 1.5 五、编译

? 2 [编写hal模块] 2.1 一、新建xxx.h文件 2.2 二、新建xxx.c文件

2.2.1 1、包含相关头文件和定义相关结构 2.2.2 2、定义hello_device_open函数 2.2.3 3、定义自定义的api函数

2.3 三、在hello目录下新建Android.mk文件

2.4 四、编译、重新打包Android系统镜像system.img 3 [编写jni]

3.1 一、新建com_android_server_HelloService.cpp文件 3.1.1 1、包括头文件 3.1.2 2、编写jni接口

3.1.3 3、定义jni加载函数,注册jni方法表

3.2 二、修改onload.cpp,使系统启动时自动加载JNI方法调用表 3.3 三、修改Android.mk文件,添加编译路径 3.4 四、编译和重新生成system.img

? 4 [编写Framework接口] 4.1 一、定义通信接口 4.1.1 1、新增接口文件 4.1.2 2、添加编译路径 4.1.3 3、编译接口文件

4.2 二、建立java文件,编写Framework接口 4.3 三、在ServerThread::run函数中增加加载代码 4.4 四、编译、重新打包system.img 5 [App访问]

[编写linux驱动程序]

编写驱动核心程序

这里说的驱动核心程序是指运行在内核空间的,完全按linux驱动格式编写的,基本上与

android没什么关系,一般包括xxx.h和xxx.c文件。

进入到kernel/drivers目录,新建snsled目录,然后建立对应的snsled.h和snsled.c文件: //snsled.h

#ifndef _SNSLED_H_ #define _SNSLED_H_ #define SNSLED_NUM (1) #define SNSLED_CLASS_NAME \ #define SNSLED_DEVICE_NAME \ #define SNSLED_NODE_NAME \ #define SNSLED_PROC_NAME \ #define SNSLED_IOC_MAGIC 'k' #define SNSLED_IO_ON 2323 #define SNSLED_IO_OFF 2324 #define SNSLED_IOW_PWM 2325 #define SNSLED_IOR_PWM 232 struct snsled_cntx { int r1; struct semaphore sem; struct cdev cdev; }; #endif //snsled.c

#include #include #include #include #include #include #include #include

//_IO(SNSLED_IOC_MAGIC, 0) //_IO(SNSLED_IOC_MAGIC, 1) //_IOW(SNSLED_IOC_MAGIC, 2, int) //_IOR(SNSLED_IOC_MAGIC, 3, int) /* printk() */ /* kmalloc() */ /* everything... */ /* error codes */ /* size_t */

#include #include /* O_ACCMODE */ #include #include #include /* cli(), *_flags */ #include /* copy_*_user */ //#include /* semaphore */ #include #include /*class_create*/ #include \ /* local definitions */ /* #include #include #include #include #include #include #include #include #include #include #include */ #if defined (CONFIG_ARCH_MT6573) #include #include #include #elif defined (CONFIG_ARCH_MT6516) #include #include #endif /*====macros====*/ #define BUF_SIZE (64)

#define SNS_LED_CONTROL_LINE GPIO99 //GPIO39 #define SNS_LED_CONTROL_LINE_GPIO_MODE GPIO_MODE_00 #define SNS_LED_CONTROL_LINE_PWM_MODE GPIO_MODE_01 /*====declares====*/ ssize_t snsled_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos); ssize_t snsled_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos); long snsled_unlocked_ioctl(struct file *filp, unsigned int cmd, unsigned long arg); int snsled_open(struct inode *inode, struct file *filp); int snsled_release(struct inode *inode, struct file *filp); int snsled_turn_on(void); int snsled_turn_off(void); int snsled_set_pwm(int arg); /*====global====*/ static int g_snsled_major = 0; static int g_snsled_minor = 0; struct snsled_cntx *g_snsled_ptr = NULL; struct class *g_snsled_class = 0; static struct file_operations g_snsled_fops = { .owner = THIS_MODULE, .read = snsled_read, .write = snsled_write, .unlocked_ioctl = snsled_unlocked_ioctl, .open = snsled_open, .release = snsled_release, }; /*====implements====*/ ssize_t snsled_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos) { #if 1 printk(KERN_ALERT \);

#else char tmp_buf[512] = {0}; int len =sprintf(tmp_buf, \); if (copy_to_user(buf, tmp_buf, count)) { //do nothing } #endif return 0; } ssize_t snsled_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos) { printk(KERN_ALERT \); return count; } long snsled_unlocked_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) { int err = 0; long retval = 0; printk(KERN_ALERT \, cmd, arg); /* //extract the type and number bitfields, and don't decode //wrong cmds: return ENOTTY (inappropriate ioctl) before access_ok() if (_IOC_TYPE(cmd) != SNSLED_IOC_MAGIC) return -ENOTTY; //if (_IOC_NR(cmd) > SNSLED_IOC_MAXNR) return -ENOTTY; //to verify *arg is in user space if (_IOC_DIR(cmd) & _IOC_READ) err = !access_ok(VERIFY_WRITE, (void __user *)arg, _IOC_SIZE(cmd)); else if (_IOC_DIR(cmd) & _IOC_WRITE) err = !access_ok(VERIFY_READ, (void __user *)arg, _IOC_SIZE(cmd)); if (err) return -EFAULT; */ switch(cmd) { case SNSLED_IO_ON: printk(KERN_ALERT \);


MTK Android添加驱动模块.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:幼儿园防寒防冻方案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: