unsigned char * i2c_read(u8 *val, u32 n, u16 addr) { if (!i2c_free()) return NULL; i2c_start(); i2c_sendbyte(ST24C512_ADDR & 0xfe); i2c_waitack(); i2c_sendbyte(addr >> 8); i2c_waitack(); i2c_sendbyte(addr & 0xff); i2c_waitack(); i2c_start(); i2c_sendbyte(ST24C512_ADDR | 1); i2c_waitack(); n--; while (n--) { *val = i2c_recvbyte(); i2c_sendack(); val++; } *val = i2c_recvbyte(); i2c_sendnack(); i2c_stop(); return val; }
static int saa7111_write_block(struct saa7111 *dev, unsigned const char *data, unsigned int len) { int ack = -1; unsigned subaddr; while (len > 1) { LOCK_I2C_BUS(dev->bus); i2c_start(dev->bus); i2c_sendbyte(dev->bus, dev->addr, I2C_DELAY); ack = i2c_sendbyte(dev->bus, (subaddr = *data++), I2C_DELAY); ack = i2c_sendbyte(dev->bus, (dev->reg[subaddr] = *data++), I2C_DELAY); len -= 2; while (len > 1 && *data == ++subaddr) { data++; ack = i2c_sendbyte(dev->bus, (dev->reg[subaddr] = *data++), I2C_DELAY); len -= 2; } i2c_stop(dev->bus); UNLOCK_I2C_BUS(dev->bus); } return ack; }
void i2c_maven_write(unsigned char address, unsigned char data) { int error=0; i2c_start(); { error+=i2c_sendbyte(MAVEN_WRITE); error+=i2c_sendbyte(address); error+=i2c_sendbyte(data); } i2c_stop(); if (error>0) LOG(8,("I2C: MAVW ERROR - %x\n",error)); }
static int ak7343_write(struct i2c_client *client, unsigned long reg, unsigned long val) { int ret = 0; unsigned long mfp_pin[2]; unsigned long i2c0_mfps[] = { GPIO053_GPIO_53, /* SCL */ GPIO054_GPIO_54, /* SDA */ }; unsigned long scl, sda; scl = MFP_PIN_GPIO53; sda = MFP_PIN_GPIO54; i2c_lock_adapter(client->adapter); if (gpio_request(scl, "SCL")) { pr_err("Failed to request GPIO for SCL pin!\n"); ret = -1; goto out0; } if (gpio_request(sda, "SDA")) { pr_err("Failed to request GPIO for SDA pin!\n"); ret = -1; goto out1; }; mfp_pin[0] = mfp_read(MFP_PIN_GPIO53); mfp_pin[1] = mfp_read(MFP_PIN_GPIO54); mfp_config(i2c0_mfps, ARRAY_SIZE(i2c0_mfps)); i2c_start(scl, sda); if (i2c_sendbyte(scl, sda, (client->addr<<1) | 0) < 0) { ret = -1; goto out2; } if (i2c_sendbyte(scl, sda, (u8)reg) < 0) { ret = -1; goto out2; } if (i2c_sendbyte(scl, sda, (u8)val) < 0) { ret = -1; goto out2; } out2: i2c_stop(scl, sda); mfp_write(MFP_PIN_GPIO53, mfp_pin[0]); mfp_write(MFP_PIN_GPIO54, mfp_pin[1]); gpio_free(sda); out1: gpio_free(scl); out0: i2c_unlock_adapter(client->adapter); return ret; }
/********************************************************************** functionName:void pcf8563_set(uint8_t start,uint8_t num,uint8_t *buf) description:设置数据 **********************************************************************/ void pcf8563_set(uint8_t start,uint8_t num,uint8_t *buf) { uint8_t i; i2_start(); i2c_sendbyte(0xA2); i2c_wait_ack(); i2c_sendbyte(start); i2c_wait_ack(); for(i=0;i<num;i++) { i2c_sendbyte(buf[i]); i2c_wait_ack(); } i2_stop(); }
static int saa7110_read(struct saa7110* decoder) { int data; LOCK_I2C_BUS(decoder->bus); i2c_start(decoder->bus); i2c_sendbyte(decoder->bus, decoder->addr, I2C_DELAY); i2c_start(decoder->bus); i2c_sendbyte(decoder->bus, decoder->addr | 1, I2C_DELAY); data = i2c_readbyte(decoder->bus, 1); i2c_stop(decoder->bus); UNLOCK_I2C_BUS(decoder->bus); return data; }
/* ----------------------------------------------------------------------- */ static int saa7110_write(struct saa7110 *decoder, unsigned char subaddr, unsigned char data) { int ack; LOCK_I2C_BUS(decoder->bus); i2c_start(decoder->bus); i2c_sendbyte(decoder->bus, decoder->addr, I2C_DELAY); i2c_sendbyte(decoder->bus, subaddr, I2C_DELAY); ack = i2c_sendbyte(decoder->bus, data, I2C_DELAY); i2c_stop(decoder->bus); decoder->reg[subaddr] = data; UNLOCK_I2C_BUS(decoder->bus); return ack; }
static int saa7111_read(struct saa7111 *dev, unsigned char subaddr) { int data; LOCK_I2C_BUS(dev->bus); i2c_start(dev->bus); i2c_sendbyte(dev->bus, dev->addr, I2C_DELAY); i2c_sendbyte(dev->bus, subaddr, I2C_DELAY); i2c_start(dev->bus); i2c_sendbyte(dev->bus, dev->addr | 1, I2C_DELAY); data = i2c_readbyte(dev->bus, 1); i2c_stop(dev->bus); UNLOCK_I2C_BUS(dev->bus); return data; }
/*------------------------------------------- *PUBLIC functions */ int i2c_maven_read(unsigned char address) { int error=0; int data; i2c_start(); { error+=i2c_sendbyte(MAVEN_READ); error+=i2c_sendbyte(address); data = i2c_readbyte(0); } i2c_stop(); if (error>0) LOG(8,("I2C: MAVR ERROR - %x\n",error)); return data; }
int i2c_write(struct i2c_bus *bus, unsigned char addr, unsigned char data1, unsigned char data2, int both) { int ack; if (bus->i2c_write) return bus->i2c_write(bus, addr, data1, data2, both); i2c_start(bus); i2c_sendbyte(bus,addr,0); ack = i2c_sendbyte(bus,data1,0); if (both) ack = i2c_sendbyte(bus,data2,0); i2c_stop(bus); return ack ? -1 : 0 ; }
static int bt856_write(struct bt856 *dev, unsigned char subaddr, unsigned char data) { int ack; LOCK_I2C_BUS(dev->bus); i2c_start(dev->bus); i2c_sendbyte(dev->bus, dev->addr, I2C_DELAY); i2c_sendbyte(dev->bus, subaddr, I2C_DELAY); ack = i2c_sendbyte(dev->bus, data, I2C_DELAY); dev->reg[subaddr] = data; i2c_stop(dev->bus); UNLOCK_I2C_BUS(dev->bus); return ack; }
void i2c_read() { iic_Pull(); i2c_stop(); i2c_start(); i2c_sendbyte(0xa9); //addr if (ack) i2c_stop(); else { rdat1=i2c_recbyte(); //dat1 ack=0; i2c_ack(); delays(20); rdat2=i2c_recbyte(); //dat2 ack=1; i2c_ack(); delays(20); } delays(100); i2c_stop(); i2c_start(); i2c_sendbyte(0xa8); //addr if (ack) i2c_stop(); else { // i2c_sendbyte(g_u8LedTxDAT1); // if(ack) // i2c_stop(); // else // { // i2c_sendbyte(g_u8LedTxDAT2); // ack=1; // i2c_ack(); // delays(20); // } i2c_sendbyte(g_u8LedTxDAT1); ack=1; i2c_ack(); delays(20); } }
static void i2c_attach_device(struct i2c_bus *bus, struct i2c_driver *driver) { struct i2c_device *device; int i,j,ack=1; unsigned char addr; LOCK_FLAGS; /* probe for device */ LOCK_I2C_BUS(bus); for (addr = driver->addr_l; addr <= driver->addr_h; addr += 2) { i2c_start(bus); ack = i2c_sendbyte(bus,addr,0); i2c_stop(bus); if (!ack) break; } UNLOCK_I2C_BUS(bus); if (ack) return; /* got answer */ for (i = 0; i < I2C_DEVICE_MAX; i++) if (NULL == driver->devices[i]) break; if (I2C_DEVICE_MAX == i) return; for (j = 0; j < I2C_DEVICE_MAX; j++) if (NULL == bus->devices[j]) break; if (I2C_DEVICE_MAX == j) return; if (NULL == (device = kmalloc(sizeof(struct i2c_device),GFP_KERNEL))) return; device->bus = bus; device->driver = driver; device->addr = addr; /* Attach */ if (driver->attach(device)!=0) { kfree(device); return; } driver->devices[i] = device; driver->devcount++; bus->devices[j] = device; bus->devcount++; if (bus->attach_inform) bus->attach_inform(bus,driver->id); REGPRINT(printk("i2c: device attached: %s (addr=0x%02x, bus=%s, driver=%s)\n",device->name,addr,bus->name,driver->name)); }
/********************************************************************** functionName:void pcf8563_get(uint8_t start,uint8_t num,uint8_t *buf) description:获取数据 **********************************************************************/ void pcf8563_get(uint8_t start,uint8_t num,uint8_t *buf) { uint8_t i; i2_start(); i2c_sendbyte(0xA2); i2c_wait_ack(); i2c_sendbyte(start); i2c_wait_ack(); i2_start(); i2c_sendbyte(0xA3); i2c_wait_ack(); for (i=0;i<num;i++) { buf[i]=i2c_recv_byte(); if (i!=(num-1)) i2c_send_ack(); } i2c_send_notack(); i2_stop(); }
static int cambria_gpio_write(struct cambria_gpio_softc *sc) { device_t dev = sc->sc_dev; int error; error = iicbus_request_bus(device_get_parent(dev), dev, IIC_DONTWAIT); if (error) return (error); i2c_sendstart(sc); i2c_sendbyte(sc, PLD_ADDR & ~LSB); i2c_sendbyte(sc, sc->sc_latch); i2c_sendstop(sc); iicbus_release_bus(device_get_parent(dev), dev); return (0); }
inline void plat_init(void) { /* UART3 GPIO setup */ writel(GPIO_BASE, 0x628, 0x01); writel(GPIO_BASE, 0x62c, 0x01); /* I2C GPIO setup */ writel(GPIO_BASE, 0x2c4, 0x41); writel(GPIO_BASE, 0x2c8, 0x41); /* Disable PMIC WDT */ writel(I2C_BASE, 0x90, 0x60); i2c_sendbyte(0x68, 0x69); i2c_sendbyte(0x0b, 0x68); i2c_sendbyte(0x79, 0x6a); /* CPU speed settings */ writel(0x41340000, 0x00, 0x028fd218); asm volatile("mcr p14, 0, %0, c6, c0, 0"::"r"(2)); while (((readl(0x41340000, 0x04) >> 28) & 0x3) != 0x3); }
static int saa7110_write_block(struct saa7110* decoder, unsigned const char *data, unsigned int len) { unsigned subaddr = *data; LOCK_I2C_BUS(decoder->bus); i2c_start(decoder->bus); i2c_sendbyte(decoder->bus,decoder->addr,I2C_DELAY); while (len-- > 0) { if (i2c_sendbyte(decoder->bus,*data,0)) { i2c_stop(decoder->bus); UNLOCK_I2C_BUS(decoder->bus); return -EAGAIN; } decoder->reg[subaddr++] = *data++; } i2c_stop(decoder->bus); UNLOCK_I2C_BUS(decoder->bus); return 0; }
int i2c_read(struct i2c_bus *bus, unsigned char addr) { int ret; if (bus->i2c_read) return bus->i2c_read(bus, addr); i2c_start(bus); i2c_sendbyte(bus,addr,0); ret = i2c_readbyte(bus,1); i2c_stop(bus); return ret; }
static int saa7185_read(struct saa7185 *dev) { int ack; LOCK_I2C_BUS(dev->bus); i2c_start(dev->bus); i2c_sendbyte(dev->bus, dev->addr | 1, I2C_DELAY); ack = i2c_readbyte(dev->bus, 1); i2c_stop(dev->bus); UNLOCK_I2C_BUS(dev->bus); return ack; }
bool i2c_write(u8 *val, u32 n, u16 addr) { if (!i2c_free()) return FALSE; i2c_start(); i2c_sendbyte(ST24C512_ADDR & 0xfe); i2c_waitack(); i2c_sendbyte(addr >> 8); i2c_waitack(); i2c_sendbyte(addr & 0xff); i2c_waitack(); while (n--) { i2c_sendbyte(*val); i2c_waitack(); val++; } i2c_stop(); return TRUE; }
int i2c_register_bus(struct i2c_bus *bus) { int i,ack; LOCK_FLAGS; memset(bus->devices,0,sizeof(bus->devices)); bus->devcount = 0; for (i = 0; i < I2C_BUS_MAX; i++) if (NULL == busses[i]) break; if (I2C_BUS_MAX == i) return -ENOMEM; busses[i] = bus; bus_count++; REGPRINT(printk("i2c: bus registered: %s\n",bus->name)); MOD_INC_USE_COUNT; if (scan) { /* scan whole i2c bus */ LOCK_I2C_BUS(bus); for (i = 0; i < 256; i+=2) { i2c_start(bus); ack = i2c_sendbyte(bus,i,0); i2c_stop(bus); if (!ack) { printk(KERN_INFO "i2c: scanning bus %s: found device at addr=0x%02x\n", bus->name,i); } } UNLOCK_I2C_BUS(bus); } /* probe available drivers */ for (i = 0; i < I2C_DRIVER_MAX; i++) if (drivers[i]) i2c_attach_device(bus,drivers[i]); return 0; }
status_t i2c_maven_probe(void) { int ack; /*scan the bus for the MAVEN*/ i2c_start(); { ack = i2c_sendbyte(MAVEN_READ); } i2c_stop(); if (ack==0) { return B_OK; } else { return B_ERROR; } }
static int cambria_gpio_read(struct cambria_gpio_softc *sc, uint32_t pin, unsigned int *val) { device_t dev = sc->sc_dev; int error; error = iicbus_request_bus(device_get_parent(dev), dev, IIC_DONTWAIT); if (error) return (error); i2c_sendstart(sc); i2c_sendbyte(sc, PLD_ADDR | LSB); *val = (i2c_readbyte(sc) & (1 << pin)) != 0; i2c_sendstop(sc); iicbus_release_bus(device_get_parent(dev), dev); return (0); }