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

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

?? led_struct_driver.c

?? 此代碼為上傳的源碼為ARM9 s3c2410的鍵盤驅動,讀者可編應用程序進行測試
?? C
字號:
#include <linux/module.h>
#include <linux/moduleparam.h>
//包含有可裝載模塊需要的大量符合和函數的定義;
#include <linux/init.h>
//指定初始化和清除函數;
//
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/cdev.h>
#include <linux/config.h>
#include <linux/kernel.h>
#include <asm/delay.h>
#include <asm/uaccess.h>
#include <linux/sched.h>

#include <asm/hardware.h>
#include <asm/arch/regs-gpio.h>

#include <linux/delay.h>

//定義設備名稱
#define DEVICE_NAME "s3c2410_led"

void LedDisp(int led);
static void led_init(void);
//定義主次設備號
static unsigned int LedMajor=0;
static unsigned int LedMinor=0;

module_param(LedMajor,int, 0);
module_param( LedMinor,int, 0);

struct led_dev {
	unsigned int led_gpio[4]; /* gpio used for led */
	int led_status[4];       /* led stauts */
	struct semaphore sem;     /* mutual exclusion semaphore     */	struct cdev cdev;	  /* Char device structure		*/};

struct led_dev * s3c2410_led;	/* allocated in init_module */



//定義與綁定tasklet函數void led_tasklet_action(unsigned long t);DECLARE_TASKLET(led_tasklet, led_tasklet_action, 0);void led_tasklet_action(unsigned long t){	int i,j;
	printk("<1>led taskled action\n");
	for(i = 0; i < 10; i++){
		for(j = 0; j < 4; j++ ) {
			LedDisp(j);
			mdelay(100); 
		}
	}
	led_init();
}

static void led_timer_handler(unsigned long data)
{
	printk("<1>Update Led status!\n");
	led_tasklet_action(data);
}
static struct timer_list s3c2410_led_timer = {
	.function = led_timer_handler,
};
void LedDisp(int led){
	//int tmp;
	printk ("<1>led dslp led = %d\n",led);
	if(0==led){
		s3c2410_gpio_setpin(S3C2410_GPF4,1);
		s3c2410_gpio_setpin(S3C2410_GPF5,1);
		s3c2410_gpio_setpin(S3C2410_GPF6,1);
		s3c2410_gpio_setpin(S3C2410_GPF7,1);		
	}
	else if(led==1)
	{
		s3c2410_gpio_setpin(S3C2410_GPF4,0);
		s3c2410_gpio_setpin(S3C2410_GPF5,1);
		s3c2410_gpio_setpin(S3C2410_GPF6,1);
		s3c2410_gpio_setpin(S3C2410_GPF7,1);
		
	//	printk("1 GPF4DAT = 0x%lx\n", s3c2410_gpio_getpin(S3C2410_GPF4));
	}
	else if(led==2)
	{
		s3c2410_gpio_setpin(S3C2410_GPF4,1);
		s3c2410_gpio_setpin(S3C2410_GPF5,0);
		s3c2410_gpio_setpin(S3C2410_GPF6,1);
		s3c2410_gpio_setpin(S3C2410_GPF7,1);
		
	//	printk("1 GPF5DAT = 0x%lx\n", s3c2410_gpio_getpin(S3C2410_GPF5));
	}
	else if(led==3)
	{
		s3c2410_gpio_setpin(S3C2410_GPF4,1);
		s3c2410_gpio_setpin(S3C2410_GPF5,1);
		s3c2410_gpio_setpin(S3C2410_GPF6,0);
		s3c2410_gpio_setpin(S3C2410_GPF7,1);
		
	//	printk("1 GPF6DAT = 0x%lx\n", s3c2410_gpio_getpin(S3C2410_GPF6));
	}
	else if(led==4)
	{
		s3c2410_gpio_setpin(S3C2410_GPF4,1);
		s3c2410_gpio_setpin(S3C2410_GPF5,1);
		s3c2410_gpio_setpin(S3C2410_GPF6,1);
		s3c2410_gpio_setpin(S3C2410_GPF7,0);
		
	//	printk("1 GPF7DAT = 0x%lx\n", s3c2410_gpio_getpin(S3C2410_GPF7));
	}
	printk("<1>...");
}

static void led_init(void)
{
	int i;
	for (i = 0; i < 4; i++) {
		s3c2410_led->led_status[i] = 1;
		s3c2410_gpio_setpin(s3c2410_led->led_gpio[i],s3c2410_led->led_status[i]);	
	}	
}
static void UpdateLed(void)
{
	int i;
	for (i = 0; i < 4; i++) {
		s3c2410_gpio_setpin(s3c2410_led->led_gpio[i],s3c2410_led->led_status[i]);	
	}
}

