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

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

?? s3c2410_pwm.c

?? SMDK2410內部的PWM驅動程序和測試程序!
?? C
字號:
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/ioport.h>
#include <linux/miscdevice.h> 
#include <linux/sched.h> 
#include <linux/delay.h> 
#include <linux/poll.h> 
#include <linux/spinlock.h> 
#include <linux/delay.h> 
#include <linux/wait.h>

#include <linux/device.h> 
#include <linux/devfs_fs_kernel.h> 
#include <linux/types.h> 
#include <linux/cdev.h> 
#include <linux/errno.h> 
#include <asm/uaccess.h> 
#include <asm/hardware.h>
#include <asm/io.h>
#include <asm/arch/regs-mem.h>
#include <asm/arch/regs-gpio.h>
#include <asm/arch-s3c2410/regs-timer.h>
#include "s3c2410_pwm.h"

#define DEVICE_NAME			"pwm" 

static int pwm_major = 0;

static int pwm_set_prescaler(struct PWM_CHANNEL *pwm)
{
	writel( (readl(S3C2410_TCFG0)&0xffffff00) + (pwm->prescaler0&0xFF) ,S3C2410_TCFG0 );	
	return 0;
}

static int pwm_set_channel(unsigned char channel,struct PWM_CHANNEL *pwm)
{	
	unsigned long tmp;
	unsigned long tmp1;

	switch(channel)
	{
		case 0:
			pwm_set_prescaler(pwm);
			tmp = readl(S3C2410_TCFG1); 
			tmp = (tmp & (~(0x0F<<0))) | ((pwm->div_clock&0x000F)<<0);
			writel(tmp, S3C2410_TCFG1);
			writel((pwm->tcntb_reg&0xFFFF), S3C2410_TCNTB(channel));
			writel((pwm->tcmpb_reg&0xFFFF), S3C2410_TCMPB(channel));
			
			tmp = readl(S3C2410_TCON) | S3C2410_TCON_T0RELOAD | S3C2410_TCON_T0MANUALUPD;
			tmp1 = (readl(S3C2410_TCON) | S3C2410_TCON_T0RELOAD) & (~S3C2410_TCON_T0MANUALUPD);
			writel(tmp, S3C2410_TCON);

			if(pwm->off)
				writel(tmp1&(~S3C2410_TCON_T0START), S3C2410_TCON);	
			else
				writel(tmp1 | S3C2410_TCON_T0START, S3C2410_TCON);			
			break;
	
		case 1:
			pwm_set_prescaler(pwm);
			tmp = readl(S3C2410_TCFG1);
			tmp = (tmp & (~(0x0F<<4))) | ((pwm->div_clock&0x000F)<<4);
			writel(tmp, S3C2410_TCFG1);
			writel((pwm->tcntb_reg&0xFFFF), S3C2410_TCNTB(channel));
			writel((pwm->tcmpb_reg&0xFFFF), S3C2410_TCMPB(channel));
			
			tmp = readl(S3C2410_TCON) | S3C2410_TCON_T1RELOAD | S3C2410_TCON_T1MANUALUPD;
			tmp1 = (readl(S3C2410_TCON) | S3C2410_TCON_T1RELOAD) & (~S3C2410_TCON_T1MANUALUPD);
			writel(tmp, S3C2410_TCON);
			
			if(pwm->off)
				writel(tmp1 & (~S3C2410_TCON_T1START), S3C2410_TCON);	
			else
				writel(tmp1 | S3C2410_TCON_T1START, S3C2410_TCON);				
			break;
		case 2:
			tmp = readl(S3C2410_TCFG1);
			tmp = (tmp & (~(0x0F<<8))) | ((pwm->div_clock&0x000F)<<8);
			writel(tmp, S3C2410_TCFG1);
			writel(pwm->tcntb_reg&0xFFFF, S3C2410_TCNTB(channel));
			writel(pwm->tcmpb_reg&0xFFFF, S3C2410_TCMPB(channel));
			
			tmp = readl(S3C2410_TCON) | S3C2410_TCON_T2RELOAD | S3C2410_TCON_T2MANUALUPD;
			tmp1 = (readl(S3C2410_TCON) | S3C2410_TCON_T2RELOAD) & (~S3C2410_TCON_T2MANUALUPD);
			writel(tmp, S3C2410_TCON);
			
			if(pwm->off)
				writel(tmp1 & (~S3C2410_TCON_T2START), S3C2410_TCON);	
			else
				writel(tmp1 | S3C2410_TCON_T2START, S3C2410_TCON);				
			break;		
		case 3:
			tmp = readl(S3C2410_TCFG1);
			tmp = (tmp & (~(0x0F<<12))) | ((pwm->div_clock&0x000F)<<12);
			writel(tmp, S3C2410_TCFG1);
			writel(pwm->tcntb_reg&0xFFFF, S3C2410_TCNTB(channel));
			writel(pwm->tcmpb_reg&0xFFFF, S3C2410_TCMPB(channel));
			
			tmp = readl(S3C2410_TCON) | S3C2410_TCON_T3RELOAD | S3C2410_TCON_T3MANUALUPD;
			tmp1 = (readl(S3C2410_TCON) | S3C2410_TCON_T3RELOAD) & (~S3C2410_TCON_T3MANUALUPD);
			writel(tmp, S3C2410_TCON);
			
			if(pwm->off)
				writel(tmp1 & (~S3C2410_TCON_T3START), S3C2410_TCON);	
			else
				writel(tmp1 | S3C2410_TCON_T3START, S3C2410_TCON);				
			break;	
			
		default:
			break;
	}
	return 0;
}

static int pwm_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
	struct PWM_CHANNEL pwm;

	switch(cmd)
	{
		case PWM_CHANNEL_0:
		case PWM_CHANNEL_1:
		case PWM_CHANNEL_2:
		case PWM_CHANNEL_3:
			if(copy_from_user(&pwm,(struct PWM_CHANNEL *)arg,sizeof(struct PWM_CHANNEL))) 
	    		return -EFAULT;	
			pwm_set_channel(cmd,&pwm);
			break;
		default:
			return -EFAULT;	
	}
	return 0;
}

static int pwm_open(struct inode * inode, struct file * filp)
{
	return 0;
}

static int pwm_release(struct inode * inode, struct file * filp)
{
	return 0;
}

static struct file_operations pwm_fops = { 
	.owner = THIS_MODULE, 
	.ioctl = pwm_ioctl, 
	.open  = pwm_open,
	.release=pwm_release,
}; 

static int __init pwm_init(void)
{
	int ret;
	
	ret = register_chrdev(0,DEVICE_NAME,&pwm_fops);
  	if(ret < 0) 
	{
		printk("pwm: can't get major number\n");
       	return ret;
	}
	pwm_major = ret;

#ifdef CONFIG_DEVFS_FS   
    ret = devfs_mk_cdev(MKDEV(pwm_major,0),  S_IFCHR | S_IRUGO | S_IWUSR,DEVICE_NAME);
	if(ret)
	{
		unregister_chrdev(pwm_major,DEVICE_NAME); 
		printk("pwm: can't make char device fo devfs\n");
		return ret;
	}
#endif

	s3c2410_gpio_cfgpin(S3C2410_GPB0,S3C2410_GPB0_TOUT0); 
	s3c2410_gpio_cfgpin(S3C2410_GPB1,S3C2410_GPB1_TOUT1); 
    printk("s3c2410_pwm driver initial\n");
    
	return 0;
}

static void __exit pwm_exit(void)
{
#ifdef CONFIG_DEVFS_FS
	devfs_remove(DEVICE_NAME);
#endif  
	unregister_chrdev(pwm_major,DEVICE_NAME); 
    printk("s3c2410_pwm driver removed\n"); 
}

module_init(pwm_init);
module_exit(pwm_exit);

