这个IOCTL的库,可以与驱动层通过IOCTL来通讯。编译后生产test_ioctl的可执行文档。放在/system/bin下面。
可以在adb下面使用。来验证驱动的正确性。
test_ioctl.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
/*下面定义应该与接收端对应*/
#define NUM 0x58
#define IOCTL_START _IO(NUM, 0x01)
#define IOCTL_STOP _IO(NUM, 0x02)
#define IOCTL_SET _IOW(NUM,0x03, unsigned int)
/*
test_ioctl cmd:
0: stop
1: start
other: set parameter
*/
int main(int argc, char **argv)
{
int fd;
int ret;
int cmd = argv[2][0];
if(argc < 2)
{
printf("please enter cmd\n");
return 0;
}
// fd = open("/dev/tty", O_RDWR | O_NOCTTY | O_NDELAY);
printf("test argc-->>%d\n",argc);
printf("test argv[0]-->>%s\n",argv[0]);
printf("test argv[1]-->>%s\n",argv[1]);
// printf("test argv[2]-->>%s\n",argv[2]);
// fd = open("/dev/ttyMT1", O_RDWR );
fd = open(argv[1], O_RDWR );
// fd = open("/dev/fmtransmitter", O_RDONLY);
if(fd <=0 )
{
printf("open devices error!fd=%d\n",fd);
return -1;
} else {
printf("open success!fd=%d\n",fd);
}
sleep(5);
switch(cmd)
{
case '0':
printf("IOCTL_STOP\n");
ret = ioctl(fd,IOCTL_STOP);
printf("ioctl return is %d\n", ret);
break;
case '1':
printf("IOCTL_START\n");
ioctl(fd,IOCTL_START);
break;
case '2':
if(argc < 3)
{
printf("parameter not right\n");
return -1;
}
int val = strtoul(argv[3], 0, 0);
printf("IOCTL_SET val = %d\n", val);
ioctl(fd,IOCTL_SET, &val);
break;
default:
break;
}
close(fd);
return 0;
}
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := test_ioctl.c
LOCAL_SHARED_LIBRARIES := \
libcutils
LOCAL_CERTIFICATE := platform
LOCAL_MODULE := test_ioctl
include $(BUILD_EXECUTABLE)