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

2010-06-09  张芳芳 

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

实现了一个简单的字符设备,然后按照网上其它人的教程中的例子,
自己写了个驱动测试文件,内容如下:

--------------------------------------------------------------
#include <stdio.h>
#include <linux/stat.h>
//#include "linux/stat.h"

#include <sys/types.h>
#include <fcntl.h>

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.

457°/4577 人阅读/0 条评论 发表评论

登录 后发表评论