📄 max6900.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 + -