ImageVerifierCode 换一换
格式:DOCX , 页数:31 ,大小:28.80KB ,
资源ID:16925221      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/16925221.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(MTK Android添加驱动模块Word下载.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

MTK Android添加驱动模块Word下载.docx

1、3.1.11、包括头文件3.1.22、编写jni接口3.1.33、定义jni加载函数,注册jni方法表3.2二、修改onload.cpp,使系统启动时自动加载JNI方法调用表3.3三、修改Android.mk文件,添加编译路径3.4四、编译和重新生成system.img 4编写Framework接口4.1一、定义通信接口4.1.11、新增接口文件4.1.22、添加编译路径4.1.33、编译接口文件4.2二、建立java文件,编写Framework接口4.3三、在ServerThread:run函数中增加加载代码4.4四、编译、重新打包system.img5App访问编写驱动核心程序这里说的驱动

2、核心程序是指运行在内核空间的,完全按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 snsled#define SNSLED_DEVICE_NAME #define SNSLED_NODE_NAME #define SNSLED_PROC_NAME

3、#define SNSLED_IOC_MAGIC k#define SNSLED_IO_ON 2323 /_IO(SNSLED_IOC_MAGIC, 0)#define SNSLED_IO_OFF 2324 /_IO(SNSLED_IOC_MAGIC, 1)#define SNSLED_IOW_PWM 2325 /_IOW(SNSLED_IOC_MAGIC, 2, int)#define SNSLED_IOR_PWM 232 /_IOR(SNSLED_IOC_MAGIC, 3, int)struct snsled_cntx int r1; struct semaphore sem; struc

4、t cdev cdev;#endif/snsled.c#include linux/moduleparam.hlinux/init.hlinux/kernel.h /* printk() */linux/slab.h /* kmalloc() */linux/fs.h /* everything. */linux/errno.h /* error codes */linux/types.h /* size_t */linux/proc_fs.hlinux/fcntl.h /* O_ACCMODE */linux/seq_file.hlinux/cdev.hasm/system.h /* cli

5、(), *_flags */asm/uaccess.h /* copy_*_user */#include /* semaphore */linux/semaphore.hlinux/device.h /*class_create*/ #include snsled.h /* local definitions */*linux/platform_device.hlinux/delay.hlinux/string.hlinux/ctype.hlinux/leds.hlinux/leds-mt65xx.hlinux/workqueue.hlinux/wakelock.hcust_leds.h*/

6、#if defined (CONFIG_ARCH_MT6573)mach/mt6573_pwm.hmach/mt6573_gpio.hmach/pmu6573_sw.h#elif defined (CONFIG_ARCH_MT6516)mach/mt6516_pwm.hmach/mt6516_gpio.h/*=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_CON

7、TROL_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

8、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_

9、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, c

10、har _user *buf, size_t count, loff_t *f_pos) #if 1 printk(KERN_ALERT Snsled read.n);#else char tmp_buf512 = 0; int len =sprintf(tmp_buf, snsled read.n if (copy_to_user(buf, tmp_buf, count) /do nothing return 0;ssize_t snsled_write(struct file *filp, const char _user *buf, size_t count, loff_t *f_pos

