hi3516v300gpio驱动编译遇到的问题2

1. /home/share/HI3516CV300/Hi3516CV300_SDK_V1.0.1.1/package/drv/extdrv/gpio/hi_gpio.c:50:24: fatal error: asm/system.h:没有那个文件或目录
 #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 :

ioctl,unlocked_ioctl和compat_ioctl
现在只有unlocked_ioctl和compat_ioctl 了

在kernel 2.6.36 中已经完全删除了struct file_operations 中的ioctl 函数指针,取而代之的是unlocked_ioctl 。

这个指针函数变了之后最大的影响是参数中 少了inode , 不过这个不是问题,因为用户程序中的ioctl对应的系统调用接口没有变化,所以用户程序不需要改变,一切都交给内核处理了,如果想在unlocked_ioctl中获得inode 等信息可以用如下方法:
struct inode *inode = file->f_mapping->host;
struct block_device *bdev = inode->i_bdev;
struct gendisk *disk = bdev->bd_disk;
fmode_t mode = file->f_mode;
struct backing_dev_info *bdi;

这次内核函数的变化引出了一个问题,从ioctl系统调用往后,真正的ioctl调用顺序是什么?为什么compat_ioctl 不被调用?
compat_ioctl被使用在用户空间为32位模式,而内核运行在64位模式时。这时候,需要将64位转成32位。
以下是2.6.36的情况:
   
   
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
其实compat_ioctl 没有被调用的原因是compat_sys_ioctl 没有被调用,而它没有被调用的原因似乎是压根就没有编译到内核中,因为我没有找到调用这个函数的代码。
unlocked_ioctl 实际上取代了用了很久的ioctl,主要的改进就是不再需要上大内核锁 (调用之前不再先调用lock_kernel()然后再unlock_kernel())
总的来说kernel 开发者正在试图朝移除大内核锁的方向努力,ioctl的移除就是被革命了。相信以后越来越多的内核函数会摆脱大内核锁的依赖,并且大内核锁最终会被移除。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值