⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c_armadillo9.c

📁 Hermit-at-1.1.3,一款bootloader
💻 C
字号:
#include <ep93xx/ioregs.h>#include <ep93xx/regs_eth.h>#include <target/io.h>#include "i2c_armadillo9.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 + -