//【 版 权 】Copyright (c) 2006-2008 GLIETHTTP
//
//【 文 件 版 本 】v1.x
//
//【 创 建 日 期 】2006/12/21
//
//【 文 件 描 述 】LED闪灯驱动测试--led_driver.c
//■
#ifndef __KERNEL__
# define __KERNEL__
#endif
#ifndef MODULE
# define MODULE
#endif
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "led_driver.h"
#define DEVICE_NAME "led"
#define led_MAJOR 254
#define led_MINOR 0
#define DBG(x...)printk(DEVICE_NAME ":" x)
//
static int led_ioctl(struct inode *inode, struct file *file,unsigned int cmd, unsigned long arg)
{
switch(cmd)
{
case 1:xLED1_ON();break;
case 2:xLED1_OFF();break;
case 3:xLED2_ON();break;
case 4:xLED2_OFF();break;
default:DBG("error cmd number\n");break;
}
return 0;
}
//
static int led_open(struct inode *inode, struct file *file)
{
MOD_INC_USE_COUNT;
xLED1_ON();
DBG("device open sucess!\n");
return 0;
}
//
static int led_release(struct inode *inode, struct file *filp)
{
MOD_DEC_USE_COUNT;
xLED1_OFF();
DBG("device release\n");
return 0;
}
//
static struct file_operations led_fops={
owner: THIS_MODULE,
ioctl: led_ioctl,
open: led_open,
release:led_release,
};
//
static int __init led_init( void)
{int result;
SET_MODULE_OWNER(&led_fops);
result = register_chrdev(led_MAJOR, "led",&led_fops);
if (result < 0) return result;
DBG(" initialized\n");
xLED_Install();
return 0;
}
//
static void __exit led_exit( void)
{
unregister_chrdev(led_MAJOR, "led");
DBG(" unloaded\n");
}
//
module_init(led_init);
module_exit(led_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("gliethttp");
MODULE_DESCRIPTION("led 驱动测试!");
编译:
[root@gliethttp]# arm-linux-gcc -c -I my_linux_head_dir led_driver.c
成功编译后,会生成一个led_driver.o文件,将led_driver.o通过rz三线串口发送到目标板,并在目标板上建立设备节点
[root@B.J.xx /root]# mknod /dev/led c 254 0
然后安装驱动
[root@B.J.xx /root]# insmod led_driver.o
可以通过lsmod查询驱动模块
[root@B.J.xx /root]#lsmod
通过rmmod卸载驱动模块
[root@B.J.xx /root]# rmmod led_driver
驱动安装完毕,当应用程序调用fd=open("/dev/led",O_RDWR)时,开发板上的LED指示灯就会点亮,当应用程序调用close(fd)时,开发板上的LED指示灯就会熄灭。