⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 s3c2410-double-led.c

📁 嵌入式linux 设备驱动程序
💻 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 + -