📄 drvprom.c
字号:
#include "includes.h"
#include "fi2c.h"
#include "funcprom.h"
#include "hardware.h"
#include "device.h"
//#include "funcint.h"
#include "feeprom.h"
#define ROM_SIZE 0x2000 //8K bytes
#define ROM_NUM 2 //two chips of EEPROM in the system
#define ROM_PAGE_SIZE 32
#define CONTROL0 0b10100000 //control byte when write or read EEPROM0
#define CONTROL1 0b10100010 //control byte when write or read EEPROM1
INT8U eeprom_write( INT8U rom *wrptr, INT16U length );
INT16U eeprom_read( INT8U rom *rdptr, INT16U length );
INT8U eeprom_ioctl(INT8U cmd, INT24U arg);
INT8U eeprom_init(void);
INT8U eeprom_open(void);
void rminit(void);
#pragma romdata CCODE
DEV_HEADER DEV_SEEPROM = {
DEV_ID_SEEPROM, /*device ID */
{'r','o','m'}, /*device name*/
DEVP_CHAR, /*device Type*/
eeprom_init, /*device init function*/
FNull_1, /*device clear function*/
eeprom_open, /*device open function*/
FNull_1, /*device close function*/
eeprom_ioctl, /*device ioctl function*/
eeprom_write, /*device write function*/
eeprom_read /*device read function*/
};
INT8U control;
WORD_VAL address;
#pragma romdata EXTRAM
INT8U rom hdl_i2c;
INT8U rom Prom_buf[10];
INT8U rom RomDataRam[ROM_SIZE*ROM_NUM]; //This ram block is used to buffer rom data, can be alloced dynamically
#pragma code MYCODE
INT8U eeprom_init(void){
hdl_i2c = sysdev_open(DEV_ID_I2C);
rminit();
if(hdl_i2c == 0xff) return(1);
}
INT8U eeprom_open(void){
//currently do nothing
}
INT8U eeprom_ioctl(INT8U cmd, INT24U arg){
if(cmd == EEPROM_ADDRESS){
address.Val = (INT16U)arg;
}
}
//Page write to EEPROM from external RAM
INT8U eeprom_write(INT8U rom *wrptr, INT16U length ){
INT8U i;
for(;;){
if(address.Val < ROM_SIZE) control = CONTROL0;
else control = CONTROL1;
i = ROM_PAGE_SIZE - (LSB(address) & (ROM_PAGE_SIZE-1));
if(i > length) i = length;
sysdev_ioctl(hdl_i2c, I2C_IDLE,0);
sysdev_ioctl(hdl_i2c, I2C_START,0);
if(sysdev_ioctl(hdl_i2c, I2C_BUSSTT,0)!=0){
sysdev_ioctl(hdl_i2c, I2C_STOP,0);
return ( 1 ); // return with Bus Collision error
}
else{ // start condition successful
Prom_buf[0] = control;
Prom_buf[1] = MSB(address);//addressh;
Prom_buf[2] = LSB(address);//addressl;
if(sysdev_write(hdl_i2c, Prom_buf, 3) != 0) return(0);
sysdev_write(hdl_i2c, wrptr, i);
}
sysdev_ioctl(hdl_i2c, I2C_IDLE,0);
sysdev_ioctl(hdl_i2c, I2C_STOP,0);
if(sysdev_ioctl(hdl_i2c, I2C_BUSSTT,0) != 0){
sysdev_ioctl(hdl_i2c, I2C_STOP,0);
return(1);
}
OSTimeDly(2);
wrptr += i;
length -= i;
address.Val +=i;
if(length == 0) return(0);
}
}
//Random read to external RAM
INT16U eeprom_read(INT8U rom *rdptr,INT16U length ){
INT16U romlen[2];
INT8U i;
if(address.Val >=ROM_SIZE){
romlen[0] = 0;
romlen[1] = length;
}
else if(length > ROM_SIZE - address.Val){ //located in EEPROM 0 and 1
romlen[0] = ROM_SIZE - address.Val;
romlen[1] = length - romlen[0];
}
else{ //located only in EEPROM 0
romlen[0] = length;
romlen[1] = 0;
}
for(i=0;i<2; i++){
if(romlen[i] != 0){
if(i == 0) control = CONTROL0;
else control = CONTROL1;
sysdev_ioctl(hdl_i2c, I2C_IDLE,0);
sysdev_ioctl(hdl_i2c, I2C_START,0);
if(sysdev_ioctl(hdl_i2c, I2C_BUSSTT,0)!=0){
sysdev_ioctl(hdl_i2c, I2C_STOP,0);
return ( 0 );
}
else{
Prom_buf[0] = control;
Prom_buf[1] = MSB(address);
Prom_buf[2] = LSB(address);
if(sysdev_write(hdl_i2c, Prom_buf, 3) != 0) return(0);
sysdev_ioctl(hdl_i2c, I2C_RESTART,0);
Prom_buf[0] |= 0x01;
if(sysdev_write(hdl_i2c, Prom_buf,1) != 0) return(0);
sysdev_read(hdl_i2c, rdptr,romlen[i]);
sysdev_ioctl(hdl_i2c, I2C_NOTACK,0);
sysdev_ioctl(hdl_i2c,I2C_STOP,0);
if(sysdev_ioctl(hdl_i2c, I2C_BUSSTT, 0) != 0) return(0);
}
rdptr += romlen[i];
address.Val += romlen[i];
}
}
return(length);
}
//-------------------------------------------------------------//
// "RomDataRam" block management functions //
//-------------------------------------------------------------//
INT8U rom * rm;
INT16U rm_len;
#pragma code MYCODE
void rminit(void){
rm = RomDataRam;
rm_len = sizeof(RomDataRam);
}
INT8U rom * rmalloc(INT16U len){
INT8U rom * pt;
if(len <= rm_len){
rm_len -= len;
pt = rm;
rm += len;
}
else pt = NULL_PTR;
return(pt);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -