模块:marvel 8787
内核:2.6.35
我的模块是wifi和蓝牙共用的,蓝牙的移植部分没啥好说的,把ko文件装载上去就可
以用,到是做电源管理时出现了问题。由于我的的wifi模块电源是受控的,也就是说,统
睡眠时,模块会断电,而这会导致蓝牙的驱动,每次唤醒的时候都会被重新加载,驱动
注册所创建的文件夹 rfkill0 会变为 rfkill1、 rfkill2 、rfkill2 ...... 。
这会导致android上层找不到设备文件,还有个问题,就是android上层要对rfkill中的
一个状态标志文件读写,可只有root用户才有写权限,android上层的bluetooth服务进程
是 bluetooth 用户所以无法访问。
解决办法:
文件路径:kernel_imx/net/rfkill/core.c
1、 在rfkill_dev_attrs 结构体中将 state 中S_IWUSR改为S_IWUGO
static struct device_attribute rfkill_dev_attrs[] = {
__ATTR(name, S_IRUGO, rfkill_name_show, NULL),
__ATTR(type, S_IRUGO, rfkill_type_show, NULL),
__ATTR(index, S_IRUGO, rfkill_idx_show, NULL),
__ATTR(persistent, S_IRUGO, rfkill_persistent_show, NULL),
__ATTR(state,S_IRUGO|S_IWUGO/*S_IWUSR*/,rfkill_state_show,rfkill_state_store)
__ATTR(claim, S_IRUGO|S_IWUSR, rfkill_claim_show, rfkill_claim_store),
__ATTR(soft, S_IRUGO|S_IWUSR, rfkill_soft_show, rfkill_soft_store),
__ATTR(hard, S_IRUGO, rfkill_hard_show, NULL),
__ATTR_NULL
};
2、在rfkill_register函数中添加:rfkill_no = 0 ,位置如下
int __must_check rfkill_register(struct rfkill *rfkill)
{
static unsigned long rfkill_no;
struct device *dev = &rfkill->dev;
int error;
BUG_ON(!rfkill);
mutex_lock(&rfkill_global_mutex);
if (rfkill->registered) {
error = -EALREADY;
goto unlock;
}
rfkill_no = 0; // 强制把创建文件名限定为 rfkill0
rfkill->idx = rfkill_no;
dev_set_name(dev, "rfkill%lu", rfkill_no);
。。。。。。。。。。。。。。。。。。
}
对于第2部分文件名改变的问题,可以在硬件抽象层 bluetooth.c 。