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

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

?? i2c_ds1337.c

?? fresscale MX21 RTC實時種編程
?? C
字號:
/******************************************************************************** File name :  ds1337.c**     ** Description :**      ds1337(Real Time clock) ** Usage :**      DS1337 Device Driver file for iMX21 Platform**  ** License : **      This program is free software; you can redistribute it and/or modify**      it under the terms of the GNU General Public License version 2 as**      published by the Free Software Foundation** Note: tm_year: from 2000;*******************************************************************************/#include <linux/kernel.h>#include <linux/module.h>#include <linux/compatmac.h>#include <linux/hdreg.h>#include <linux/vmalloc.h>#include <linux/fs.h>#include <linux/module.h>#include <linux/blkpg.h>#include <linux/i2c.h>#include <linux/i2c-algo-bit.h>#include <linux/i2c-id.h>#include <linux/slab.h>#include <asm/io.h>#include <linux/mm.h>#include <linux/wrapper.h>#include <asm/dma.h>#include <linux/miscdevice.h>#include <asm/arch/mx2.h>#include <linux/rtc.h>#include <linux/init.h>#define	 UINT8	unsigned char#define  SINT32	int#define  IIC_ADDR     0xd0#define  SCL         (1 << 27)#define  SDA         (1 << 18)#define DS1337_NAME		"ds1337"#define DS1337_VERSION	"version 0.1"#define DS1337_MAJOR	251#define RTC_SEC    0x00#define RTC_MIN    0x01#define RTC_HOUR   0x02#define RTC_DAY    0x03#define RTC_DATE   0x04#define RTC_MONTH  0x05#define RTC_YEAR   0x06#define RTC_CTRL   0x0e#define RTC_STATUS 0x0fstatic unsigned char days_in_mo[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};void delay500ns(){	int i;	for(i=0;i<100;i++);}void delay1us(){	delay500ns();	delay500ns();}void delay2us(){	delay1us();	delay1us();}void delay5us(){	delay2us();	delay2us();	delay1us();}void delay8us(){	delay5us();	delay2us();	delay1us();}void delay10us(){	delay5us();	delay5us();}SINT32 set_sda_input(){	/* 	 * PE3 : SDA	 * PE4 : SCL	 */	_reg_GPIO_DDIR(GPIOC) &= ~SDA;		return 0;}SINT32 set_sda_output(){		/* 	 * PE3 : SDA	 * PE4 : SCL	 */	_reg_GPIO_DDIR(GPIOC) |= SDA;		return 0;}SINT32 set_sda_value(UINT8 flag){		/* 	 * PE3 : SDA	 * PE4 : SCL	 */	 	if(flag)		_reg_GPIO_DR(GPIOC) |= SDA;	else		_reg_GPIO_DR(GPIOC) &= ~SDA;		return 0;}SINT32 set_scl_high(){		/* 	 * PE3 : SDA	 * PE4 : SCL	 */	_reg_GPIO_DR(GPIOB) |= SCL;		return 0;}SINT32 set_scl_low(){		/* 	 * PA15 : SDA	 * PA16 : SCL	 */	_reg_GPIO_DR(GPIOB) &= ~SCL;		return 0;}/* Read sda status */UINT8 get_sda_value(){	if(_reg_GPIO_SSR(GPIOC) & SDA)		return 0x01;	else		return 0x00;}/* SCCB write */	void sccb_write(UINT8 reg, UINT8 data){	int i;	UINT8 addr;			addr = IIC_ADDR;		set_sda_value(1);	set_scl_high();		delay10us();	set_sda_value(0);    // Issue start command		/* Send ID address */	for(i=0;i<8;i++)	{		delay10us();		set_scl_low();    // First clock start			delay500ns();		set_sda_value((addr >> (7-i)) & 0x01);			delay10us();		set_scl_high();   	}		delay10us();	set_scl_low();    // The Ninth clock start		delay1us();	set_sda_input();		delay8us();	set_scl_high();   // Dont't care bit		delay10us();	set_scl_low();		delay2us();	set_sda_output();		/* Send sub address */	for(i=0;i<8;i++)	{		delay500ns();		set_sda_value((reg >> (7-i)) & 0x01);			delay10us();		set_scl_high();   				delay10us();		set_scl_low();   	}		delay1us();	set_sda_input();		delay8us();	set_scl_high();   // Dont't care bit		delay10us();	set_scl_low();		delay2us();	set_sda_output();		/* Send sub address */	for(i=0;i<8;i++)	{					delay500ns();		set_sda_value((data >> (7-i)) & 0x01);			delay10us();		set_scl_high();   				delay10us();		set_scl_low();   	}		delay1us();	set_sda_input();		delay8us();	set_scl_high();   // Dont't care bit		delay10us();	set_scl_low();		delay2us();	set_sda_output();	set_sda_value(0);		delay10us();	set_scl_high(); 		delay10us();	set_sda_value(1);  // Stop		return;}/* SCCB read */	void sccb_read(UINT8 reg, UINT8 *data){	int i;	UINT8 addr, ret;		ret = 0;	*data = 0;		/* 2-phases write */		addr = IIC_ADDR;		set_sda_value(1);	set_scl_high();		delay10us();	set_sda_value(0);    // Issue start command		/* Send ID address */	for(i=0;i<8;i++)	{		delay10us();		set_scl_low();    // First clock start			delay500ns();		set_sda_value((addr >> (7-i)) & 0x01);			delay10us();		set_scl_high();   	}		delay10us();	set_scl_low();    // The Ninth clock start		delay1us();	set_sda_input();		delay8us();	set_scl_high();   // Dont't care bit		delay10us();	set_scl_low();		delay2us();	set_sda_output();		/* Send sub address */	for(i=0;i<8;i++)	{		delay500ns();		set_sda_value((reg >> (7-i)) & 0x01);			delay10us();		set_scl_high();   				delay10us();		set_scl_low();   	}		delay1us();	set_sda_input();		delay8us();	set_scl_high();   // Dont't care bit		delay10us();	set_scl_low();		delay2us();	set_sda_output();	set_sda_value(0);		delay10us();	set_scl_high(); 		delay10us();	set_sda_value(1);  // Stop 2-phases write		/****************************************************************/	/* 2-phases read */		addr = IIC_ADDR + 1;		set_sda_value(1);	set_scl_high();		delay10us();	set_sda_value(0);    // Issue start command		/* Send ID address */	for(i=0;i<8;i++)	{		delay10us();		set_scl_low();    // First clock start			delay500ns();		set_sda_value((addr >> (7-i)) & 0x01);			delay10us();		set_scl_high();   	}		delay10us();	set_scl_low();    // The Ninth clock start		delay1us();	set_sda_input();		delay8us();	set_scl_high();   // Dont't care bit	delay10us();		for(i=0;i<8;i++)	{		set_scl_low();		delay10us();		set_scl_high();			delay5us();		ret = get_sda_value();		*data |= (ret << (7-i));		delay5us();	}		set_scl_low();    // The Ninth clock start	delay1us();	set_sda_output();		delay500ns();	set_sda_value(1);		delay8us();	set_scl_high();   // Dont't care bit		delay10us();	set_scl_low();		delay5us();	set_sda_value(0);			delay10us();	set_scl_high(); 		delay10us();	set_sda_value(1);  // Stop 2-phases write}/* Initialize SCCB signal, simulation SCCB timing by GPIO */SINT32 sccb_init(){	/* 	 * PA15 : SDA	 * PA16 : SCL	 */	_reg_GPIO_GIUS(GPIOC) |= SDA;	_reg_GPIO_GIUS(GPIOB) |= SCL;		_reg_GPIO_OCR2(GPIOB) |= 0x00C00000;	_reg_GPIO_OCR2(GPIOC) |= 0x30;			_reg_GPIO_DDIR(GPIOC) |= SDA;	_reg_GPIO_DDIR(GPIOB) |= SCL;		set_sda_value(1);	set_scl_high();		return 0;}	///////////////////////////////////////////////////////////////////////////Read Regstatic unsigned char RtcReadReg(unsigned char addr){	unsigned char data;	sccb_read(addr, &data);	return data;}//Write Regstatic void RtcWriteReg(unsigned char addr,unsigned char data){	sccb_write(addr, data);}static unsigned char bin2int(unsigned char data){	return ((data&0x0f)+((data&0xf0)>>4)*10);}static unsigned char int2bin(unsigned char data){	return ((data%10)+((data/10)*16));}static void ds1337_rtc_init(void){	int ii = 0;	int jj = 0;	sccb_init();			//init i2c	while(0){		set_scl_high();		set_sda_value(1);printk("in loop,high\n");		delay10us();		set_scl_low();		set_sda_value(0);printk("in loop,low\n");		delay10us();		jj++;	}//	for(ii = 0; ii <= 0x0f; ii++){  //init ds1337 register all zero//		RtcWriteReg(ii, 0x0);//	}}static int ds1337_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg){	struct rtc_time wtime;	struct rtc_time rtc_tm;	unsigned char mon, mday, hrs, min, sec, leap_yr;	unsigned int yrs;//	printk("cmd = %d\n", cmd);	switch (cmd) {	case RTC_RD_TIME:///Read Date	{		wtime.tm_sec = bin2int(RtcReadReg(RTC_SEC));		wtime.tm_min = bin2int(RtcReadReg(RTC_MIN));		wtime.tm_hour = bin2int(RtcReadReg(RTC_HOUR));		wtime.tm_mday = bin2int(RtcReadReg(RTC_DATE));		wtime.tm_mon = bin2int(RtcReadReg(RTC_MONTH));		wtime.tm_year = bin2int(RtcReadReg(RTC_YEAR)); //from 970/*		printk("1 read: year = %d\n", wtime.tm_year);		printk("1 read: mon  = %d\n", wtime.tm_mon); 		printk("1 read: mday = %d\n", wtime.tm_mday);		printk("1 read: hour = %d\n", wtime.tm_hour);		printk("1 read: min  = %d\n", wtime.tm_min); 		printk("1 read: sec  = %d\n", wtime.tm_sec); */		break;	}	case RTC_SET_TIME:///Set Date	{		if (copy_from_user(&rtc_tm, (struct rtc_time*)arg, sizeof(struct rtc_time)))			return -EFAULT;		yrs = rtc_tm.tm_year + 2000;		mon = rtc_tm.tm_mon;		mday = rtc_tm.tm_mday;		hrs = rtc_tm.tm_hour;		min = rtc_tm.tm_min;		sec = rtc_tm.tm_sec;				if (yrs < 2000)			return -EINVAL;					leap_yr = ((!(yrs % 4) && (yrs % 100)) || !(yrs % 400));				if ((mon > 12) || (mday == 0))			return -EINVAL;					if (mday > (days_in_mo[mon] + ((mon == 2) && leap_yr)))			return -EINVAL;					if ((hrs >= 24) || (min >= 60) || (sec >= 60))			return -EINVAL;		RtcWriteReg(RTC_YEAR, int2bin(rtc_tm.tm_year));		RtcWriteReg(RTC_MONTH, int2bin(rtc_tm.tm_mon));		RtcWriteReg(RTC_DATE, int2bin(rtc_tm.tm_mday));		RtcWriteReg(RTC_HOUR, int2bin(rtc_tm.tm_hour));		RtcWriteReg(RTC_MIN, int2bin(rtc_tm.tm_min));		RtcWriteReg(RTC_SEC, int2bin(rtc_tm.tm_sec));		return 0;	}	default:		return -EINVAL;	}	return copy_to_user((void *)arg, &wtime, sizeof(struct rtc_time)) ? -EFAULT : 0;}static int ds1337_open(struct inode *minode, struct file *mfile){//	printk("ds1337 open\n");	MOD_INC_USE_COUNT;	return 0;}static int ds1337_release(struct inode *minode, struct file *mfile){   	MOD_DEC_USE_COUNT;	return 0;}static struct file_operations device_fops = {	owner:      THIS_MODULE,	open:		ds1337_open,	release:	ds1337_release,	ioctl:		ds1337_ioctl,};static devfs_handle_t g_devfs_handle;static int g_rtc_major;static __init int ds1337_init(void){	int result;	/* register our character device */	result = devfs_register_chrdev(0, "ds1337", &device_fops);	if ( result < 0 )	{	        printk("ds1337 driver: Unable to register driver\n");	        return -ENODEV;	}	g_devfs_handle = devfs_register(NULL, "ds1337", DEVFS_FL_DEFAULT,	                              result, 0,	                              S_IFCHR | S_IRUSR | S_IWUSR,	                              &device_fops, NULL);    printk("make node for ds1337 with 'mknod ds1337 c %d 0'\n", result);	g_rtc_major = result;  	ds1337_rtc_init();	//register_chrdev(DS1337_MAJOR, DS1337_NAME, &device_fops);	//printk("%s %s initialized.\n", DS1337_NAME, DS1337_VERSION);    return 0;}static __exit void ds1337_exit(void){      if(g_rtc_major>0)      {          devfs_unregister_chrdev(g_rtc_major, DS1337_NAME);          devfs_unregister(g_devfs_handle);      }//	unregister_chrdev(DS1337_MAJOR, DS1337_NAME);//	printk("%s unregisterd.\n", DS1337_NAME);}module_init(ds1337_init);module_exit(ds1337_exit);MODULE_LICENSE("GPL");MODULE_AUTHOR("pyl");/*vim:ts=4*/

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本不卡1234视频| 精品999在线播放| 亚洲精品免费在线| 91丨porny丨在线| 一区二区在线电影| 欧美日韩在线一区二区| 亚洲国产成人av| 91精品婷婷国产综合久久| 美国毛片一区二区三区| 久久日一线二线三线suv| 国产专区综合网| 亚洲女同女同女同女同女同69| 色综合一区二区| 午夜精品免费在线观看| 日韩欧美国产高清| 成人综合在线网站| 亚洲国产综合91精品麻豆| 日韩一卡二卡三卡四卡| 国产成人自拍网| 亚洲精品少妇30p| 日韩欧美一区二区久久婷婷| 国产精品12区| 亚洲一区视频在线观看视频| 日韩精品最新网址| 91色在线porny| 日韩和欧美一区二区| 久久精品无码一区二区三区| 91小视频免费观看| 欧美三片在线视频观看| 蜜臀av一级做a爰片久久| 国产亚洲制服色| 91久久香蕉国产日韩欧美9色| 亚洲第一二三四区| 国产人妖乱国产精品人妖| 欧美日韩中文国产| 成人夜色视频网站在线观看| 五月婷婷色综合| 国产精品欧美一区喷水| 欧美人动与zoxxxx乱| 懂色av中文字幕一区二区三区| 一区二区三区欧美| 亚洲va天堂va国产va久| 国产午夜亚洲精品理论片色戒| 成人一区二区三区中文字幕| 国产女人18毛片水真多成人如厕 | 成人av在线影院| 欧美亚洲综合色| 国产精品久久久久久妇女6080| www.亚洲人| 中文字幕免费不卡| 久久精品国产99久久6| 亚洲欧洲三级电影| 一区二区高清在线| 欧美精品一区二区三区视频| 欧美性xxxxxx少妇| 99视频一区二区| 国产成a人无v码亚洲福利| 免费观看91视频大全| 亚洲国产一区二区在线播放| 中文字幕一区三区| 国产欧美日本一区视频| 日韩色视频在线观看| 欧美日韩在线播放一区| 91日韩在线专区| 99久久婷婷国产综合精品电影 | 国产精品丝袜一区| 欧美精品一区二区在线播放| 欧美日韩国产一区二区三区地区| 不卡的电视剧免费网站有什么| 激情五月激情综合网| 久久成人综合网| 极品美女销魂一区二区三区免费 | 17c精品麻豆一区二区免费| 久久亚洲欧美国产精品乐播| 日韩视频一区在线观看| 在线电影院国产精品| 欧美一区二区在线观看| 精品国产一区二区三区久久影院| 精品视频免费在线| 蜜臀99久久精品久久久久久软件| 亚洲图片欧美视频| 亚洲一区视频在线| 香蕉乱码成人久久天堂爱免费| 亚洲精品日韩一| 亚洲一区二区欧美| 午夜精品久久一牛影视| 日韩主播视频在线| 日韩二区在线观看| 久久99这里只有精品| 久久精品久久综合| 国产精品一区二区果冻传媒| 日韩欧美国产高清| 日韩精品一区二区三区swag| 欧美一激情一区二区三区| 欧美大肚乱孕交hd孕妇| 久久精品人人做人人爽97| 欧美高清在线视频| 一区二区三区四区高清精品免费观看 | 高清国产一区二区三区| 成人手机电影网| 色呦呦日韩精品| 欧美日韩国产一级二级| 精品蜜桃在线看| 中文字幕亚洲欧美在线不卡| 亚洲精品亚洲人成人网| 五月天激情综合网| 国产尤物一区二区| 97se亚洲国产综合自在线| 欧美午夜电影在线播放| 精品福利一二区| 国产精品无人区| 午夜国产精品影院在线观看| 久草热8精品视频在线观看| 成人免费视频免费观看| 色婷婷香蕉在线一区二区| 91精品免费在线| 中文字幕第一页久久| 亚洲不卡在线观看| 国产suv精品一区二区三区 | 欧美性一二三区| 欧美大胆人体bbbb| 亚洲三级在线看| 精品综合久久久久久8888| 91视频观看视频| 精品国产一区二区三区四区四| 亚洲女同一区二区| 国产精品综合视频| 欧美三级日韩三级国产三级| 久久亚洲二区三区| 丝袜亚洲另类欧美综合| 国产1区2区3区精品美女| 欧美日本精品一区二区三区| 中文幕一区二区三区久久蜜桃| 天堂精品中文字幕在线| 一本久道中文字幕精品亚洲嫩| 精品999在线播放| 天涯成人国产亚洲精品一区av| 暴力调教一区二区三区| 精品盗摄一区二区三区| 亚洲国产乱码最新视频| 顶级嫩模精品视频在线看| 日韩一区二区三区在线视频| 亚洲日本va午夜在线电影| 国产一区二区三区| 777午夜精品免费视频| 亚洲免费观看在线视频| 国产精品中文字幕一区二区三区| 欧美久久婷婷综合色| 亚洲欧美福利一区二区| 成人福利电影精品一区二区在线观看| 日韩欧美中文字幕制服| 五月天网站亚洲| 欧美天堂一区二区三区| 亚洲免费在线看| 91视频免费观看| 日韩美女精品在线| 成a人片国产精品| 亚洲国产精品t66y| 国产成人av一区二区三区在线观看| 日韩一区二区精品葵司在线 | 欧美一级生活片| 亚洲国产乱码最新视频 | 日韩亚洲欧美成人一区| 亚洲综合一二三区| 91视视频在线观看入口直接观看www | 欧美日韩国产高清一区| 亚洲三级电影网站| 91网站在线观看视频| 国产精品久久久久影视| 成人晚上爱看视频| 久久一二三国产| 狠狠色丁香婷综合久久| 精品国产一区二区亚洲人成毛片| 久久99国产精品尤物| 26uuu久久综合| 福利一区在线观看| 国产精品美女久久久久久久久 | 亚洲成人在线网站| 欧美精品久久久久久久多人混战| 亚洲福利一区二区三区| 6080日韩午夜伦伦午夜伦| 免费观看在线色综合| 亚洲精品一区在线观看| 国产精品资源在线看| 国产女人水真多18毛片18精品视频| 成人av免费网站| 中文字幕一区二区三区不卡在线| 成人精品在线视频观看| 亚洲精品国产第一综合99久久| 欧美午夜精品理论片a级按摩| 五月婷婷久久综合| 久久午夜国产精品| 色综合久久88色综合天天 | 最新不卡av在线| 91国产成人在线| 久久精品国产**网站演员| 国产精品伦理一区二区| 色偷偷久久人人79超碰人人澡| 亚洲一区在线观看免费| 精品久久久久久久一区二区蜜臀|