Linux驱动:LED驱动测试
环境:
主机:Fedora12
目标板:MINI6410
目标板LINUX内核版本:2.6.38
实现功能:
驱动目标板4个LED.
说明:
LED与6410引脚对应连接:
LED1---GPK4
LED2---GPK5
LED3---GPK6
LED4---GPK7
驱动源代码:
led_driver.c:
#include
#include
#include
//#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define DEVICE_NAME "led_driver"
#define T_MAJORS700
static struct cdev fun_cdev;
static dev_t dev;
static struct class *led_class;
//功能:初始化IO
static void init_led(void)
{
unsigned temp;
//GPK4-7设置为输出
temp = readl(S3C64XX_GPKCON);
temp &= ~((0xf << 4) | (0xf << 5) | (0xf << 6) | (0xf<< 7));
temp |= (1 << 16) | (1 << 20) | (1 << 24) | (1 << 28);
writel(temp, S3C64XX_GPKCON);
}
//功能:ioctl操作函数
//返回值:成功返回0
static long led_driver_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
unsigned int temp = 0;
printk (DEVICE_NAME"\tjdh:led_driver cmd=%d arg=%d\n",cmd,arg);
temp = readl(S3C64XX_GPKDAT);
if (cmd == 0)
{
temp &= ~(1 << (arg + 3));
}
else
{
temp |= 1 << (arg + 3);
}
writel(temp,S3C64XX_GPKDAT);
return 0;
}
static struct file_operations io_dev_fops = {
.owner = THIS_MODULE,
.unlocked_ioctl = led_driver_ioctl,
};
static int __init dev_init(void)
{
int ret;
unsigned temp;
init_led();
dev = MKDEV(T_MAJORS,0);
cdev_init(&fun_cdev,&io_dev_fops);
ret = register_chrdev_region(dev,1,DEVICE_NAME);
if (ret < 0) return 0;
ret = cdev_add(&fun_cdev,dev,1);
if (ret < 0) return 0;
printk (DEVICE_NAME"\tjdh:led_driver initialized!!\n");
led_class = class_create(THIS_MODULE, "led_class1");
if (IS_ERR(led_class))
{
printk(KERN_INFO "create class error\n");
return -1;
}
device_create(led_class, NULL, dev, NULL, "led_driver");
return ret;
}
static void __exit dev_exit(void)
{
unregister_chrdev_region(dev,1);
device_destroy(led_class, dev);
class_destroy(led_class);
}
module_init(dev_init);
module_exit(dev_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("JDH");
用户程序:
test_led.c
#include
#include
#include
#include "stdio.h"
#include "sys/types.h"
#include "sys/ioctl.h"
#include "stdlib.h"
#include "termios.h"
#include "sys/stat.h"
#include "fcntl.h"
#include "sys/time.h"
#include
#include
int main(int argc, char** argv)
{
int fd;
int led_num = 0;
int led_value = 0;
char temp[10];
fd = open("/dev/led_driver",0);
if (fd < 0)
{
perror("open led_driver error");
exit(1);
}
strcpy(temp,argv[1]);
led_num = atoi(temp);
strcpy(temp,argv[2]);
led_value = atoi(temp);
printf("%d %d\n",led_num,led_value);
ioctl(fd,led_num,led_value);
close(fd);
return 0;
}
测试说明:
将编译所得的可执行文件test_led上传到开发板
运行:
./test_led 0 1 打开LED1
./test_led 1 1 熄灭LED1