MTK Android添加驱动模块Word下载.docx
《MTK Android添加驱动模块Word下载.docx》由会员分享,可在线阅读,更多相关《MTK Android添加驱动模块Word下载.docx(31页珍藏版)》请在冰豆网上搜索。
![MTK Android添加驱动模块Word下载.docx](https://file1.bdocx.com/fileroot1/2022-11/27/ada7515b-6693-4013-8e59-51f3332a4eff/ada7515b-6693-4013-8e59-51f3332a4eff1.gif)
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驱动格式编写的,基本上与android没什么关系,一般包括xxx.h和xxx.c文件。
进入到kernel/drivers目录,新建snsled目录,然后建立对应的snsled.h和snsled.c文件:
//snsled.h
#ifndef_SNSLED_H_
#define_SNSLED_H_
#defineSNSLED_NUM
(1)
#defineSNSLED_CLASS_NAME"
snsled"
#defineSNSLED_DEVICE_NAME"
#defineSNSLED_NODE_NAME"
#defineSNSLED_PROC_NAME"
#defineSNSLED_IOC_MAGIC'
k'
#defineSNSLED_IO_ON2323//_IO(SNSLED_IOC_MAGIC,0)
#defineSNSLED_IO_OFF2324//_IO(SNSLED_IOC_MAGIC,1)
#defineSNSLED_IOW_PWM2325//_IOW(SNSLED_IOC_MAGIC,2,int)
#defineSNSLED_IOR_PWM232//_IOR(SNSLED_IOC_MAGIC,3,int)
structsnsled_cntx{
intr1;
structsemaphoresem;
structcdevcdev;
};
#endif
//snsled.c
#include<
linux/module.h>
linux/moduleparam.h>
linux/init.h>
linux/kernel.h>
/*printk()*/
linux/slab.h>
/*kmalloc()*/
linux/fs.h>
/*everything...*/
linux/errno.h>
/*errorcodes*/
linux/types.h>
/*size_t*/
linux/proc_fs.h>
linux/fcntl.h>
/*O_ACCMODE*/
linux/seq_file.h>
linux/cdev.h>
asm/system.h>
/*cli(),*_flags*/
asm/uaccess.h>
/*copy_*_user*/
//#include<
asm/semaphore.h>
/*semaphore*/
linux/semaphore.h>
linux/device.h>
/*class_create*/
#include"
snsled.h"
/*localdefinitions*/
/*
linux/platform_device.h>
linux/delay.h>
linux/string.h>
linux/ctype.h>
linux/leds.h>
linux/leds-mt65xx.h>
linux/workqueue.h>
linux/wakelock.h>
cust_leds.h>
*/
#ifdefined(CONFIG_ARCH_MT6573)
mach/mt6573_pwm.h>
mach/mt6573_gpio.h>
mach/pmu6573_sw.h>
#elifdefined(CONFIG_ARCH_MT6516)
mach/mt6516_pwm.h>
mach/mt6516_gpio.h>
/*====macros====*/
#defineBUF_SIZE(64)
#defineSNS_LED_CONTROL_LINEGPIO99//GPIO39
#defineSNS_LED_CONTROL_LINE_GPIO_MODEGPIO_MODE_00
#defineSNS_LED_CONTROL_LINE_PWM_MODEGPIO_MODE_01
/*====declares====*/
ssize_tsnsled_read(structfile*filp,char__user*buf,size_tcount,loff_t*f_pos);
ssize_tsnsled_write(structfile*filp,constchar__user*buf,size_tcount,loff_t*f_pos);
longsnsled_unlocked_ioctl(structfile*filp,unsignedintcmd,unsignedlongarg);
intsnsled_open(structinode*inode,structfile*filp);
intsnsled_release(structinode*inode,structfile*filp);
intsnsled_turn_on(void);
intsnsled_turn_off(void);
intsnsled_set_pwm(intarg);
/*====global====*/
staticintg_snsled_major=0;
staticintg_snsled_minor=0;
structsnsled_cntx*g_snsled_ptr=NULL;
structclass*g_snsled_class=0;
staticstructfile_operationsg_snsled_fops={
.owner=THIS_MODULE,
.read=snsled_read,
.write=snsled_write,
.unlocked_ioctl=snsled_unlocked_ioctl,
.open=snsled_open,
.release=snsled_release,
/*====implements====*/
ssize_tsnsled_read(structfile*filp,char__user*buf,size_tcount,loff_t*f_pos){
#if1
printk(KERN_ALERT"
Snsledread.\n"
);
#else
chartmp_buf[512]={0};
intlen=sprintf(tmp_buf,"
snsledread.\n"
if(copy_to_user(buf,tmp_buf,count)){
//donothing
}
return0;
}
ssize_tsnsled_write(structfile*filp,constchar__user*buf,size_tcount,loff_t*f_pos){
Snsledwrite.\n"
returncount;
longsnsled_unlocked_ioctl(structfile*filp,unsignedintcmd,unsignedlongarg){
interr=0;
longretval=0;
Snsledioctl:
cmd=%d,arg=%d.\n"
cmd,arg);
/*
//extractthetypeandnumberbitfields,anddon'
tdecode
//wrongcmds:
returnENOTTY(inappropriateioctl)beforeaccess_ok()
if(_IOC_TYPE(cmd)!
=SNSLED_IOC_MAGIC)return-ENOTTY;
//if(_IOC_NR(cmd)>
SNSLED_IOC_MAXNR)return-ENOTTY;
//toverify*argisinuserspace
if(_IOC_DIR(cmd)&
_IOC_READ)
err=!
access_ok(VERIFY_WRITE,(void__user*)arg,_IOC_SIZE(cmd));
elseif(_IOC_DIR(cmd)&
_IOC_WRITE)
access_ok(VERIFY_READ,(void__user*)arg,_IOC_SIZE(cmd));
if(err)return-EFAULT;
*/
switch(cmd)
{
caseSNSLED_IO_ON:
on.\n"
//if(mt_set_gpio_out(SNS_LED_CONTROL_LINE,GPIO_OUT_ONE)){printk("
Snsledsetgpiofailed!
!
\n"
snsled_turn_on();
break;
caseSNSLED_IO_OFF:
off.\n"
//if(mt_set_gpio_out(SNS_LED_CONTROL_LINE,GPIO_OUT_ZERO)){printk("
snsled_turn_off();
caseSNSLED_IOW_PWM:
printk(KERN_ALERT"
setpwm,arg=%d.\n"
arg);
//retval=__get_user(g_snsled_ptr->
r1,(int__user*)arg);
snsled_set_pwm((int__user*)arg);
caseSNSLED_IOR_PWM:
#if0
retval=__put_user(g_snsled_ptr->
readr1:
%i.\n"
g_snsled_ptr->
r1);
#endif
readpwm--notconfiguredyet.\n"
default:
yougotthewrongcommand.\n"
returnretval;
intsnsled_open(structinode*inode,structfile*filp){
Snsled:
snsled_open.\n"
#if0
if(mt_set_gpio_mode(SNS_LED_CONTROL_LINE,SNS_LED_CONTROL_LINE_GPIO_MODE)){printk("
Snsledsetgpiomodefailed!
if(mt_set_gpio_dir(SNS_LED_CONTROL_LINE,GPIO_DIR_OUT)){printk("
Snsledsetgpiodirfailed!
if(mt_set_gpio_out(SNS_LED_CONTROL_LINE,GPIO_OUT_ONE)){printk("
#endif
intsnsled_release(structinode*inode,structfile*filp){
snsled_release.\n"
if(mt_set_gpio_out(SNS_LED_CONTROL_LINE,GPIO_OUT_ZERO)){printk("
intsnsled_turn_on(void){
snsled_turn_on.\n"
if(mt_set_gpio_mode(SNS_LED_CONTROL_LINE,SNS_LED_CONTROL_LINE_PWM_MODE)){printk("
intsnsled_turn_off(void){
snsled_turn_off.\n"
//foroldmode
/**
struct_PWM_OLDMODE_REGS{
U16IDLE_VALUE;
//0
U16GUARD_VALUE;
U16GDURATION;
//~
U16WAVE_NUM;
U16DATA_WIDTH;
//highlevel,13bits,0~8191
U16THRESH;
//t
}PWM_MODE_OLD_REGS;
**/
intsnsled_set_pwm(intarg){
structpwm_spec_configpwm_setting;
pwm_setting.pwm_no=PWM1;
snsled_openbegin.\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.GUARD_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_opendone.\n"
//allocdevicemajor
staticintvircdex_alloc_major(void){
dev_tdevt=0;
intresult=0;
result=alloc_chrdev_region(&
devt,g_snsled_minor,SNSLED_NUM,SNSLED_NODE_NAME);
g_snsled_major=MAJOR(devt);
returnresult;
staticintsnsled_release_major(void){
dev_tdevt=MKDEV(g_snsled_major,g_snsled_minor);
unregister_chrdev_region(devt,1);
staticintsnsled_setup_dev(structsnsled_cntx*dev){
interr,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){
returnerr;
//init_MUTEX(&
sem));
sema_init(&
sem),1);
staticintsnsled_unsetup_dev(structsnsled_cntx*dev){
cdev_del(&
cdev));
staticintsnsled_create_devfiles(dev_tdevt){//,conststructdevice_attribute*attr){
interr=-1;
structdevice*dev=NULL;
g_snsled_class=class_create(THIS_MODULE,SNSLED_CLASS_NAME);
if(IS_ERR(g_snsled_class)){
err=PTR_ERR(g_snsled_class);
Failedtocreateclass.\n"
gotoCLASS_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