应用调用驱动的ioctl函数

在驱动中增加ioctl的方法在前一篇中介绍了。作为调试驱动的一个很有用的方式,ioctl提供了应用程序和底层驱动的桥梁。在应用程序中调用底层函数ioctl可以作为驱动的开发调试,后期性能测试的手段。这里的应用程序其实是定义在rootfs中的,我们将程序编译成一个程序片段,赋予它执行权限,之后调用它执行我们在驱动中的函数。

这里函数从新贴出来前面的ioctl的函数

static long at32_wdt_ioctl(struct file *file,
unsigned int cmd, unsigned long arg)
{
int ret = -ENOTTY;
int time;
void __user *argp = (void __user *)arg;
int __user *p = argp;


switch (cmd) {
case WDIOC_GETSUPPORT:
ret = copy_to_user(argp, &at32_wdt_info,
sizeof(at32_wdt_info)) ? -EFAULT : 0;
break;
case WDIOC_GETSTATUS:
ret = put_user(0, p);
break;
case WDIOC_GETBOOTSTATUS:
ret = put_user(wdt->boot_status, p);
break;
case WDIOC_SETOPTIONS:
ret = get_user(time, p);
if (ret)
break;
if (time & WDIOS_DISABLECARD)
at32_wdt_stop();
if (time & WDIOS_ENABLECARD)
at32_wdt_start();
ret = 0;
break;
case WDIOC_KEEPALIVE:
at32_wdt_pat();
ret = 0;
break;
case WDIOC_SETTIMEOUT:
ret = get_user(time, p);
if (ret)
break;
ret = at32_wdt_settimeout(time);
if (ret)
break;
/* Enable new time value */
at32_wdt_start();
/* fall through */
case WDIOC_GETTIMEOUT:
ret = put_user(wdt->timeout, p);
break;
}


return ret;
}

上面定义了几个命令   

下面就是重头戏,组织我们的应用程序了

先要建立一个.c文件 就先建立一个test.c吧

编辑里面的内容

先解决里面的依赖文件的问题

#include <sys/time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <getopt.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include<watchdog.h>

一个关键的函数就是main 了

int main(int argc, char const *argv[])
{
int fd;
int c;
char *devname;
int ret = 0;
char *ioctl_cmd;
char *ioctl_arg;
int cmd;
int value;
int i;


if (argc == 1) {
usage(argv[0]);
ret = -1;
goto exit;
}


while ((c = getopt(argc, argv, "d:i:a:")) != -1) {
switch (c) {
case 'd':
devname = strdup(optarg);
break;
case 'i':
ioctl_cmd = strdup(optarg);
break;
case 'a':
ioctl_arg = strdup(optarg);
break;
default:
usage(argv[0]);
ret = -2;
goto exit;
}
}


fd = open(devname, O_RDWR);
if (fd < 0) {
perror("open");
ret = -3;
goto exit;
}


cmd = lookup_cmd(ioctl_cmd);
if (cmd == 0) {
fprintf(stderr, "invalid ioctl cmd\n");
ret = -4;
goto exit;
}
switch (cmd) {
case WDIOC_SUPPORT:
value = strtol(ioctl_arg, NULL, 0);
if ((ret = ioctl(fd, WDIOC_SUPPORT, &value)) < 0) {
fprintf(stderr, "ioctl for WDIOC_SUPPORT failed with value: %d\n", value);
goto exit;
}
break;
case WDIOC_GETSTATUS:
if ((ret = ioctl(fd, WDIOC_GETSTATUS, &value)) < 0) {
fprintf(stderr, "ioctl for I2C_RDWR failed with value: %d\n", value);
goto exit;
}
break;
default:
fprintf(stderr, "invalid ioctl cmd !\n");
ret = -5;
break;
}


exit:
if (fd)
close(fd);
return ret;
}

上面就是调用的关键步骤 ,可以看出来里面其实关键就是getopt(argc, argv, "d:i:a:")获取终端输入的参数

ioctl(fd, WDIOC_GETSTATUS, &value)将参数应用 去调用驱动底层的函数


这个ioctl是一个C 库的接口函数,getopt是全局的函数  会用就行了

这样就可以调用了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值