11、) Snsled write.n return count;long snsled_unlocked_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) int err = 0; long retval = 0;Snsled ioctl:cmd=%d, arg=%d.n, cmd, arg); /* /extract the type and number bitfields, and dont decode /wrong cmds: return ENOTTY (inappropriate ioctl) before a

12、ccess_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)access_ok(VERIF

13、Y_READ, (void _user *)arg, _IOC_SIZE(cmd); if (err) return -EFAULT; */ switch(cmd) case SNSLED_IO_ON:on.n /if(mt_set_gpio_out(SNS_LED_CONTROL_LINE,GPIO_OUT_ONE)printk(Snsled set gpio failed! n snsled_turn_on(); break; case SNSLED_IO_OFF:off.n /if(mt_set_gpio_out(SNS_LED_CONTROL_LINE,GPIO_OUT_ZERO)pr

14、intk( snsled_turn_off(); case SNSLED_IOW_PWM: printk(KERN_ALERT set pwm, arg=%d.n, arg); /retval = _get_user(g_snsled_ptr-r1, (int _user *)arg); snsled_set_pwm(int _user *)arg); case SNSLED_IOR_PWM: #if 0 retval = _put_user(g_snsled_ptr-read r1:%i.n, g_snsled_ptr-r1); #endifread pwm - not configured

15、 yet.n default:you got the wrong command.n return retval;int snsled_open(struct inode *inode, struct file *filp) Snsled: snsled_open.n#if 0 if(mt_set_gpio_mode(SNS_LED_CONTROL_LINE,SNS_LED_CONTROL_LINE_GPIO_MODE)printk(Snsled set gpio mode failed! if(mt_set_gpio_dir(SNS_LED_CONTROL_LINE,GPIO_DIR_OUT

16、)printk(Snsled set gpio dir failed! if(mt_set_gpio_out(SNS_LED_CONTROL_LINE,GPIO_OUT_ONE)printk(#endif int snsled_release(struct inode *inode, struct file *filp) snsled_release.n if(mt_set_gpio_out(SNS_LED_CONTROL_LINE,GPIO_OUT_ZERO)printk(int snsled_turn_on(void) snsled_turn_on.n if(mt_set_gpio_mod

17、e(SNS_LED_CONTROL_LINE,SNS_LED_CONTROL_LINE_PWM_MODE)printk(int snsled_turn_off(void) snsled_turn_off.n/for old mode/*struct _PWM_OLDMODE_REGS U16 IDLE_VALUE; /0 U16 GUARD_VALUE; U16 GDURATION; / U16 WAVE_NUM; U16 DATA_WIDTH; /high level, 13bits, 08191 U16 THRESH; /tPWM_MODE_OLD_REGS;*/int snsled_se

18、t_pwm(int arg) struct pwm_spec_config pwm_setting; pwm_setting.pwm_no = PWM1; snsled_open begin.n pwm_setting.mode = PWM_MODE_OLD; pwm_setting.clk_div = CLK_DIV16;/CLK_DIV128; pwm_setting.clk_src = PWM_CLK_OLD_MODE_32K; pwm_setting.PWM_MODE_OLD_REGS.IDLE_VALUE = 0; pwm_setting.PWM_MODE_OLD_REGS.GUAR

19、D_VALUE = 0; pwm_setting.PWM_MODE_OLD_REGS.GDURATION = 8100; pwm_setting.PWM_MODE_OLD_REGS.WAVE_NUM = 0; pwm_setting.PWM_MODE_OLD_REGS.DATA_WIDTH = 8100; pwm_setting.PWM_MODE_OLD_REGS.THRESH = 8100; pwm_set_spec_config(&pwm_setting); snsled_open done.n/alloc device majorstatic int vircdex_alloc_majo

20、r(void) dev_t devt = 0; int result = 0; result = alloc_chrdev_region(&devt, g_snsled_minor, SNSLED_NUM, SNSLED_NODE_NAME); g_snsled_major = MAJOR(devt); return result;static int snsled_release_major(void) dev_t devt = MKDEV(g_snsled_major, g_snsled_minor); unregister_chrdev_region(devt, 1);static in

21、t snsled_setup_dev(struct snsled_cntx *dev) int err, devno = MKDEV(g_snsled_major, g_snsled_minor); cdev_init(&(dev-cdev), &g_snsled_fops); dev-cdev.owner = THIS_MODULE; err = cdev_add(&dev-cdev, devno, 1); if(err) return err; /init_MUTEX(&sem); sema_init(&sem), 1);static int snsled_unsetup_dev(stru

22、ct snsled_cntx *dev) cdev_del(&cdev);static int snsled_create_devfiles(dev_t devt) /, const struct device_attribute *attr) int err = -1; struct device *dev = NULL; g_snsled_class = class_create(THIS_MODULE, SNSLED_CLASS_NAME); if(IS_ERR(g_snsled_class) err = PTR_ERR(g_snsled_class);Failed to create class.n goto CLASS_CREATE_ERR; dev = device_create(g_snsled_class, NULL, devt, NULL, SNSLED_DEVICE_NAME); /dev = device_create(hello_class, NULL, dev, %s, HELLO_DEVICE_FILE_NAME); /device_create( my_class, NULL, MKDEV(hello_m

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1