亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? led-edukit-s3c2410.c

?? 這是一個模塊化的K2.6的LED驅動,驅動中包含了基本上所有驅動架構的特點,新手仿照寫的話,首先可以有對2.6驅動架構的認識,也可以培養自身對代碼規范的掌握,以便寫出的代碼更具有內核的規范.
?? C
字號:
/*
* linux/derivers/led/led-edukit-s3c2410.c
* led driver for Embest EduKit II
* Copyright (C) 2005 Embest <www.embedinfo.com>
*/
#include <linux/module.h>
#include <linux/init.h>
#include <linux/sched.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/errno.h>	// error codes
#include <linux/types.h>	// size_t
#include <linux/delay.h>	// mdelay
#include <linux/proc_fs.h>
#include <asm/uaccess.h>	// to copy to/from userspace
#include <asm/hardware.h>#include <asm/arch-s3c2410/s3c2410.h>
#include <asm/leds.h>

#ifdef	LED_DEBUG	// if want to debug, define it while compile this function
#define DEBUG(str, args...)	printk("led: " str, ## args)
#else
#define DEBUG(str, args...)
#endif

#undef u32
#define u32	unsigned

static int nLedMajor = 0;						/* allow to alloc the major number for led*/
#define LED_DEVNAME "led"

#define GPF_MASK	(0xF<<4)					/* GPF4-7: LED1-LED4 */
#define GET_DATA(f) ((u8)(~f>>4))
#define SET_DATA(t, f) ( f = (~t&0x0F)<<4 )

#define LED_LOCK(u)		down(&u->lock);
#define LED_UNLOCK(u)	up(&u->lock);

#define GPF_CTL_BASE		  io_p2v(0x56000050)/* get the virtual address map to GPF */
#define S3C2410_GPFCON       (GPF_CTL_BASE + 0x0)
#define S3C2410_GPFDAT       (GPF_CTL_BASE + 0x4)
#define S3C2410_GPFUP        (GPF_CTL_BASE + 0x8)

unsigned long flags;
static char *version = "Embest EdukitII-2410 led driver version 1.0 (2005-06-18) <www.embedinfo.com>\n";

struct unit {
	struct semaphore lock;
	u32 *GPF_CON;	/* GPFCON register */
	u32 *GPF_DAT;	/* GPFDAT register */
	u32 *GPF_UP;	/* GPFUP register */
	u32 f;			/* LEDs value (bit4-7:LED1-LED4)*/
};
static struct unit led_unit = {
	.GPF_CON		= (u32 *)S3C2410_GPFCON,
	.GPF_DAT		= (u32 *)S3C2410_GPFDAT,
	.GPF_UP			= (u32 *)S3C2410_GPFUP,
	.f				= 0x00 // turn on all LEDs
};


#ifdef CONFIG_PROC_FS
static int led_proc(char *page, char **start, off_t off,
                         int count, int *eof, void *data)
{
	char *p = page;
	int len;
	struct unit led_u;
	
	len = led_u.f;
	
	p += sprintf(p, "%s\n LED1: %s LED2: %s LED3: %s LED4: %s \n", version,
				 len&(1<<4)?"ON":"OFF",
				 len&(1<<5)?"ON":"OFF",
				 len&(1<<6)?"ON":"OFF",
				 len&(1<<7)?"ON":"OFF"
		     );

	len = (p - page) - off;
	if (len < 0)
		len = 0;

	*eof = (len <= count) ? 1 : 0;
	*start = page + off;

	return len;
}
#endif


static void led_set_value(struct unit *unit, u8 val)
{
	u32 temp;

	SET_DATA(val, unit->f);
	
	temp = *unit->GPF_DAT;
	temp &= ~GPF_MASK;
	temp |= unit->f;
	*unit->GPF_DAT = temp;
	DEBUG("write to GPFDAT:0x%x.\n", temp);
}
static u8 led_get_value(struct unit *unit)
{
	u8 temp = GET_DATA(unit->f);

	return temp;
}


