1.首先驱动程序文件通过tftp传输到开发板上,然后执行insmod s3c_led.ko 装载LED驱动模块
2.cat /proc/devices |grep led,显示led 250
3.创建设备节点:mknod /dev/led0 c 250 0
mknod /dev/led1 c 250 1
mknod /dev/led2 c 250 2
mknod /dev/led3 c 250 3
4.改变设备的保护权限:chmod 644 /dev/led[0-3]
5.测试程序如下:
#include <stdio.h>
#include <stdarg.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <stdlib.h>
#include <errno.h> //返回出错信息所需要的头文件
#define PLATDRV_MAGIC 0x60
#define LED_OFF _IO (PLATDRV_MAGIC, 0x18)
#define LED_ON _IO (PLATDRV_MAGIC, 0x19)
#define LED_NUM 4
#define NAME_LENGTH 20
int main(int argc,char **argv)
{
int led_num;
int cmd_num;
int fd[LED_NUM];
int j=0;
char dev_name[NAME_LENGTH]={0};
int fd1;
if(argc<3)
{
printf("too few parameters,please input:./%s 0|1|2|3 0(ON)|1(OFF)|2(BLINK)\n",argv[0]);
return -1;
}
for(j=0;j<LED_NUM;j++)
{
snprintf(dev_name,sizeof(dev_name),"/dev/led%d",j); //格式化输出到dev_name
fd[j] = open(dev_name,O_RDWR); //依次打开所有LED驱动文件
if(fd[j]<0)
{
printf("open file %s error %s",dev_name,strerror(errno));
return -1;
}
}
led_num=atoi(argv[1]);
cmd_num=atoi(argv[2]);
fd1 = fd[led_num];
switch(cmd_num)
{
case 0:
ioctl(fd1,LED_ON);
break;
case 1:
ioctl(fd1,LED_OFF);
break;
default:
printf("failure\n");
break;
}
for(j=0;j<LED_NUM;j++)
close(fd[j]); //关闭所有文件
return 0;
}
6.总结:在编写测试程序时,开始总是没有效果,打印文件描述符也是0,但总是找不到出错信息,后来在应用程序空间使用了strerror(errno)这个函数
才打印出错原因,这才找出了问题。在应用程序空间使用strerror(errno)还是很管用的。。。。