static int s3c2410_led_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)
{
	struct led_dev *dev ;
	
	printk("led- ioctl: param %u %lu\n", cmd, arg);

	dev = filp->private_data;
	
	switch(cmd)
	{
		case 1: 
		case 2: 
		case 3: 
		case 4: 
			led_init();
			dev->led_status[cmd -1] = arg;
			UpdateLed( );
			break;
		case 5: 
			tasklet_schedule(&led_tasklet);
			break;
		case 6:
			init_timer(&s3c2410_led_timer);
			s3c2410_led_timer.function = led_timer_handler;
			s3c2410_led_timer.expires = jiffies + HZ;
			add_timer(&s3c2410_led_timer);
		default :break;	
	}
	return 0;
}

static ssize_t s3c2410_led_write(struct file *filp, const char *buffer, size_t count, loff_t *ppos)
{

//	int led_status = 0;
	struct led_dev *dev ;
	dev = filp->private_data;
	ssize_t retval = -ENOMEM; /* value used in "goto out" statements */	
	if(down_interruptible(&s3c2410_led->sem)) 
		return -ERESTARTSYS;
	
	//copy_from_user(s3c2410_led->led_status, buffer, sizeof(s3c2410_led->led_status));
	if (copy_from_user(dev->led_status, buffer, sizeof(s3c2410_led->led_status))) {
		retval = -EFAULT;		goto out;	}	
	UpdateLed( );
	retval = sizeof(s3c2410_led->led_status);
out:	
	up(&s3c2410_led->sem);
	return retval;
}


static int s3c2410_led_open(struct inode *inode, struct file *filp)
{
/*
	unsigned m = iminor(inode);
 	if (m > 63)
 		return -EINVAL;
*/	
 	printk("<1>LED driver opened!\n");

	struct led_dev *dev; /* device information */
	dev = container_of(inode->i_cdev, struct led_dev, cdev);
	filp->private_data = dev; /* for other methods */	return 0;          // success 
//	return nonseekable_open(inode, file);
}

static int s3c2410_led_release(struct inode *inode, struct file *file)
{
 	printk("LED driver released!\n");
 	return 0;
}

static struct file_operations s3c2410_fops = {
//	owner:	THIS_MODULE,
	open:	s3c2410_led_open,
	ioctl:	s3c2410_led_ioctl,
	write:	s3c2410_led_write,
	release: s3c2410_led_release,
};

static void led_hardware_init(void)
{
	s3c2410_gpio_cfgpin(S3C2410_GPF4,S3C2410_GPF4_OUTP);
	s3c2410_gpio_pullup(S3C2410_GPF4,1);
	s3c2410_gpio_setpin(S3C2410_GPF4,1);
	s3c2410_gpio_cfgpin(S3C2410_GPF5,S3C2410_GPF5_OUTP);
	s3c2410_gpio_pullup(S3C2410_GPF5,1);
	s3c2410_gpio_setpin(S3C2410_GPF5,1);
	s3c2410_gpio_cfgpin(S3C2410_GPF6,S3C2410_GPF6_OUTP);
	s3c2410_gpio_pullup(S3C2410_GPF6,1);
	s3c2410_gpio_setpin(S3C2410_GPF6,1);
	s3c2410_gpio_cfgpin(S3C2410_GPF7,S3C2410_GPF7_OUTP);
	s3c2410_gpio_pullup(S3C2410_GPF7,1);
	s3c2410_gpio_setpin(S3C2410_GPF7,1);
}

/* 模塊卸載函數 */
static void s3c2410_led_exit(void)
{
	/* Get rid of our char dev entries */
	if (s3c2410_led) {
		cdev_del(&s3c2410_led->cdev);
		kfree(s3c2410_led);
	}
	
	unregister_chrdev_region(MKDEV(LedMajor,LedMinor),1);
	//cdev_del(led_cdev);
/*
#ifdef CONFIG_DEVFS_FS
	devfs_remove(DEVICE_NAME);
#endif
*/
}

