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

📄 max6900.c

📁 MAX6900是MAXIAM公司出品的实时时钟芯片
💻 C
字号:
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/types.h>#include <fcntl.h>#include <sys/stat.h>#include <termios.h>#include <unistd.h>#include <sys/ioctl.h>#include <linux/ioctl.h>#include <linux/i2c-dev.h>#include <asm/errno.h>#include "max6900.h"#define I2C_SLAVE 0x0703#define ID_PHY 0xA0#define BCD_TO_BIN(val) (((val)&15) + ((val)>>4)*10)#define BIN_TO_BCD(val) ((((val)/10)<<4) + (val)%10)#define BUF_TO_BIN(buf, x) ((buf[x]-0x30)*10+(buf[x+1])-0x30);#if DBG#define _DBGRTCTM(rtctm) printf("%s: secs=%d, mins=%d, hours=%d, mday=%d, " \                        "mon=%d, wday=%d, year=%d, cent=%d\n", __FUNCTION__, \                        (rtctm).secs, (rtctm).mins, (rtctm).hours, (rtctm).mday, \                        (rtctm).mon, (rtctm).wday, (rtctm).year, (rtctm).cent);#else#define _DBGRTCTM(rtctm) do{ } while(0);#endif#define DISPLAY(rtctm) printf( "%02d%02d-%02d-%02d %02d:%02d:%02d\n",\				(rtctm).cent,(rtctm).year, (rtctm).mon,(rtctm).mday,\				(rtctm).hours,(rtctm).mins,(rtctm).secs	);static int max6900_get_datetime(int file, struct rtc_tm *dt);static int max6900_set_datetime(int file, struct rtc_tm *dt);static int max6900_sync_to_sys(int file, struct rtc_tm *dt);main(int argc, char **argv){	int file;  	int adapter_nr = 0;  	char filename[20];	int  ret;	struct rtc_tm dt;	if (argc < 2){		printf("rtc help:\n\n"			"rtc -g 	: get date form RTC device\n"			"rtc -s string 	: set date to RTC device\n"			"		  string: 20060304050609(2006-03-04 05:06:09)\n"			"rtc -t 	: sync to system\n");		exit(1);	}  	sprintf(filename, "/dev/i2c-%d", adapter_nr);  	if ((file = open(filename, O_RDWR)) < 0) {		perror("No such i2c device!\n");  	  	exit(1);  	}		int addr = ID_PHY>>1; /* The I2C address */	if ((ret = ioctl(file, I2C_SLAVE, addr)) < 0) {		if(ret ==  -EBUSY)			printf("Device busy\n");		if(ret == -EINVAL)			printf("invalid addr\n");		printf("No such slave device. %d\n ", ret);		close(file);   		exit(1);  	}		if(argv[1][1] == 'g' )		max6900_get_datetime(file, &dt);			if(argv[1][1] == 's' ){		char *d = argv[2];		dt.secs = BUF_TO_BIN(d, 12);		dt.mins = BUF_TO_BIN(d, 10);		dt.hours= BUF_TO_BIN(d, 8);		dt.mday = BUF_TO_BIN(d, 6);		dt.mon  = BUF_TO_BIN(d, 4);		dt.year = BUF_TO_BIN(d, 2);		dt.cent = BUF_TO_BIN(d, 0);		max6900_set_datetime(file, &dt);	}	if(argv[1][1] == 't'){		max6900_get_datetime(file, &dt);		max6900_sync_to_sys(file, &dt);		}	close(file);}static int max6900_get_datetime(int file, struct rtc_tm *dt){        int ret = -EIO;	int access_addr = 0xBF;        unsigned char buf[10];	int i;	unsigned char reg;        if (!dt)                return -EINVAL;    memset(buf, 0, sizeof(buf));	buf[0] = RTC6900_REG_SEC1;	write(file, buf , 1);        ret = read(file, buf, 1);        if (ret<0){               	perror("read error!\n");		exit(1);	}        dt->secs = BCD_TO_BIN(buf[0] & 0x7f);	buf[0] = RTC6900_REG_MIN1;	write(file, buf , 1);        ret = read(file, buf, 1);        if (ret<0){               	perror("read error!\n");		exit(1);	}        dt->mins = BCD_TO_BIN(buf[0] & 0x7f);	buf[0] = RTC6900_REG_HR1;	write(file, buf , 1);        ret = read(file, buf, 1);        if (ret<0){               	perror("read error!\n");		exit(1);	}        dt->hours = BCD_TO_BIN(buf[0] & 0x3f);	buf[0] = RTC6900_REG_MDAY1;	write(file, buf , 1);        ret = read(file, buf, 1);        if (ret<0){               	perror("read error!\n");		exit(1);	}        dt->mday = BCD_TO_BIN(buf[0] & 0x3f);	buf[0] = RTC6900_REG_MON1;	write(file, buf , 1);        ret = read(file, buf, 1);        if (ret<0){               	perror("read error!\n");		exit(1);	}        dt->mon = BCD_TO_BIN(buf[0] & 0x1f);	buf[0] = RTC6900_REG_YEAR1;	write(file, buf , 1);        ret = read(file, buf, 1);        if (ret<0){               	perror("read error!\n");		exit(1);	}        dt->year = BCD_TO_BIN(buf[0]);	buf[0] = RTC6900_REG_CENT1;	write(file, buf , 1);        ret = read(file, buf, 1);        if (ret<0){               	perror("read error!\n");		exit(1);	}        dt->cent = BCD_TO_BIN(buf[0] & 0x3f);	DISPLAY(*dt);        _DBGRTCTM(*dt);        return 0;}static intmax6900_set_datetime(int file, struct rtc_tm *dt){        int ret, len = 10;        unsigned char buf[10];	unsigned char cmd[30]; 		unsigned char * tmp;        if (!dt)                return -EINVAL;        _DBGRTCTM(*dt);	tmp = cmd;	sprintf(tmp,"date -s ");	tmp = tmp + strlen("date -s ");        buf[0] = RTC6900_REG_MON;	buf[1] = BIN_TO_BCD(dt->mon);	ret = write(file, buf, 2);        if (ret<0) {                printf("error writing data! \n");        }	sprintf(tmp,"%02d",dt->mon);		tmp = tmp + 2;        buf[0] = RTC6900_REG_MDAY;	buf[1] = BIN_TO_BCD(dt->mday);	ret = write(file, buf, 2);        if (ret<0) {                printf("error writing data! \n");        }	sprintf(tmp,"%02d",dt->mday);		tmp = tmp + 2;        buf[0] = RTC6900_REG_HR;	buf[1] = BIN_TO_BCD(dt->hours);	ret = write(file, buf, 2);        if (ret<0) {                printf("error writing data! \n");        }	sprintf(tmp,"%02d",dt->hours);		tmp = tmp + 2;      	buf[0] = RTC6900_REG_MIN;	buf[1] = BIN_TO_BCD(dt->mins);	ret = write(file, buf, 2);        if (ret<0) {                printf("error writing data! \n");        }	sprintf(tmp,"%02d",dt->mins);		tmp = tmp + 2;        buf[0] = RTC6900_REG_CENT;	buf[1] = BIN_TO_BCD(dt->cent);	ret = write(file, buf, 2);        if (ret<0) {                printf("error writing data! \n");        }	sprintf(tmp,"%02d",dt->cent);		tmp = tmp + 2;        buf[0] = RTC6900_REG_YEAR;	buf[1] = BIN_TO_BCD(dt->year);	ret = write(file, buf, 2);        if (ret<0) {                printf("error writing data! \n");        }	sprintf(tmp,"%02d.",dt->year);		tmp = tmp + 3;      	buf[0] = RTC6900_REG_SEC;	buf[1] = BIN_TO_BCD(dt->secs);	ret = write(file, buf, 2);        if (ret<0) {                printf("error writing data!\n ");        }	sprintf(tmp,"%02d",dt->secs);	tmp = tmp + 2;        buf[0] = RTC6900_REG_WDAY;	buf[1] = BIN_TO_BCD(dt->wday);	ret = write(file, buf, 2);        if (ret<0) {                printf("error writing data! \n");        }	system(cmd);    return ret;}static intmax6900_sync_to_sys(int file, struct rtc_tm *dt){	unsigned char cmd[30]; 		unsigned char * tmp;        if (!dt)                return -EINVAL;	tmp = cmd;	sprintf(tmp,"date -s ");	tmp = tmp + strlen("date -s ");	sprintf(tmp,"%02d",dt->mon);		tmp = tmp + 2;	sprintf(tmp,"%02d",dt->mday);		tmp = tmp + 2;	sprintf(tmp,"%02d",dt->hours);		tmp = tmp + 2;	sprintf(tmp,"%02d",dt->mins);		tmp = tmp + 2;	sprintf(tmp,"%02d",dt->cent);		tmp = tmp + 2;	sprintf(tmp,"%02d.",dt->year);		tmp = tmp + 3;	sprintf(tmp,"%02d",dt->secs);	tmp = tmp + 2;	system(cmd);    return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -