[没事乱分析] Freescal mma8452 probe函数乱分析

static int mma8452_probe(struct i2c_client *client,
			const struct i2c_device_id *id){
	int err = 0;//储存错误信息
	int tempvalue = 0;//储存8452配置寄存器的读值
	struct mma8452_data *data;//自定义8452数据结构体
	
	if(!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)){//检测现用I2C适配器是否支持某功能,比如smbus的相关功能
		printk(KERN_INFO "i2c_check_functionality error\n");//若不支持则向标准输出终端输出错误信息
		goto exit;//若不支持,则跳转到exit地址执行
	}
	data = kzalloc(sizeof(struct mma8452_data), GFP_KERNEL);//为自定义8452数据结构体分配GFP_KERNEL类型(整页)的内存
	if(!data){//如果在上一条语句执行完毕后data仍为空,则说明内存分配失败,执行以下语句
		err = -ENOMEM;//将用于存放错误信息的变量err复制为-ENOMEM,字面理解为剩余空间不足
		goto exit;//像上面goto语句一样直接跳转到exit执行
	}
	data->client = client;//将mma8452_probe调用者传入的参数client赋值给data结构体中的client成员
	mutex_init(&data->enable_mutex);//初始化两个互斥锁,一个为enable_mutex
	mutex_init(&data->data_mutex);//另一个为data_mutex
	
	tempvalue = i2c_smbus_read_word_data(client, MMA8452_WHO_AM_I);//通过I2C读取mma8452的whoami寄存器,可以读出一个当前芯片的ID,用以鉴别现在操作的是否是MMA8452这颗料
	if(MMA8452_ID == tempvalue){//判断是否MMA8452
		printk(KERN_INFO "Freescale sensor Device detect!\nmma8452 registered I2C driver!\n");//如果是则输出检测到设备驱动的信息
		mma8452_client = client;//将client赋值给全局变量mma8452_client
	}else{//若不是MMA8452
		printk(KERN_INFO "Freescale sensor not found, i2c error %d \n", tempvalue);//则输出错误信息并打印读到的ID
		mma8452_client = NULL;//将mma8452_client置NULL
		err = -1;//错误信息给个负值
		goto kfree_exit;//由于前面已经kzalloc了data,所以这里要到kfree_exit去执行kfree
	}
	i2c_set_clientdata(mma8452_client, data);//将data赋值给mma8452_client->dev->p->private_data,即将data设置为client的私有数据

	#define MMA8452_DEFAULT_DELAY 100//定义宏MMA8452_DEFAULT_DELAY的值为100。以下开始设置MMA8452芯片的部分寄存器
	mma8452_set_delay(&client->dev, MMA8452_DEFAULT_DELAY);//设置delay
	mma_status.ctl_reg1 = 0x10;//暂存CTRL_REG1
	tempvalue = i2c_smbus_write_byte_data(client, MMA8452_CTRL_REG1, mma_status.ctl_reg1);//将值写到芯片CTRL_REG1中,standby
	mma_status.mode = MMA8452_RANGE_2G;//暂存odr
	tempvalue = i2c_smbus_write_byte_data(client, MMA8452_XYZ_DATA_CFG, mma_status.mode);//写到寄存器中
	mma_status.ctl_reg1 |= 0x01;//暂存CTRL_REG1
	tempvalue = i2c_smbus_write_byte_data(client, MMA8452_CTRL_REG1, mma_status.ctl_reg1);//active
	if( 0 != tempvalue)//判断前几步的写寄存器是否成功,0为成功
	{
		printk("mma8452:tempvalue!=0!\n");//若失败,输出失败信息
		goto input_exit;//跳转到input_exit执行
	}
	mdelay(MMA8452_DEFAULT_DELAY);//延时100ms
	
	data->mode = 0;/* Default mode is normal, when chip reset */
	mma8452_power(data, 0);//power off
	INIT_DELAYED_WORK(&data->work, mma8452_work_func);//初始化延迟工作队列,轮寻方式取值
	err = mma8452_input_init(data);//填充input_dev结构,将设备注册到input_dev
	if(err<0){//注册失败时err值小于零
		goto kfree_exit;//跳转到kfree_exit执行
	}
	
	err = sysfs_create_group(&data->input->dev.kobj, &mma8452_attribute_group);//为该设备的kobject注册一堆属性,调试用
	if(err<0){//若注册失败
		goto input_exit;//则跳转到input_exit执行
	}
	return 0;//至此,正常的probe执行完毕,返回0代表该设备已经probe到对应的驱动程序
input_exit://非正常退出
	mma8452_input_fini(data);//注销input_dev,释放input_dev内存
kfree_exit://非正常退出
	kfree(data);//释放data内存
exit://非正常退出
	return err;//返回-1
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值