linux 设备文件无法打开,驱动测试程序中无法打开设备文件

【已解决】驱动测试程序中无法打开设备文件

实现了一个简单的字符设备,然后按照网上其它人的教程中的例子,

自己写了个驱动测试文件,内容如下:

--------------------------------------------------------------

#include

#include //#include "linux/stat.h"

#include

#include

int main(void)

{

int testChg;

int test;

//test = open("/dev/spi", S_IRWXU|S_IRWXG|S_IRWXO);

test = open("/dev/spi", O_WRONLY);

if(test==-1)

printf("Error when open some device.\n");

else

printf("Test device Open is OK, test=%d.\n", test);

printf("Now will open /dev/chg.\n");

//testChg = open("/dev/chg", S_IRWXU);

//testChg = open("/dev/chg", S_IRWXU|S_IRWXG|S_IRWXO);

testChg = open("/dev/chg", O_WRONLY);

printf("open result: testChg =%d.\n", testChg);

if(testChg == -1)

return -1;

printf("Open is OK.\n");

printf("Now will do ioctl().\n");

ioctl(testChg, 1, 0);

printf("ioctl is done.\n");

close(testChg);

return 0;

}--------------------------------------------------------------

其中注释掉的代码是原先的实现,其中用到了参数SS_IRWXU,对应的linux/stat.h有如下定义:

(注:linux kernel里面的是linux/stat.h中,增加了一些其他组合定义的宏,比如S_IWUGO,表示

#define S_IWUGO   (S_IWUSR|S_IWGRP|S_IWOTH)

而这些组合的定义,对于我当前用到的buildroot中的buildroot\build_arm\staging_dir\usr\include\linux 中的stat.h,竟然没有,我之前由于这个错误,搞好了半天,才发现这个问题的。。。)

--------------------------------------------------------------

#ifdef __KERNEL__

.............

#define S_IRWXU 00700

#define S_IRUSR 00400

#define S_IWUSR 00200

#define S_IXUSR 00100

#define S_IRWXG 00070

#define S_IRGRP 00040

#define S_IWGRP 00020

#define S_IXGRP 00010

#define S_IRWXO 00007

#define S_IROTH 00004

#define S_IWOTH 00002

#define S_IXOTH 00001

.............

#endif

--------------------------------------------------------------

其意思很明显,是针对某文件或文件夹,定义了不同的用户/组/其他等人的访问权限,

而驱动测试文件里面的,传递给打开设备时候的参数,此处用的是O_WRONLY,

是针对设备文件的权限,其定义在fcntl.h中:

--------------------------------------------------------------

#define O_ACCMODE 00000003

#define O_RDONLY 00000000

#define O_WRONLY 00000001

#define O_RDWR   00000002

--------------------------------------------------------------

上面用的O_WRONLY表示可读写。

所以,用被注释掉的那部分代码去测试设备文件的打开,始终都不成功,编译运行测试例子,都是输出:

--------------------------------------------------------------

# ./chgDemo

Error when open some device.

Now will open /dev/chg.

open result: testChg =-1.

--------------------------------------------------------------

最后都改成对应的设备文件访问参数O_WRONLY之后,代码运行就正常了,输出:

--------------------------------------------------------------

# ./chgDemo

Test device Open[ 4063.590000] as352x_afe_charger_ioctl: cmd=1, arg=0

is OK, [ 4063.590000] test, call is connected.

test=3.

Now will open /dev/chg.

open result: testChg =4.

Open is OK.

Now will do ioctl().

ioctl is done.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值