Ejemplo n.º 1
0
Archivo: i2c.c Proyecto: Harry-Wu/C51
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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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));
}
Ejemplo n.º 4
0
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;
}
Ejemplo n.º 5
0
/**********************************************************************
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();
}
Ejemplo n.º 6
0
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;
}
Ejemplo n.º 7
0
/* ----------------------------------------------------------------------- */
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;
}
Ejemplo n.º 8
0
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;
}
Ejemplo n.º 9
0
/*-------------------------------------------
 *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;
}
Ejemplo n.º 10
0
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 ;
}
Ejemplo n.º 11
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;
}
Ejemplo n.º 12
0
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);
	}
}
Ejemplo n.º 13
0
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));
}
Ejemplo n.º 14
0
/**********************************************************************
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();
}
Ejemplo n.º 15
0
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);
}
Ejemplo n.º 16
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);
}
Ejemplo n.º 17
0
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;
}
Ejemplo n.º 18
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;
}
Ejemplo n.º 19
0
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;
}
Ejemplo n.º 20
0
Archivo: i2c.c Proyecto: Harry-Wu/C51
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;
}
Ejemplo n.º 21
0
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;
}
Ejemplo n.º 22
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;
	}
}
Ejemplo n.º 23
0
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);
}