diff options
Diffstat (limited to 'eepromer/eepromer.c')
-rw-r--r-- | eepromer/eepromer.c | 723 |
1 files changed, 0 insertions, 723 deletions
diff --git a/eepromer/eepromer.c b/eepromer/eepromer.c deleted file mode 100644 index 1536b15..0000000 --- a/eepromer/eepromer.c +++ /dev/null @@ -1,723 +0,0 @@ -#include <sys/ioctl.h> -#include <errno.h> -#include <string.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <fcntl.h> -#include <time.h> -#include <linux/i2c.h> -#include <linux/i2c-dev.h> - - -#define MAX_BLK_SIZE 64 -#define EEPROM_SIZE 32768 -#define READ 1 -#define WRITE 0 -#define ERASE 2 -#define PHEADER 3 -#define VER "eepromer v 0.4 (c) Daniel Smolik 2001\n" -#define HEAD_SIZE sizeof(struct mini_inode) -#define START_ADDR 0 -#define FORCE 1 -/* -To disable startup warning #undef WARNINC - - -*/ - -#define WARNINC - - -int block_write(int file,int dev_addr,int eeprom_addr,unsigned char *buf,int lenght);int block_write(int file,int dev_addr,int eeprom_addr,unsigned char *buf,int lenght); -int block_read(int file,int dev_addr,int eeprom_addr,unsigned char *buf); - -/* block_read read block 64 bytes length and returns actual length of data*/ -void help(void); -int init(char *device,int addr); -int content_write(int file, int addr); -int content_read(int file, int addr); -int inode_write(int file, int dev_addr, int lenght); -int inode_read(int file, int dev_addr, void *p_inode); -void pheader(int file, int addr); -void erase(int file,int addr,int eeprom_size); -void made_address(int addr,unsigned char *buf); -void warn(void); -void bar(void); - - -static int stav=0; - - - -static struct mini_inode { - - time_t timestamp; - int data_len; - char data[56]; - - } m_ind,*p_ind; - - - -void help(void) -{ - FILE *fptr; - char s[100]; - - fprintf(stderr,"Syntax: eepromer [-r|-w|-e|-p] -f /dev/i2c-X ADDRESS \n\n"); - fprintf(stderr," ADDRESS is address of i2c device eg. 0x51\n"); - - if((fptr = fopen("/proc/bus/i2c", "r"))) { - fprintf(stderr," Installed I2C busses:\n"); - while(fgets(s, 100, fptr)) - fprintf(stderr, " %s", s); - fclose(fptr); - } -} - - - - - -int main(int argc, char *argv[]){ - - int i, file, addr; - int action; //in this variable will be (-r,-w,-e) - char device[45]; - int force; - - p_ind=&m_ind; - force=0; - - - - - for(i=1; i < argc;i++){ - - - if(!strcmp("-r",argv[i])) { - action=READ; - break; - } - if(!strcmp("-e",argv[i])) { - action=ERASE; - break; - } - if(!strcmp("-w",argv[i])) { - action=WRITE; - break; - } - if(!strcmp("-p",argv[i])) { - action=PHEADER; - break; - } - if(!strcmp("-force",argv[i])) { - force=FORCE; - break; - } - if(!strcmp("-v",argv[i])) { - fprintf(stderr,VER); - exit(0); - break; - } - else { - - fprintf(stderr,"Error: No action specified !\n"); - help(); - exit(1); - } - - } - - -#ifdef WARNINC - - if(force!=FORCE) warn(); - -#endif - - - if(argc < 5) { - fprintf(stderr,"Error: No i2c address specified !\n"); - help(); - exit(1); - - } - - - for(i=1; i < argc;i++){ - - - if(!strcmp("-f",argv[i])) { - strcpy(device,argv[i+1]); - break; - } - - } - - if(!strlen(device)) { - - fprintf(stderr,"Error: No device specified !\n"); - help(); - exit(1); - } - - - if(! (addr=strtol(argv[4],NULL,16))) { - - fprintf(stderr,"Error: Bad device address !\n"); - help(); - exit(1); - } - - if(! (file=init(device,addr))){ - - fprintf(stderr,"Error: Init failed !\n"); - exit(1); - } - - - switch(action){ - - case READ: - content_read(file,addr); - break; - - case WRITE: - content_write(file,addr); - break; - - case ERASE: erase(file,addr,EEPROM_SIZE); - break; - case PHEADER: pheader(file,addr); - break; - - default: - fprintf(stderr,"Internal error!\n"); - exit(1); break; - - } - - - close(file); - exit(0); - -} - - - -/****************************************************************************/ -/* Low level function */ -/* */ -/****************************************************************************/ - - - - - -int block_write(int file,int dev_addr,int eeprom_addr,unsigned char *buf,int lenght){ - - unsigned char buff[2]; - struct i2c_msg msg[2]; - - struct i2c_ioctl_rdwr_data { - - struct i2c_msg *msgs; /* ptr to array of simple messages */ - int nmsgs; /* number of messages to exchange */ - } msgst; - - - - if ( lenght > (MAX_BLK_SIZE) ) { - - fprintf(stderr, - "Error: Block too large:\n"); - - } - - - //bar(); - - made_address(eeprom_addr,buff); - - - msg[0].addr = dev_addr; - msg[0].flags = 0; - msg[0].len = 2; - msg[0].buf = buff; - - - msg[1].addr = dev_addr; - msg[1].flags = I2C_M_NOSTART; - msg[1].len = lenght; - msg[1].buf = buf; - - - msgst.msgs = msg; - msgst.nmsgs = 2; - - - if (ioctl(file,I2C_RDWR,&msgst) < 0){ - - fprintf(stderr, - "Error: Transaction failed: %s\n", - strerror(errno)); - - return 1; - - } - - return 0; - -} - - - - -int block_read(int file,int dev_addr,int eeprom_addr,unsigned char *buf){ - - int ln; - char buff[2]; //={0x0,0x0}; - - struct i2c_msg msg[2]; - - struct i2c_ioctl_rdwr_data { - - struct i2c_msg *msgs; /* ptr to array of simple messages */ - int nmsgs; /* number of messages to exchange */ - } msgst; - - - - made_address(eeprom_addr,buff); - ln=0; - //bar(); - - msg[0].addr = dev_addr; - msg[0].flags = 0; - msg[0].len = 2; - msg[0].buf = buff; - - - msg[1].addr = dev_addr; - msg[1].flags = I2C_M_RD; - msg[1].len = MAX_BLK_SIZE; - msg[1].buf = buf; - - - - - msgst.msgs = msg; - msgst.nmsgs = 2; - - - - - if ((ln = ioctl(file, I2C_RDWR, &msgst)) < 0) { - - fprintf(stderr, - "Error: Read error:%d\n",ln); - return ln; - } - - return ln; - -} - - - - - - - - - - - - - - - - -void made_address(int addr,unsigned char *buf){ - - int k; - - //addr = addr & 0xFFFF; /*odstranim nepoterbne bity*/ - - k=addr; - buf[1]=(unsigned char) (k & 0xFF); //vyrobim druhy byte adresy - k=addr & 0xFF00 ; - buf[0]= ((unsigned char) (k >> 8)) & 0x7F; - - - return; -} - - -int init(char *device,int addr) { - - int file; - unsigned long funcs; - - if ((file = open(device,O_RDWR)) < 0) { - - fprintf(stderr,"Error: Could not open file %s\n", - device); - - return 0; - } - - - /* check adapter functionality */ - if (ioctl(file,I2C_FUNCS,&funcs) < 0) { - fprintf(stderr, - "Error: Could not get the adapter functionality matrix: %s\n", - strerror(errno)); - close(file); - return 0; - } - - /* The I2C address */ - if (ioctl(file,I2C_SLAVE,addr) < 0) { - /* ERROR HANDLING; you can check errno to see what went wrong */ - fprintf(stderr, - "Error: Cannot communicate with slave: %s\n", - strerror(errno)); - - close(file); - return 0; - } - - return file; -} - - -int content_write(int file, int addr){ - - unsigned char buf[MAX_BLK_SIZE]; - unsigned char pom; - int i, j, k, delka, addr_cnt; - - delka=0; - addr_cnt=HEAD_SIZE; - k=0; - - for(j=0;j<MAX_BLK_SIZE;j++) - buf[j]=0; - - - - i=0; - - for(;;) { - - delka=fread(&pom,1,1,stdin); - - if( delka > 0 ){ - buf[i]=pom; - } - - if(i==(MAX_BLK_SIZE-1) || (delka < 1)) { - - - - if(block_write(file,addr,addr_cnt,buf,delka<1?i:(i+1)) !=0) { - - fprintf(stderr,"Block write failed\n"); - return 1; - - } - //printf("i:%d\n",i); - addr_cnt=addr_cnt + i + (delka==1?1:0); //+i - - for(j=0;j<MAX_BLK_SIZE;j++) - buf[j]=0; - - i=0; - if(delka<1) { - - //pisu EOF - - - if(inode_write(file,addr,(addr_cnt-HEAD_SIZE)) !=0) { - - fprintf(stderr,"Inode write failed\n"); - return 1; - - } - break; - } - - - } else i++; - - } - - return 0; - -} - - -int content_read(int file, int addr){ - - unsigned char buf[MAX_BLK_SIZE]; - int i, j, k, delka; - - delka=0; - k=0; - - - inode_read(file,addr,p_ind ); - - - for(i=HEAD_SIZE;i<= (HEAD_SIZE + p_ind->data_len);i=i+MAX_BLK_SIZE ) { - - - if(block_read(file,addr,i,buf) !=0) { - - fprintf(stderr,"Block read failed\n"); - return 1; - - } - - if( (HEAD_SIZE + p_ind->data_len - i) < MAX_BLK_SIZE ) { - k= HEAD_SIZE + p_ind->data_len - i; - }else { - k=MAX_BLK_SIZE; - } - - - for(j=0;j<k ;j++){ - - putc(buf[j],stdout); - - } - - - } - - return 0; - -} - - - -void erase(int file, int addr,int eeprom_size){ - - unsigned char buf[MAX_BLK_SIZE]; - int i, j, k, delka; - - delka=0; - k=0; - - for(j=0;j<MAX_BLK_SIZE;j++) - buf[j]=0; - - - - - - for(i=0;i<eeprom_size;i=i+MAX_BLK_SIZE) { - - - if(block_write(file,addr,i,buf,MAX_BLK_SIZE) !=0) { - - fprintf(stderr,"Block write failed\n"); - return; - - } - - } - - return; - -} - - - -void bar(void){ - - - if( stav > 70 ) stav=0; - - - switch(stav) { - - - case 10: fwrite("\\",1,1,stderr); - fflush(stderr); - rewind(stderr); - break; - case 20: fwrite("|",1,1,stderr); - fflush(stderr); - rewind(stderr); - break; - case 30: fwrite("/",1,1,stderr); - fflush(stderr); - rewind(stderr); - break; - case 40: fwrite("-",1,1,stderr); - fflush(stderr); - rewind(stderr); - break; - case 50: fwrite("\\",1,1,stderr); - fflush(stderr); - rewind(stderr); - break; - case 60: fwrite("|",1,1,stderr); - fflush(stderr); - rewind(stderr); - break; - case 70: fwrite("/",1,1,stderr); - fflush(stderr); - rewind(stderr); - break; - } - stav++; - -} - - - - - -int inode_write(int file,int dev_addr,int lenght){ - - unsigned char buff[2]; - struct i2c_msg msg[2]; - - struct i2c_ioctl_rdwr_data { - - struct i2c_msg *msgs; /* ptr to array of simple messages */ - int nmsgs; /* number of messages to exchange */ - } msgst; - - - m_ind.timestamp=time(NULL); - m_ind.data_len=lenght; - - - - - - //bar(); - - made_address(START_ADDR,buff); - - - msg[0].addr = dev_addr; - msg[0].flags = 0; - msg[0].len = 2; - msg[0].buf = buff; - - - msg[1].addr = dev_addr; - msg[1].flags = I2C_M_NOSTART; - msg[1].len = sizeof(struct mini_inode); - msg[1].buf = (char *) &m_ind; - - - - msgst.msgs = msg; - msgst.nmsgs = 2; - - - if (ioctl(file,I2C_RDWR,&msgst) < 0){ - - fprintf(stderr, - "Error: Transaction failed: %s\n", - strerror(errno)); - - return 1; - - } - - return 0; - -} - - - -int inode_read(int file,int dev_addr,void *p_inode ){ - - - #define POK 32 - int ln; - char buff[2]; //={0x0,0x0}; - - struct i2c_msg msg[2]; - - struct i2c_ioctl_rdwr_data { - - struct i2c_msg *msgs; /* ptr to array of simple messages */ - int nmsgs; /* number of messages to exchange */ - } msgst; - - made_address(START_ADDR,buff); - - ln=0; - //bar(); - - msg[0].addr = dev_addr; - msg[0].flags = 0; - msg[0].len = 2; - msg[0].buf = buff; - - - msg[1].addr = dev_addr; - msg[1].flags = I2C_M_RD; - msg[1].len = sizeof(struct mini_inode); - msg[1].buf = p_inode; - - - - - msgst.msgs = msg; - msgst.nmsgs = 2; - - - if ((ln = ioctl(file, I2C_RDWR, &msgst)) < 0) { - - fprintf(stderr, - "Error: Read error:%d\n",ln); - return ln; - } - - - - return ln; - -} - - -void pheader(int file,int dev_addr){ - - struct tm *p_tm; - char time_buf[15],*p_buf; - - p_buf=time_buf; - inode_read(file,dev_addr,p_ind ); - p_tm=localtime(&p_ind->timestamp); - strftime(p_buf,sizeof(time_buf),"%Y%m%d%H%M%S",p_tm); - printf("LEN=%d,TIME=%s\n",p_ind->data_len,p_buf); - return; -} - - - - -#ifdef WARNINC -void warn(void) -{ - - fprintf(stderr,"\n\n!!!!!!!!!!!!!!!!!!!!!WARNING!!!!!!!!!!!!!!!!!!!!!\n"); - fprintf(stderr,"This program is intended for use on eeproms\nusing external busses such as i2c-pport.\n"); - fprintf(stderr,"Do not use this on your SDRAM DIMM EEPROMS\nunless you REALLY REALLY know what you are\ndoing!!! Doing so will render your SDRAM\nUSELESS and leave your system UNBOOTABLE!!!\n"); - fprintf(stderr,"To disable this warning use -force\n"); - fprintf(stderr,"\n\nPress ENTER to continue or hit Control-C NOW !!!!\n\n\n"); - - getchar(); -} -#endif |