/******************************************************************************* Function : Brief : reg common driver Input : Return : *******************************************************************************/ int reg_errcnt=0; #define HW32_REG(ADDRESS) (*((volatile unsigned long *)(ADDRESS))) // I2C Status In Master Transmitter Mode #define I2C_STA_MST_STA 0X08 #define I2C_STA_MST_RESTA 0X10 #define I2C_STA_MST_TX_ADDR_W_ACK 0x18 #define I2C_STA_MST_TX_ADDR_W_NACK 0x20 #define I2C_STA_MST_TX_DATA_ACK 0x28 #define I2C_STA_MST_TX_DATA_NACK 0x30 // I2C Status In Master Receiver Mode #define I2C_STA_MST_RX_ADDR_R_ACK 0x40 #define I2C_STA_MST_RX_ADDR_R_NACK 0x48 #define I2C_STA_MST_RX_DATA_ACK 0x50 #define I2C_STA_MST_RX_DATA_NACK 0x58 // I2C Status In Slave Receiver Mode #define I2C_STA_SLV_RX_ADDR_W_ACK 0x60 #define I2C_STA_SLV_RX_ARB_LOST_ADDR_ACK 0x68 #define I2C_STA_SLV_RX_REG_ADDR_ACK 0x70 #define I2C_STA_SLV_RX_ARB_LOST_REG_ADDR_ACK 0x78 #define I2C_STA_SLV_RX_DATA_ACK 0x80 #define I2C_STA_SLV_RX_DATA_NACK 0x88 #define I2C_STA_SLV_RX_PADDR_DATA_ACK 0x90 #define I2C_STA_SLV_RX_PADDR_DATA_NACK 0x98 #define I2C_STA_SLV_RX_STO_RSTA 0xA0 // I2C Status In Slave Transmitter Mode #define I2C_STA_SLV_TX_ADDR_R_ACK 0xA8 #define I2C_STA_SLV_TX_ARB_LOST_ADD_R_ACK 0XB0 #define I2C_STA_SLV_TX_DATA_ACK 0xB8 #define I2C_STA_SLV_TX_DATA_NACK 0xC0 #define I2C_STA_SLV_TX_LAST_DATA_ACK 0xC8 #define I2C_STA_SLV_TX_ARB_LOST 0X38 #define I2C_STA_SLV_TX_NO_STA 0XF8 #define I2C_STA_MISC_BUS_ERR 0x00 #define I2C_STA_SLV_TX_ARB_LOST 0X38 //#define I2C_STA_SLV_TX_NO_STA 0XF8 #define I2C_STA_MISC_BUS_ERR 0x00 static void delay_for_character(void) { int i; for (i=0; i<2;i++){ __ISB(); } return; } static void delay2(void) { int i; for (i=0; i<50;i++){ __ISB(); } return; } static void fw_read_check_with_warn(uint32_t address, uint32_t expect_data, uint32_t read_bits) { if( (HW32_REG(address)&read_bits)!=(expect_data&read_bits)){ reg_errcnt++; printf("ERROR:RW bit, the expected %x, actual %x for address %x\n",expect_data&read_bits,HW32_REG(address),address); } //if( (HW32_REG(address)&read_bits)!=(expect_data&read_bits)) // printf("WARN:RO bit, the expected %x, actual %x for address %x\n",expect_data,HW32_REG(address),address); } static void fw_write_check_protect(uint32_t address, uint32_t expect_data) { HW32_REG(address) = expect_data; if(HW32_REG(address)!=0x00000000){ reg_errcnt++; printf("ERROR:PROTECT bit, the expected %x, actual %x for address %x\n",0x00000000,HW32_REG(address),address); } } static void fw_write_check_with_warn(uint32_t address, uint32_t expect_data, uint32_t read_bits) { HW32_REG(address) = expect_data; delay_for_character(); if( (HW32_REG(address)&read_bits)!=(expect_data&read_bits)){ reg_errcnt++; printf("ERROR:RW bit, the expected %x, actual %x for address %x\n",expect_data&read_bits,HW32_REG(address),address); } //if( (HW32_REG(address)&read_bits)!=(expect_data&read_bits)) // printf("WARN:RO bit, the expected %x, actual %x for address %x\n",expect_data,HW32_REG(address),address); } //------------------------------------------// // Name: Qingqing He // Function: check wc_reg // Arguments:the value read from wc reg is always 0 // exp_val: //------------------------------------------// static void fw_write_check_wc_reg(uint32_t address,uint32_t write_data, uint32_t expect_data, uint32_t read_bits) { HW32_REG(address) = write_data; delay_for_character(); if( (HW32_REG(address)&read_bits)!=(expect_data&read_bits)){ reg_errcnt++; printf("ERROR:RW bit, the expected %x, actual %x for address %x\n",expect_data&read_bits,HW32_REG(address),address); } } //------------------------------------------// // Function: config func i2c //------------------------------------------// static void config_func_i2c(void) { int i = 0 ; int smb_sel_tmout = 0; int con_reg; printf("Enable func i2c master\n"); REG_I2C_MASTER_I2CCON->bf.ens1 = 1; delay2(); REG_I2C_MASTER_I2CADR->bf.adr = 0x48; delay2(); REG_I2C_MASTER_I2CCON->bf.aa = 1; delay2(); con_reg = REG_I2C_MASTER_I2CCON -> word; //REG_CLKCTRL_PIN_MUL_SET->bf.gp67_i2c_role = 1; //8849 printf("set slave address to 0x48\n"); REG_I2C_MASTER_I2CADR->bf.adr = 0x48; } static void config_func_i2c1(void) { int i = 0 ; int smb_sel_tmout = 0; int con_reg; printf("Enable func i2c master\n"); REG_I2C1_MASTER_I2CCON->bf.ens1 = 1; delay2(); REG_I2C1_MASTER_I2CADR->bf.adr = 0x48; delay2(); REG_I2C1_MASTER_I2CCON->bf.aa = 1; delay2(); con_reg = REG_I2C1_MASTER_I2CCON -> word; //REG_CLKCTRL_PIN_MUL_SET->bf.gp67_i2c_role = 1; //8849 printf("set slave address to 0x48\n"); REG_I2C1_MASTER_I2CADR->bf.adr = 0x48; } static void fw_set_protect(void) { HW32_REG(0x4001401C) = 0x00000000; } static void fw_unset_protect(void) { HW32_REG(0x4001401C) = 0x00009A6E; } static void fw_unset_protect1(void) { HW32_REG(0x4001204C) = 0x00008E9F; }