📄 pxa270_led_ary_drv.c
字号:
#include <linux/config.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/timer.h>
#include <linux/init.h>
#include <linux/module.h>
#include <asm/hardware.h>
#include <asm/io.h>
// LED DEVICE MAJOR
#define SIMPLE_LED_MAJOR 99
#define OURS_LED_DEBUG
#define LED_ON 0
#define LED_OFF 1
#define VERSION "PXA2700EP-ledary-V1.00-060603"
void showversion(void)
{
printk("*********************************\n");
printk("\t%s\t\n",VERSION);
printk("********************************\n\n");
}
static long ioremap_addr;
// ------------------- READ ------------------------
ssize_t SIMPLE_LED_read (struct file * file ,char * buf, size_t count, loff_t * f_ops)
{
#ifdef OURS_LED_DEBUG
printk("SIMPLE_LED_read[--kernel--]\n");
#endif
return count;
}
// ------------------- WRITE -----------------------
ssize_t SIMPLE_LED_write (struct file * file ,const char * buf, size_t count, loff_t * f_ops)
{
int tmp_buf;
#ifdef OURS_LED_DEBUG
printk ("SIMPLE_LED_write [ --kernel--]\n");
#endif
// -------------------------------------------
tmp_buf = buf[1];
tmp_buf = tmp_buf<<8;
tmp_buf = tmp_buf | buf[0];
#ifdef OURS_LED_DEBUG
printk("tmp = %x\n",tmp_buf);
#endif
outw(tmp_buf,ioremap_addr);
// -------------------------------------------
return count;
}
// ------------------- IOCTL -----------------------
ssize_t SIMPLE_LED_ioctl (struct inode * inode ,struct file * file, unsigned int cmd, long data)
{
#ifdef OURS_LED_DEBUG
printk("SIMPLE_LED_ioctl [--kernel--]\n");
#endif
switch(cmd)
{
case LED_ON:{GPCR3|=0x1;break;}
case LED_OFF:{GPCR3|=0x1;break;}
default:
{printk("lcd control:no cmd run [--kernel--]\n");return (-EINVAL);}
}
return 0;
}
// ------------------- OPEN ------------------------
ssize_t SIMPLE_LED_open (struct inode * inode ,struct file * file)
{
#ifdef OURS_LED_DEBUG
printk ("SIMPLE_LED_open [ --kernel--]\n");
#endif
MOD_INC_USE_COUNT;
return 0;
}
// ------------------- RELEASE/CLOSE ---------------
ssize_t SIMPLE_LED_release (struct inode * inode ,struct file * file)
{
#ifdef OURS_LED_DEBUG
printk ("SIMPLE_LED_release [ --kernel--]\n");
#endif
outw(0x0000,ioremap_addr); // close the led ary, all led off
MOD_DEC_USE_COUNT;
return 0;
}
// -------------------------------------------------
struct file_operations LED_ctl_ops ={
open: SIMPLE_LED_open,
read: SIMPLE_LED_read,
write: SIMPLE_LED_write,
ioctl: SIMPLE_LED_ioctl,
release: SIMPLE_LED_release,
};
// ------------------- INIT ------------------------
static int __init HW_LED_CTL_init(void)
{
int ret = -ENODEV;
ret = devfs_register_chrdev(SIMPLE_LED_MAJOR, "led_ary_ctl", &LED_ctl_ops);
showversion();
if( ret < 0 )
{
printk (" pxa270: init_module failed with %d\n [ --kernel--]", ret);
return ret;
}
else
{
printk(" pxa270 led_driver register success!!! [ --kernel--]\n");
}
// ---------------------------------------------
ioremap_addr=ioremap(0x0800c000,0x0f); //
outw(0x00ff,ioremap_addr); // open led ary, all led on
#ifdef OURS_LED_DEBUG
printk("remap address = %x [ --kernel--]\n",ioremap_addr);
#endif
// ---------------------------------------------
return ret;
}
static int __init pxa270_LED_CTL_init(void)
{
int ret = -ENODEV;
#ifdef OURS_LED_DEBUG
printk("pxa270_LED_CTL_init [--kernel--]\n");
#endif
ret = HW_LED_CTL_init();
if (ret)
return ret;
return 0;
}
static void __exit cleanup_LED_ctl(void)
{
#ifdef OURS_LED_DEBUG
printk("cleanup_LED_ctl [--kernel--]\n");
#endif
outw(0x0000,ioremap_addr);
devfs_unregister_chrdev (SIMPLE_LED_MAJOR, "led_ary_ctl" );
}
MODULE_DESCRIPTION("simple led driver module");
MODULE_AUTHOR("liduo");
MODULE_LICENSE("GPL");
module_init(pxa270_LED_CTL_init);
module_exit(cleanup_LED_ctl);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -