mt_accdet_probe(); //调用的这个函数在Accdet.c (kernel-3.10\drivers\misc\mediatek\accdet\mt6735)
press_key_time = get_headset_key_custom_setting(); //得到长按的时间:在Accdet_custom.c (kernel-3.10\drivers\misc\mediatek\mach\mt6735\lentk6753_65c_l1\accdet)中
switch_dev_register(&accdet_data); //创建sysfs接口
cdev_add(accdet_cdev, accdet_devno, 1); //添加字符设备
init_timer(&micbias_timer); //定时器用于插入三段式耳机后关闭micbias,因为不需要录音
input_register_device(kpd_accdet_dev) //注册input子系统用于耳机按键上报
INIT_WORK(&accdet_work, accdet_work_callback); //accdet_work的工作队列
pmic_register_interrupt_callback(12,accdet_int_handler); //设置中断的调用函数
pmic_register_interrupt_callback(13,accdet_eint_int_handler);
accdet_init(); //初始化accdet,这个pmu中的寄存器
queue_work(accdet_workqueue, &accdet_work); //schedule a work for the first detection ,第一次检测
INIT_WORK(&accdet_disable_work, disable_micbias_callback); //初始化micbias的工作队列
INIT_WORK(&accdet_eint_work, accdet_eint_work_callback); //accdet中断的工作队列
INIT_WORK(&sendkey_eint_work, sendkey_eint_work_callback); //自定义的sendkey工作队列
accdet_setup_eint //初始化中断
mt65xx_eint_registration(, accdet_eint_func, 0);中断处理函数为accdet_eint_func
到这里初始化完成了
执行第一次检测:比如耳机插入后开机这种情况
queue_work(accdet_workqueue, &accdet_work);
accdet_work_callback
check_cable_type //检测耳机的状态,就是是不是一上电已经插入了
switch_set_state((struct switch_dev *)&accdet_data, cable_type); //如果已经插入就上报
kobject_uevent_env //填充上报环境变量
kobject_uevent(&sdev->dev->kobj, KOBJ_CHANGE); //上报,发送改变
当开机后插入耳机时,int中断产生
accdet_eint_func
if(cur_eint_state == EINT_PIN_PLUG_IN ) //如果已经插入了,现在就是拔出
cur_eint_state = EINT_PIN_PLUG_IN; //没有插入,就设置为插入状态
queue_work(accdet_eint_workqueue, &accdet_eint_work); //调用accdet_eint_work工作队列
accdet_eint_work_callback //调用相应函数
eint_accdet_sync_flag = 1; //设置为1
accdet_init();// do set pwm_idle on in accdet_init,初始化accdet
enable_accdet(ACCDET_SWCTRL_EN); //启动accdet
//Turn on micbias always
pmic_pwrap_write(ACCDET_PWM_WIDTH, cust_headset_settings->pwm_width); //打开micbias ,公司定义的
pmic_pwrap_write(ACCDET_PWM_THRESH, cust_headset_settings->pwm_width);//公司定义的
sendkey_setup_eint(); //sendkey中断注册,公司定义的
检测按键
当按下按键accdet检测到电压区域变化: 通过pmu的中断,pm会调用设置callback函数,分别是pmu的中断12和中断13