static int led_open(struct inode *inode, struct file *file)
{
	DEBUG("open\n");

	leds_event(led_stop);
	file->private_data = &led_unit;
	MOD_INC_USE_COUNT;

	return 0;
}

static int led_release_f(struct inode *inode, struct file *file)
{
	DEBUG("release\n");
	MOD_DEC_USE_COUNT;

	leds_event(led_start);
	return 0;
}

static ssize_t led_read(struct file *file, char *buf, size_t count, loff_t *offset)
{
	u8 temp;
	int ret;
	struct unit *unit = (struct unit *)file->private_data;

	DEBUG("read\n");
	if(count > 1)
		count = 1;
	LED_LOCK(unit);
	temp = led_get_value(unit);
	DEBUG("Read from unit value field:0x%x.\n", temp);
	ret = copy_to_user(buf, &temp, count) ? -EFAULT : count;
	LED_UNLOCK(unit);

	return ret;
}

static ssize_t led_write(struct file *file, const char *buf, size_t count, loff_t *offset)
{
	u8 temp;
	int ret;
	char *tmp;
	struct unit *unit = (struct unit *)file->private_data;

	DEBUG("write\n");
	
	if(count > 1)
		count = 1;
	LED_LOCK(unit);
	ret = copy_from_user(&temp, buf, count) ? -EFAULT : count;
	DEBUG("led0 writing %d bytes:0x%x.\n", ret,temp);
	if(ret)
		led_set_value(unit, temp);
	
	LED_UNLOCK(unit);

	return ret;
}


static struct file_operations led_ops = {
	owner:		THIS_MODULE,
	read:		led_read,
	write:		led_write,
	open:		led_open,
	release:	led_release_f,
};


/*
* led device init
*/
static void __init led_init(struct unit *unit)
{
	u32 temp;

	/* init device lock */
	init_MUTEX(&unit->lock);

	/* init io port */
	temp = *unit->GPF_CON;
	temp &= ~(0xF<<4);
	temp |= ((1<<14) | (1<<12) | (1<<10) | (1<<8));// GPF4,5,6,7 as Output
	*unit->GPF_CON = temp;

	temp = *unit->GPF_UP;
	temp |= (0xF<<8);// pull up all GPF4,5,6,7
	*unit->GPF_UP = temp;
	
	/* init data and turn on led, bit0-3:LED1-4*/
	led_set_value(unit, 0x0f);

	/* delay some time */
	mdelay(100);

	/* turn off led */
	led_set_value(unit, 0x00);
}


/*
* module init
*/
static devfs_handle_t devfs_handle,devfs_led_dir;
#ifdef MODULE
int init_module(void)
#else
int __init led_init_module(void)
#endif
{
	int res;

	DEBUG("init_module\n");
	/* print version information */
	printk(KERN_INFO "%s", version);

	/* register led device, character device: /proc/devices*/
#ifdef CONFIG_DEVFS_FS
	res = devfs_register_chrdev(0, LED_DEVNAME, &led_ops);
	if(res < 0) {
		printk("led-edukit-s3c2410.o: unable to get major for led device.\n");
		return res;
	}

	/* create the devfs: /driver/led/0 */
	devfs_led_dir = devfs_mk_dir(NULL, LED_DEVNAME, NULL);
	devfs_handle = devfs_register(devfs_led_dir, "0", DEVFS_FL_DEFAULT,
				      res, 0,S_IFCHR | S_IRUSR | S_IWUSR,&led_ops, NULL);   
#else
	res = register_chrdev(nLedMajor, LED_DEVNAME, &led_ops);
#endif

	/* add a profile to /proc/driver/led */
#ifdef CONFIG_PROC_FS
	create_proc_read_entry ("driver/led", 0, 0, led_proc, NULL);
#endif

	/* get the major number */
	if( nLedMajor == 0 )
	{
		nLedMajor = res;
		printk("Led major number = %d\n",nLedMajor);
	}

	/* then call led_init() */
	led_init(&led_unit);

	return 0;
}


