今天,把光传感器的驱动从froyo版本移植到gingebread版本下面,按照道理是应该不用做任何改动,主要是hal层变更了,为了求进度,我就直接拿过来用,毕竟先出了结果心理上踏实点,但是采用了新的编译器gcc4.4.3,设置比原来严格了,遇到了各种之前警告的错误都通不过了,于是改了半天,后经反复定位错误,才算解决掉。
总结下主要问题:
1、warning: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型
数据类型是主要集中问题,参数时老是容易忽视。