驱动版本移植常见问题 android2.3

 


今天,把光传感器的驱动从froyo版本移植到gingebread版本下面,按照道理是应该不用做任何改动,主要是hal层变更了,为了求进度,我就直接拿过来用,毕竟先出了结果心理上踏实点,但是采用了新的编译器gcc4.4.3,设置比原来严格了,遇到了各种之前警告的错误都通不过了,于是改了半天,后经反复定位错误,才算解决掉。

总结下主要问题:

1warning:initialization from incompatible pointer type

error,forbidden warning


此问题发生在以下代码

staticint print_p = 0;

staticint print_l = 0;

staticssize_t isl29028_show_print_p(struct device *dev,

structdevice_attribute *attr, char *buf)

{

returnsprintf(buf, "%d\n", print_p);

}

staticssize_t isl29028_store_print_p(struct device *dev,

structdevice_attribute *attr, char *buf,size_t count)

{

unsignedlong val = simple_strtoul(buf, NULL, 10);

print_p= val;

returncount;

}

staticssize_t isl29028_show_print_l(struct device *dev,

structdevice_attribute *attr, char *buf)

{

returnsprintf(buf, "%d\n", print_l);

}

staticssize_t isl29028_store_print_l(struct device *dev,

structdevice_attribute *attr, char *buf,size_t count)

{

unsignedlong val = simple_strtoul(buf, NULL, 10);

print_l= val;

returncount;

}

staticDEVICE_ATTR(print_p, S_IWUSR | S_IRUGO,isl29028_show_print_p,isl29028_store_print_p);


错误显示行数staticDEVICE_ATTR(print_p, S_IWUSR | S_IRUGO,isl29028_show_print_p,isl29028_store_print_p);

错误分析:

由于经验不足,首先对第一个参数进行确认,我更改了第一个设定值的方式,实际上第一个值可以为任意字符串,主要就是文件节点,最终问题不在此处,搞清楚了DEVICE_ATTR写法问题,我确认第二个参数也没有问题,直接传入值0664实现读写功能。最后感觉两个自定义的函数上面,设置为NULL的话两者可以编译通过,但同时会报新的警告,只定义没有使用,在目前编译器版本下也事通不过的。

单个定位后发现问题出在isl29028_store_print_p函数上,经严格比较定义及现有代码,

staticssize_t isl29028_store_print_p(struct device *dev,

structdevice_attribute *attr, char *buf,size_t count)

问题出在第三个参数上面,编译器要求写入的字符串应该是常量类型,防止遇到不必要的修改,必须写为constchar * buf

此问题终于高一段落。

下面为函数调用的原型,新的编译器要求函数调用时必须保持参数一致

staticinline unsigned long

simple_strtoul(constchar *nptr, char **endptr, int base)

{

returnstrtoul(nptr, endptr, base);

}


2、关于信号量使用的问题

错误记录忘记了,但是知道down_interruptible(&data->prox_sem);函数不让使用了,难道是头文件换了,我没有深究,只是采用了互斥体的方式来解决这个问题


新的用法

1再需要用的结构体里先定义

structmutex mutex;

2在适当的地方初始化

mutex_init(&data->mutex);

3在需要占用资源的地方使用锁

mutex_lock(&data->mutex);

// data->prox_interval.tv_sec= 0;

// data->prox_interval.tv_usec= als_interval*1000;

mutex_unlock(&data->mutex);

3、工作结构与延时工作结构


structwork_struct *work

structdelayed_work prox_work;//定义在 structisl29028_data结构体中


问题发生在调用下面函数发生数据类型不匹配错误,之前警告可以通过的

container_of(work,structisl29028_data,prox_work);

经过对原始定义的跟踪,终于发现structdelayed_work中的一个操作为work_struct类型,可以通过下面写法纠正该错误。

container_of(work,structisl29028_data,prox_work.work);


4、还有什么C90错误,不过读读意思就知道怎么改了,要求一段程序中必须声明和运行代码分开写的。


5、数据类型转换的问题还有原子操作时遇到的


atomic_tprox_lock_state = ATOMIC_INIT(10);


PR_DEB("IOCTL_EN_PROXand locked =%d\n",&prox_lock_state);


统一格式需要修改为atomic_read(&prox_lock_state),返回值为int


数据类型是主要集中问题,参数时老是容易忽视。


你可能感兴趣的:(android,工作,struct,null,编译器,initialization)