/*
* module cleanup
*/
#ifdef MODULE
void cleanup_module(void)
#else
void __exit led_cleanup(void)
#endif
{
	int res;

	DEBUG("cleanup\n");
	/* unregister led device */
	res = unregister_chrdev(nLedMajor, LED_DEVNAME);
	if(res < 0)
		printk("led-edukit-s3c2410.o: unable to release major %d for led device.\n", nLedMajor);

#ifdef CONFIG_DEVFS_FS	
	devfs_unregister(devfs_handle);
	devfs_unregister(devfs_led_dir);
#endif	

	/* remove the profile /proc/driver/led */
#ifdef CONFIG_PROC_FS
	remove_proc_entry("driver/led", NULL);
#endif	
}

#ifndef MODULE
/* declare a module init entry */
module_init(led_init_module);
/* declare a module exit entry */
module_exit(led_cleanup);
#endif

MODULE_DESCRIPTION("EduKitII-2410 led driver");
MODULE_AUTHOR("Embest tech&info Co.,Ltd. <www.embedinfo.com>");
MODULE_LICENSE("GPL");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人免费在线视频观看| 国产精品99久久久久久有的能看 | 奇米亚洲午夜久久精品| 中文字幕在线视频一区| 国产欧美日韩在线看| wwwwww.欧美系列| 亚洲精品一区在线观看| 日韩欧美区一区二| 久久久午夜电影| 国产精品拍天天在线| 国产精品进线69影院| 日韩三级高清在线| 久久先锋资源网| 中文字幕日韩一区| 亚洲国产另类精品专区| 天使萌一区二区三区免费观看| 日韩和的一区二区| 精品一区二区三区欧美| 国产九色sp调教91| av在线不卡观看免费观看| 91免费观看国产| 91精品在线免费观看| 久久久影视传媒| 一区二区视频在线| 免费视频最近日韩| 成人av电影在线播放| 在线免费不卡电影| 日韩午夜在线观看| 国产精品久久毛片a| 亚洲男人的天堂在线观看| 亚洲123区在线观看| 国产毛片精品国产一区二区三区| 不卡视频免费播放| 欧美精品vⅰdeose4hd| 久久综合九色综合97婷婷| 最近日韩中文字幕| 老司机一区二区| 欧美做爰猛烈大尺度电影无法无天| 欧美一区二区在线免费观看| 国产欧美一区二区精品久导航| 亚洲一级二级三级| 国产电影精品久久禁18| 欧美日本一道本| 亚洲欧美影音先锋| 精品一区二区久久| 欧美午夜一区二区三区免费大片| 国产亚洲精品aa| 亚洲一区二区欧美激情| 国产91精品欧美| 日韩午夜在线观看视频| 亚洲国产日韩a在线播放性色| 成人永久aaa| 精品av久久707| 午夜视频在线观看一区二区| 99国产精品国产精品毛片| 欧美精品粉嫩高潮一区二区| 99在线精品一区二区三区| 欧美精品一区二区蜜臀亚洲| 日韩欧美123| 91精品国产全国免费观看| 国产亚洲制服色| 亚洲国产日韩一级| 不卡一区二区中文字幕| 精品欧美一区二区三区精品久久| 久久综合狠狠综合| 美日韩黄色大片| 欧美一区二区在线播放| 亚洲视频一区二区免费在线观看| 国产a精品视频| 色综合久久天天| 久久精品日产第一区二区三区高清版| 青青草原综合久久大伊人精品| 91精品1区2区| 国产精品成人一区二区艾草 | 日韩一区二区精品在线观看| 一区二区三区中文字幕电影| 91免费视频观看| 欧美成人女星排行榜| 男女男精品视频| 在线不卡免费av| 麻豆91小视频| 日韩丝袜美女视频| 日本在线不卡一区| 国产精品综合二区| 日韩女优毛片在线| 一区二区三区四区中文字幕| 另类小说视频一区二区| 日韩一区二区免费电影| 精品夜夜嗨av一区二区三区| 26uuu国产电影一区二区| 国产在线国偷精品产拍免费yy | 欧美高清视频一二三区| 日韩在线观看一区二区| 欧美日韩免费观看一区二区三区| 日韩码欧中文字| 国产精品自拍一区| 久久久777精品电影网影网| 国产a精品视频| 亚洲欧美日韩一区| 色嗨嗨av一区二区三区| 欧美日韩你懂得| 精品精品欲导航| 亚洲国产欧美另类丝袜| 成人免费高清在线观看| 色狠狠色噜噜噜综合网| 美女爽到高潮91| 久久影院午夜片一区| 91啪在线观看| 视频一区免费在线观看| 国内精品第一页| 91国模大尺度私拍在线视频| 制服丝袜国产精品| 亚洲欧美日韩综合aⅴ视频| 欧美人伦禁忌dvd放荡欲情| 日韩高清在线电影| 99久久精品费精品国产一区二区| 午夜精品久久久久影视| 久久嫩草精品久久久精品一| 国产精品视频第一区| 欧美日韩国产小视频| 日韩一级黄色片| 久久av资源站| 亚洲一区二区三区中文字幕| 成人欧美一区二区三区在线播放| 欧美一级理论性理论a| 风流少妇一区二区| 高清国产午夜精品久久久久久| 天天爽夜夜爽夜夜爽精品视频| 日韩精品一区二区三区蜜臀 | 久久精品国产秦先生| 亚洲人成小说网站色在线| 欧美麻豆精品久久久久久| 日韩av在线免费观看不卡| 欧美精品一区二区久久久| 91久久人澡人人添人人爽欧美| 免费看日韩精品| 国产精品综合二区| 综合欧美一区二区三区| 久久久久久毛片| 91精品国产手机| 欧美性猛交xxxx乱大交退制版| 99在线精品观看| 成人永久aaa| 亚洲黄一区二区三区| 欧美日韩国产精选| 国产精品毛片高清在线完整版 | 色8久久人人97超碰香蕉987| 激情图片小说一区| 欧美精品在线观看播放| 成人高清av在线| 91香蕉视频污| 日韩视频免费观看高清完整版在线观看 | 精品在线观看视频| 国产精品久久网站| 国产精品视频麻豆| 国产午夜亚洲精品午夜鲁丝片 | 国产精品不卡在线观看| 2019国产精品| 久久无码av三级| 久久国产成人午夜av影院| 亚洲成av人片一区二区三区| 亚洲午夜av在线| 天天色天天操综合| 奇米影视一区二区三区小说| 欧美人成免费网站| 日韩欧美高清一区| 欧美成人精精品一区二区频| 国产专区欧美精品| 丰满白嫩尤物一区二区| 国产亚洲精品7777| 在线不卡欧美精品一区二区三区| 欧美一级二级三级乱码| 日韩欧美一区二区三区在线| 色综合久久久久久久| 欧美视频你懂的| 日韩欧美一区二区久久婷婷| 久久精品人人做人人爽97| 国产精品乱子久久久久| 一区二区久久久久久| 五月婷婷综合激情| 精品系列免费在线观看| 成人黄页在线观看| 欧美中文字幕亚洲一区二区va在线| 欧美日韩一区二区三区在线| 日韩三级视频在线观看| 亚洲国产高清不卡| 亚洲综合色丁香婷婷六月图片| 天堂久久久久va久久久久| 国内成人精品2018免费看| av色综合久久天堂av综合| 欧美精品v国产精品v日韩精品| 精品国产3级a| 亚洲特黄一级片| 麻豆91在线播放| 国产91精品露脸国语对白| 日韩电影在线一区二区| 成人午夜激情在线| 欧美精品久久久久久久久老牛影院| 国产日韩v精品一区二区| 亚洲一区二区三区免费视频|