最近在学习Android源代码的结构,需要经常编译内核
在单独编译Andrioid linux kernel的时候再编译到/driver/misc/akm8975.c 时出现
问题主要是linux 2.6.36的驱动机制里file_operation关于ioctl这块改动比较大
所以导致了unknown field 'ioctl' specified in initializer的这个问题
原来内核的ioctl注册方法:
例:
static int ***_ioctl(Struct inode *in,struct file *filp,unsigned int cmd,unsigned long arg)
{
..........//内容
}
.........
static struct file_operations ***_fops={
.open = ***_open,
.read = ***_read,
.ioctl = ***_ioctl,
}
**********************************************//
2.6.36内核的ioctl改动:
去掉了原来的ioctl,添加两个新的成员,所以会出错
long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); long (*compat_ioctl) (struct file *, unsigned int, unsigned long);
例:
static long ***_unlocked_ioctl(struct file *filp,unsigned int cmd,unsigned long arg)
{
..........//内容
}
static struct file_operations ***_fops={
.open=***_open,
.....,
.unlocked = ***_unlocked_ioctl;
}
**********************************************//
运气好的话按照这个样子更改,是能够通过编译通过 :)