MODULE_ALIAS("pwm"); 
MODULE_DESCRIPTION("PWM IO Driver For EM104-MINI2410");
MODULE_AUTHOR("FENG");
MODULE_LICENSE("GPL");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本乱人伦aⅴ精品| 免费成人在线观看| 国产日韩欧美制服另类| 欧美一区二区人人喊爽| 91国产丝袜在线播放| 成人avav影音| 99精品在线观看视频| 99国产精品国产精品久久| 成人免费的视频| 93久久精品日日躁夜夜躁欧美| 成人免费视频视频在线观看免费| 国产成人综合在线| 99久久精品国产导航| 在线观看视频91| 这里只有精品电影| 精品国产污网站| 欧美国产成人精品| 亚洲免费av在线| 视频一区二区三区在线| 久久精品国产精品亚洲精品| 国产精品原创巨作av| 99久久99久久精品免费观看| 欧洲一区在线观看| 欧美电影在线免费观看| 26uuu久久天堂性欧美| 国产精品热久久久久夜色精品三区| 国产精品乱码人人做人人爱 | 日韩欧美国产三级电影视频| 日韩欧美不卡在线观看视频| 久久夜色精品国产噜噜av| 国产精品女主播av| 午夜不卡在线视频| 成人做爰69片免费看网站| 欧洲视频一区二区| 久久综合久久鬼色| 一区二区三区在线免费| 麻豆成人久久精品二区三区小说| 成人免费看片app下载| 欧美日韩一区二区欧美激情| 久久久精品黄色| 一区二区三区中文字幕| 久久国产成人午夜av影院| 成人综合在线观看| 51午夜精品国产| 日韩一区有码在线| 精品一二三四区| 在线精品视频一区二区| 久久久精品蜜桃| 日本视频一区二区| 日本乱码高清不卡字幕| 国产调教视频一区| 麻豆成人久久精品二区三区小说| 91网上在线视频| 久久一区二区三区四区| 日韩高清不卡在线| 在线亚洲高清视频| 亚洲天堂免费看| 国产999精品久久久久久绿帽| 欧美精品久久久久久久多人混战| 亚洲人成网站影音先锋播放| 国产精品自在欧美一区| 日韩欧美中文字幕一区| 午夜精品视频一区| 欧美性猛交xxxxxxxx| 综合久久给合久久狠狠狠97色 | 成人激情综合网站| 欧美成人精精品一区二区频| 亚洲小少妇裸体bbw| 99re热视频精品| 国产精品久久久久影院色老大| 国产专区欧美精品| 精品国产青草久久久久福利| 日本 国产 欧美色综合| 欧美精品一二三| 亚洲第一福利一区| 欧美日本高清视频在线观看| 亚洲一区二区精品久久av| 日本乱人伦aⅴ精品| 亚洲综合区在线| 欧美亚洲尤物久久| 婷婷亚洲久悠悠色悠在线播放| 欧美日韩中文国产| 视频一区二区中文字幕| 91精品福利在线一区二区三区| 日韩国产欧美在线观看| 欧美一级夜夜爽| 欧美午夜理伦三级在线观看| 亚洲精品高清视频在线观看| 欧美性色黄大片| 青草国产精品久久久久久| 欧美mv日韩mv国产网站| 国产精品一品二品| 中文字幕亚洲视频| 欧美日韩国产综合久久| 美女视频黄免费的久久 | 欧美精品第一页| 奇米色777欧美一区二区| 精品久久久久久最新网址| 国产suv精品一区二区6| 综合久久国产九一剧情麻豆| 欧美三级一区二区| 久久99精品国产麻豆婷婷| 国产欧美日本一区视频| 91国模大尺度私拍在线视频| 麻豆国产一区二区| 日韩理论片网站| 日韩三级免费观看| fc2成人免费人成在线观看播放| 亚洲在线视频网站| 久久色在线观看| 在线观看www91| 精品中文字幕一区二区小辣椒| 国产精品理论在线观看| 91麻豆精品国产91久久久久久久久 | 91啪在线观看| 毛片基地黄久久久久久天堂| 日本一区二区免费在线观看视频 | 91在线观看一区二区| 免费看欧美女人艹b| 一区在线播放视频| 精品伦理精品一区| 欧美影院精品一区| 国产91丝袜在线播放0| 婷婷开心激情综合| 亚洲女女做受ⅹxx高潮| 欧美mv和日韩mv的网站| 欧美性受xxxx| 成av人片一区二区| 国产一区二区精品在线观看| 亚洲电影一级黄| 国产精品乱人伦| 久久综合久久综合久久综合| 欧美日韩高清一区二区| 91在线观看成人| 成人午夜精品一区二区三区| 麻豆精品在线播放| 日韩高清一区在线| 亚洲国产精品自拍| 一区二区久久久| 最近中文字幕一区二区三区| 国产欧美一区二区在线| 久久综合给合久久狠狠狠97色69| 777久久久精品| 欧美视频一区二| 欧美性极品少妇| 欧美三级韩国三级日本一级| 色av成人天堂桃色av| 不卡视频一二三| av欧美精品.com| 93久久精品日日躁夜夜躁欧美| 成人午夜精品在线| 成人av在线播放网址| 成人少妇影院yyyy| 91香蕉视频黄| 在线视频综合导航| 欧美视频三区在线播放| 在线亚洲人成电影网站色www| 91在线porny国产在线看| av一区二区久久| 色素色在线综合| 精品婷婷伊人一区三区三| 欧美视频一区在线观看| 欧美日韩色综合| 欧美一级夜夜爽| 久久久久97国产精华液好用吗| 久久久久久一级片| 国产精品白丝在线| 一区二区三区蜜桃| 日韩高清欧美激情| 国产呦萝稀缺另类资源| 福利电影一区二区三区| 91免费视频网址| 欧美日韩的一区二区| 欧美大片一区二区三区| 中文字幕欧美三区| 一区二区三区四区蜜桃| 婷婷亚洲久悠悠色悠在线播放| 麻豆91在线播放免费| 成人性生交大片免费看视频在线 | 亚洲自拍另类综合| 另类小说欧美激情| 成人av影视在线观看| 欧美视频一二三区| 久久久综合视频| 一区二区三区精品| 久久99国内精品| 99久久777色| 欧美一区二区大片| 中文字幕在线不卡视频| 午夜一区二区三区在线观看| 久久精品国产一区二区| 99天天综合性| 欧美va在线播放| 亚洲色图在线看| 国内精品嫩模私拍在线| 在线观看一区二区视频| 日韩一区二区三区免费看 | 午夜久久久久久| 成人性生交大片免费看中文 | 麻豆精品一区二区av白丝在线|