Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15490441
  • 博文数量: 2005
  • 博客积分: 11986
  • 博客等级: 上将
  • 技术积分: 22535
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-17 13:56
文章分类

全部博文(2005)

文章存档

2014年(2)

2013年(2)

2012年(16)

2011年(66)

2010年(368)

2009年(743)

2008年(491)

2007年(317)

分类: LINUX

2007-05-17 15:51:22

//

//【 版       权 】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   /* printk() */

#include     /* kmalloc() */

#include       /* everything... */

#include    /* error codes */

#include    /* size_t */

#include    /* O_ACCMODE */

#include     /* COPY_TO_USER */

#include     /* cli(), *_flags */

#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指示灯就会熄灭。

阅读(1709) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~