原来linux-3.1.6内核在中断发生时不能同步关闭中断本身!但是可以同步关闭其他中断。其实要在中断中关闭中断本身只要用disable_irq_nosync代替disable_irq就可以了
一、kernel起来以后进行msm_sensor_driver的模块儿初始化,对dts配置进行相关的解析
1、初始化
platform_driver_register//注册平台驱动
将msm_eeprom_i2c_driver挂载i2c总线上
2、匹配驱动和设备
compatible = "qcom,camera"和 .driver = {.name = "qcom,camera",匹配
3、匹配成功,调用probe函数
.probe = msm_sensor_driver_platform_probe
解析dt信息并存储在传感器控制结构中
填充上电时序信息
二、在Android起来以后,会启动camera 的守护进程Server,调用一系列的初始化接口,先获取sensor name,根据name去匹配相关的初始化配置,再传到底层写入到模组寄存器。
1、vendor:
cfg.cfgtype = CFG_EEPROM_READ_CAL_DATA;//读取数据的指令
cfg.cfg.read_data.num_bytes = ep->eeprom_params.num_bytes;//长度
cfg.cfg.read_data.dbuffer = ep->eeprom_params.buffer;//把数据读取到ep->eeprom_params.buffer中
rc = ioctl(ep->fd, VIDIOC_MSM_EEPROM_CFG, &cfg);
2、kernel:
case VIDIOC_MSM_EEPROM_CFG:
return msm_eeprom_config(e_ctrl, argp);//调用到这里
case CFG_EEPROM_READ_CAL_DATA:
CDBG("%s E CFG_EEPROM_READ_CAL_DATA\n", __func__);
rc = eeprom_config_read_cal_data(e_ctrl, cdata);
rc = copy_to_user(ptr_dest, e_ctrl->cal_data.mapdata,
cdata.cfg.read_data.num_bytes);该函数的作用就是把内核空间的数据拷贝到用户空间
ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。
int ioctl(int fd, ind cmd, …);其中fd是用户程序打开设备时使用open函数返回的文件标示符,cmd是用户程序对设备的控制命令,至于后面的省略号,那是一些补充参数,一般最多一个,这个参数的有无和cmd的意义相关。