static int __init s3c2410_led_init(void)
{
	int result = 0;
/*分配設備編號*/
	dev_t dev;
	if(LedMajor)
	{
		dev=MKDEV(LedMajor,LedMinor);//創建設備編號
		result=register_chrdev_region(dev,1,DEVICE_NAME);
	} else {
		result=alloc_chrdev_region(&dev,LedMinor,1,DEVICE_NAME);
		LedMajor=MAJOR(dev);
	}
	if(result<0)
	{
		printk(KERN_WARNING"LED: cannot get major %d \n",LedMajor);
		return result;
	}

        /* 	 * allocate the devices -- we can't have them static, as the number	 * can be specified at load time	 */
	 //led_dev_struct_init( );
	s3c2410_led = kmalloc(sizeof(struct led_dev), GFP_KERNEL);
	if (!s3c2410_led) {
		result = -ENOMEM;		goto fail;  /* Make this more graceful */	}	memset(s3c2410_led, 0, sizeof(struct led_dev));

	s3c2410_led->led_gpio[0] = S3C2410_GPF4;
	s3c2410_led->led_gpio[1] = S3C2410_GPF5;
	s3c2410_led->led_gpio[2] = S3C2410_GPF6;
	s3c2410_led->led_gpio[3] = S3C2410_GPF7;
	
	int i;
	for(i = 0; i < 4; i++) {
		s3c2410_led->led_status[i]= 1;
	}
       /* Initialize  device. */	init_MUTEX(&s3c2410_led->sem);

	/* 注冊字符設備 */
	//s3c2410_led->cdev = cdev_alloc();
	cdev_init(&s3c2410_led->cdev,&s3c2410_fops);
	//s3c2410_led->cdev->ops=&s3c2410_fops;
	s3c2410_led->cdev.owner=THIS_MODULE;
	result=cdev_add(&s3c2410_led->cdev,dev,1);
	if(result) {
		printk("<1>Error %d while register led device!\n",result);
		goto fail;
	}
	/*init led hardware*/
	led_hardware_init( );
/*	
#ifdef CONFIG_DEVFS_FS
	devfs_mk_cdev(MKDEV(LedMajor,LedMinor),S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP,DEVICE_NAME);
#endif
*/
	return result;
fail:
	s3c2410_led_exit();
	return result;

}

