📄 s3c2410-double-led.c
字号:
#include <linux/config.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <asm/hardware.h>
#include <asm/delay.h>
#include <asm/uaccess.h>
#undef DEBUG
#define DEBUG
#ifdef DEBUG
#define DPRINTK(x...) printk("s3c2410-led:"##x)
#else
#define DPRINTK(x...)
#endif
#define LED1 GPIO_F4
#define LED2 GPIO_F5
#define LED3 GPIO_F6
#define LED4 GPIO_F7
static unsigned int LED[] = {LED1, LED2, LED3, LED4};
#define NumberOfLed (sizeof(LED)/sizeof(*LED))
#define DEVICE_NAME "s3c2410-led"
#define DbLedRAW_MINOR 1
static int DbLedMajor = 0;
static char ledstatus = 1;
static void LoopLed(void);
static void InitLed(void);
static void UpdateLed(void)
{
/*int i;*/
/*for(i=0; i<NumberOfLed; i++) {
if(ledstatus & (1 << i))
write_gpio_bit(LED[i], 0);
else
write_gpio_bit(LED[i], 1);
}*/
if(ledstatus & 1)
LoopLed();
else
InitLed();
}
/* 跑马灯循环 */
static void LoopLed(void)
{
int i, j;
int count = 50;
while(count)
{
for(i=0; i<NumberOfLed; i++) {
for(j=0; j<NumberOfLed; j++)
write_gpio_bit(LED[j], 1);
write_gpio_bit(LED[i], 0);
udelay(10000000);
}
count--;
}
InitLed();
}
/* 将LED全部熄灭 */
static void InitLed(void)
{
int i;
for(i=0; i<NumberOfLed; i++)
write_gpio_bit(LED[i],1);
}
static ssize_t s3c2410_DbLed_write(struct file *file, const char *buffer, size_t count, loff_t *ppos)
{
copy_from_user(&ledstatus, buffer, sizeof(ledstatus));
UpdateLed();
DPRINTK("write: led=0x%x, count=%d\n", ledstatus, count);
return sizeof(ledstatus);
}
static int s3c2410_DbLed_open(struct inode *inode, struct file *filp)
{
MOD_INC_USE_COUNT;
DPRINTK("open\n");
return 0;
}
static int s3c2410_DbLed_release(struct inode *inode, struct file *fllp)
{
MOD_DEC_USE_COUNT;
DPRINTK("release\n");
return 0;
}
static struct file_operations s3c2410_fops = {
owner: THIS_MODULE,
open: s3c2410_DbLed_open,
write: s3c2410_DbLed_write,
release: s3c2410_DbLed_release,
};
#ifdef CONFIG_DEVFS_FS
static devfs_handle_t devfs_DbLed_dir, devfs_Dbledraw;
#endif
static int __init s3c2410_DbLed_init(void)
{
int ret, i;
for(i=0; i<NumberOfLed; i++)
set_gpio_ctrl(GPIO_MODE_OUT | GPIO_PULLUP_DIS | LED[i]);
//UpdateLed();
InitLed();
ret = register_chrdev(0, DEVICE_NAME, &s3c2410_fops);
if(ret < 0) {
printk(DEVICE_NAME" can't get major number\n");
return ret;
}
DbLedMajor = ret;
#ifdef CONFIG_DEVFS_FS
devfs_DbLed_dir = devfs_mk_dir(NULL, "led", NULL);
devfs_Dbledraw = devfs_register(devfs_DbLed_dir, "0", DEVFS_FL_DEFAULT,
DbLedMajor, DbLedRAW_MINOR, S_IFCHR|S_IRUSR|S_IWUSR,
&s3c2410_fops, NULL);
#endif
printk(DEVICE_NAME" initialized\n");
return 0;
}
static void __exit s3c2410_DbLed_exit(void)
{
#ifdef CONFIG_DEVFS_FS
devfs_unregister(devfs_Dbledraw);
devfs_unregister(devfs_DbLed_dir);
#endif
unregister_chrdev(DbLedMajor, DEVICE_NAME);
}
module_init(s3c2410_DbLed_init);
module_exit(s3c2410_DbLed_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Gdemb");
MODULE_DESCRIPTION("gpio(led) driver for s3c2410");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -