#include <asm/system.h>
^
compilation terminated.
make[2]: *** [/home/share/HI3516CV300/Hi3516CV300_SDK_V1.0.1.1/package/drv/extdrv/gpio/hi_gpio.o] 错误 1
make[1]: *** [_module_/home/share/HI3516CV300/Hi3516CV300_SDK_V1.0.1.1/package/drv/extdrv/gpio] 错误 2
make[1]:正在离开目录 `/home/share/HI3516CV300/Hi3516CV300_SDK_V1.0.1.1/package/osdrv/opensource/kernel/linux-3.18.y'
make: *** [default] 错误 2
网上查找资料后发现3.3以后的内核用switch_to.h代替了system.h
将#include <asm/system.h>修改为#include <asm/switch_to.h>
2.
static DECLARE_MUTEX(gpio_sem);
^
/home/share/HI3516CV300/Hi3516CV300_SDK_V1.0.1.1/package/drv/extdrv/gpio/hi_gpio.c:129:1: warning: parameter names (without types) in function declaration
static DECLARE_MUTEX(gpio_sem);
^
/home/share/HI3516CV300/Hi3516CV300_SDK_V1.0.1.1/package/drv/extdrv/gpio/hi_gpio.c: In function ‘gpio_ioctl’:
/home/share/HI3516CV300/Hi3516CV300_SDK_V1.0.1.1/package/drv/extdrv/gpio/hi_gpio.c:329:22: error: ‘gpio_sem’ undeclared (first use in this function)
down_interruptible(&gpio_sem);
^
/home/share/HI3516CV300/Hi3516CV300_SDK_V1.0.1.1/package/drv/extdrv/gpio/hi_gpio.c:329:22: note: each undeclared identifier is reported only once for each function it appears in
/home/share/HI3516CV300/Hi3516CV300_SDK_V1.0.1.1/package/drv/extdrv/gpio/hi_gpio.c: At top level:
/home/share/HI3516CV300/Hi3516CV300_SDK_V1.0.1.1/package/drv/extdrv/gpio/hi_gpio.c:397:3: error: unknown field ‘ioctl’ specified in initializer
ioctl:gpio_ioctl,
^
/home/share/HI3516CV300/Hi3516CV300_SDK_V1.0.1.1/package/drv/extdrv/gpio/hi_gpio.c:397:9: warning: initialization from incompatible pointer type
ioctl:gpio_ioctl,
^
/home/share/HI3516CV300/Hi3516CV300_SDK_V1.0.1.1/package/drv/extdrv/gpio/hi_gpio.c:397:9: warning: (near initialization for ‘gpio_fops.flush’)
/home/share/HI3516CV300/Hi3516CV300_SDK_V1.0.1.1/package/drv/extdrv/gpio/hi_gpio.c:129:8: warning: ‘DECLARE_MUTEX’ declared ‘static’ but never defined [-Wunused-function]
static DECLARE_MUTEX(gpio_sem);
^
cc1: some warnings being treated as errors
make[2]: *** [/home/share/HI3516CV300/Hi3516CV300_SDK_V1.0.1.1/package/drv/extdrv/gpio/hi_gpio.o] 错误 1
make[1]: *** [_module_/home/share/HI3516CV300/Hi3516CV300_SDK_V1.0.1.1/package/drv/extdrv/gpio] 错误 2
make[1]:正在离开目录 `/home/share/HI3516CV300/Hi3516CV300_SDK_V1.0.1.1/package/osdrv/opensource/kernel/linux-3.18.y'
make: *** [default] 错误 2
原因是Linux 2.6.36以后file_operations和DECLARE_MUTEX 的有了变化:
1) 在include/linux/semaphore.h 中
将#define DECLARE_MUTEX(name) 改成了 #define DEFINE_SEMAPHORE(name)
2)kernel 2.6.35 及之前的版本中struct file_operations 一共有3个ioctl :
在kernel 2.6.36 中已经完全删除了struct file_operations 中的ioctl 函数指针,取而代之的是unlocked_ioctl 。
SYSCALL_DEFINE3(ioctl ...) compat_sys_ioctl (是否直接调用compat_ioctl 取决于compat_ioctl 是否存在)| | |-----> compat_ioctl| ||------>do_vfs_ioctl (下一步的调用取决于file->f_path.dentry->d_inode->i_node)| |------>file_ioctl| ||-------------------------------->vfs_ioctl|------->unlock_ioctl