module_init(s3c2410_led_init);
module_exit(s3c2410_led_exit);
EXPORT_SYMBOL(LedDisp);MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("Teacher liang");
MODULE_DESCRIPTION("s3c2410 led driver!");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本欧美一区二区| 欧美吻胸吃奶大尺度电影| av亚洲精华国产精华精| 欧美日韩第一区日日骚| 欧美国产日韩a欧美在线观看| 亚洲chinese男男1069| 国产91丝袜在线观看| 91精品欧美久久久久久动漫 | 亚洲男同性恋视频| 国产在线精品一区二区不卡了| 在线视频观看一区| 国产精品久久久久天堂| 国产一区二区三区香蕉| 欧美一级免费大片| 亚洲精品免费看| 成人国产亚洲欧美成人综合网| 欧美不卡激情三级在线观看| 亚洲成av人片在线| 欧美丝袜第三区| 亚洲最新视频在线观看| fc2成人免费人成在线观看播放| 中文子幕无线码一区tr| 国产麻豆视频一区| 久久亚洲免费视频| 精品无人区卡一卡二卡三乱码免费卡 | 欧美一级日韩不卡播放免费| 亚洲综合在线五月| 在线免费观看一区| 亚洲私人黄色宅男| 91在线国产福利| 亚洲少妇中出一区| 91久久免费观看| 亚洲激情综合网| 欧美私模裸体表演在线观看| 亚洲国产aⅴ天堂久久| 色婷婷av久久久久久久| 亚洲综合在线第一页| 色网站国产精品| 亚洲国产中文字幕在线视频综合| 欧美亚洲综合一区| 日韩国产欧美一区二区三区| 日韩欧美亚洲国产另类| 九九视频精品免费| 国产清纯在线一区二区www| 成人18视频日本| 亚洲欧美日韩国产另类专区| 在线免费观看不卡av| 五月婷婷欧美视频| 久久综合久久鬼色| 白白色 亚洲乱淫| 亚洲国产精品一区二区www在线| 欧美日韩国产中文| 精品一区二区三区不卡| 国产精品国产三级国产普通话蜜臀| 99久久精品国产观看| 亚洲成人午夜影院| 久久人人爽爽爽人久久久| 成人av在线一区二区| 亚洲成人你懂的| 久久久久国产精品免费免费搜索| av成人动漫在线观看| 天堂资源在线中文精品| www久久久久| 欧美在线一二三| 久久99国产精品麻豆| 亚洲视频香蕉人妖| 日韩精品资源二区在线| 99精品国产视频| 美女视频网站黄色亚洲| 亚洲欧洲日韩av| 日韩美女视频在线| 91福利视频网站| 国产又粗又猛又爽又黄91精品| 亚洲免费色视频| 久久久亚洲午夜电影| 91福利小视频| 高清久久久久久| 偷窥国产亚洲免费视频| 国产精品国产三级国产专播品爱网 | 成人欧美一区二区三区白人| 欧美另类变人与禽xxxxx| 成人性生交大片免费看视频在线| 亚洲成人一区二区| 亚洲欧美综合另类在线卡通| 精品久久久久久久久久久久久久久久久 | 成人性色生活片免费看爆迷你毛片| 一区二区三区欧美日| 国产亚洲综合性久久久影院| 91精品国产一区二区| 在线视频国产一区| zzijzzij亚洲日本少妇熟睡| 国内精品伊人久久久久av影院| 亚洲图片一区二区| 亚洲天堂福利av| 国产精品毛片无遮挡高清| 欧美变态口味重另类| 欧美区视频在线观看| 91搞黄在线观看| 97久久超碰国产精品| 成人av综合一区| 成人精品小蝌蚪| 懂色av一区二区三区免费看| 久88久久88久久久| 久久精品国产澳门| 日韩1区2区3区| 日本成人中文字幕在线视频| 视频一区二区欧美| 日本女人一区二区三区| 日韩精品欧美精品| 日日夜夜一区二区| 丝袜脚交一区二区| 视频在线在亚洲| 日韩精品成人一区二区三区| 午夜精品久久久久久久久| 亚洲va韩国va欧美va精品| 亚洲成人福利片| 日韩高清不卡在线| 免费高清不卡av| 狠狠色丁香九九婷婷综合五月 | 玉足女爽爽91| 亚洲影院久久精品| 日韩精品亚洲一区二区三区免费| 亚洲成a人片在线不卡一二三区| 一级做a爱片久久| 亚洲国产成人av网| 日韩精品国产精品| 精品一区二区综合| 国产69精品一区二区亚洲孕妇| 成人三级伦理片| 91丨九色丨国产丨porny| 在线看国产日韩| 555www色欧美视频| 久久综合色播五月| 中文字幕第一页久久| 亚洲制服欧美中文字幕中文字幕| 午夜视频一区二区| 精品中文av资源站在线观看| 国产精品一色哟哟哟| 91亚洲国产成人精品一区二区三| 在线视频欧美精品| 日韩美女视频在线| 国产精品免费免费| 天堂午夜影视日韩欧美一区二区| 韩国一区二区视频| 91小视频免费看| 制服丝袜激情欧洲亚洲| 国产欧美日韩综合| 亚洲超碰精品一区二区| 狠狠色丁香久久婷婷综| 91麻豆免费观看| 欧美不卡一区二区三区| 中文字幕成人网| 日产国产高清一区二区三区 | 色婷婷久久久亚洲一区二区三区 | 97超碰欧美中文字幕| 欧美疯狂性受xxxxx喷水图片| 亚洲精品在线三区| 夜夜亚洲天天久久| 国产不卡视频在线观看| 欧美三级资源在线| 国产精品卡一卡二| 久久国产精品第一页| 色8久久人人97超碰香蕉987| 26uuu精品一区二区| 亚洲午夜激情网页| 成年人国产精品| 久久综合av免费| 午夜欧美2019年伦理 | 韩国欧美国产一区| 欧美日韩国产综合一区二区| 中文字幕乱码亚洲精品一区| 日韩成人精品在线观看| 91福利视频在线| 亚洲欧洲综合另类在线| 国产盗摄视频一区二区三区| 在线播放91灌醉迷j高跟美女 | 婷婷开心激情综合| 91小视频在线免费看| 国产欧美精品日韩区二区麻豆天美| 日韩精品免费专区| 欧美三级日韩在线| 亚洲乱码国产乱码精品精可以看 | 欧美高清在线精品一区| 另类小说色综合网站| 欧美剧在线免费观看网站| 玉米视频成人免费看| 99re66热这里只有精品3直播| 国产欧美一区二区精品性色| 麻豆精品精品国产自在97香蕉| 欧美日韩一区二区三区四区 | 国产精品一区2区| 精品少妇一区二区三区在线播放| 亚洲成精国产精品女| 欧洲激情一区二区| 夜夜精品浪潮av一区二区三区| av电影一区二区| 亚洲欧美色图小说| 欧美在线三级电影| 亚洲国产精品久久久男人的天堂| 91美女在线观看|