led 驱动程序测试
2015-11-14 13:51
447 查看
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)还是很管用的。。。。
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)还是很管用的。。。。
相关文章推荐
- NOIP2015TG记
- VM虚拟机快速安装LAMP后的配置
- 学习Python:做数据科学还是网站开发?
- 线程和线程池的相关问题记录
- 《项目管理艺术》第十至十六章读书摘要
- 编程基础知识之编程哲学
- 在Linux系统下搭建Java编程操练环境
- java多态与异常处理——动手动脑
- TEXTMETRICW 结构记录
- Linux下软件开发RPC框架
- 秒杀多线程第二篇 多线程第一次亲密接触 CreateThread与_beginthreadex本质区别
- 【用colspan,rowspan属性上下合并单元格,cellspacing,cellpadding设置间距】
- Card Game Cheater
- A+B Again
- 普法知识(2):法律保护弱势群体
- 秒杀多线程第一篇 多线程笔试面试题汇总 http://blog.csdn.net/morewindows/article/details/7392749
- STS怎么创建一个springMVC的Maven项目
- 01分数规划(转)
- [LeetCode] Implement strStr()[字符串hash]
- Note one