📄 i2c_armadillo2x0.c
字号:
#include <ep93xx/ioregs.h>#include <ep93xx/regs_eth.h>#include <target/io.h>#include "i2c_armadillo2x0.h"#include "board.h"#define I2C_SDA_BIT BIT(4)#define I2C_SCL_BIT BIT(5)#define i2c_delay() udelay(10)static void i2c_set_sda(void){ IO_GPIO_PBDDR |= I2C_SDA_BIT; IO_GPIO_PBDR |= I2C_SDA_BIT; i2c_delay();}static void i2c_clr_sda(void){ IO_GPIO_PBDDR |= I2C_SDA_BIT; IO_GPIO_PBDR &= ~I2C_SDA_BIT; i2c_delay();}static int i2c_read_sda(void){ unsigned long val; IO_GPIO_PBDDR &= ~I2C_SDA_BIT; val = (IO_GPIO_PBDR & I2C_SDA_BIT); i2c_delay(); return (val ? 1 : 0);}static void i2c_set_scl(void){ IO_GPIO_PBDDR |= I2C_SCL_BIT; IO_GPIO_PBDR |= I2C_SCL_BIT; i2c_delay();}static void i2c_clr_scl(void){ IO_GPIO_PBDDR |= I2C_SCL_BIT; IO_GPIO_PBDR &= ~I2C_SCL_BIT; i2c_delay();}static int i2c_ack(void){ int timeout = 1000; IO_GPIO_PBDDR &= ~I2C_SDA_BIT; i2c_set_scl(); while(timeout--){ if(i2c_read_sda() == 0) break; } if(timeout < 0){ hprintf("timeout acknowledge\n"); return -1; } i2c_clr_scl(); return 0;}static int i2c_read(void){ unsigned char ch; unsigned char bit; int i; for(i=0, ch=0; i<8;i++){ i2c_set_scl(); bit = i2c_read_sda(); i2c_clr_scl(); ch |= (bit << (7-i)); } return (int)ch;}static void i2c_write(unsigned char ch){ unsigned char bit; int i; i2c_clr_scl(); for(i=0; i<8; i++){ bit = ((ch >> (7-i)) & 0x01); if(bit){ i2c_set_sda(); }else{ i2c_clr_sda(); } i2c_set_scl(); i2c_clr_scl(); }}static void i2c_start(void){ i2c_set_sda(); i2c_set_scl(); i2c_clr_sda(); i2c_clr_scl();}static void i2c_stop(void){ i2c_clr_scl(); i2c_clr_sda(); i2c_set_scl(); i2c_set_sda();}static void i2c_init(void){ i2c_stop();}static int eeprom_getc(unsigned long addr){ int ch; i2c_start(); //Control i2c_write(0xa0); if(i2c_ack() == -1){ i2c_stop(); return -1; } //Address i2c_write((unsigned char)addr); if(i2c_ack() == -1){ i2c_stop(); return -1; } i2c_start(); //Control i2c_write(0xa1); if(i2c_ack() == -1){ i2c_stop(); return -1; } //Data read ch = i2c_read(); i2c_stop(); return ch;}static int eeprom_putc(unsigned long addr, unsigned int ch){ i2c_start(); //Control i2c_write(0xa0); if(i2c_ack() == -1){ i2c_stop(); return -1; } //Address i2c_write((unsigned char)addr); if(i2c_ack() == -1){ i2c_stop(); return -1; } //Value i2c_write((unsigned char)ch); if(i2c_ack() == -1){ i2c_stop(); return -1; } i2c_stop(); mdelay(10); return 0;}int arch_get_mac(unsigned char *mac){ int i; int ch; i2c_init(); for(i=0; i<6; i++){ ch = eeprom_getc(i); if(ch == -1){ return -1; } mac[i] = ch; } return 0;}int arch_set_mac(unsigned char *mac){ int i; i2c_init(); for(i=0; i<6; i++){ eeprom_putc(i, mac[i]); } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -