MTk i2c读写例子

xiaoxiao2021-02-28  11

FIFO MODE (<= 8 byte): static int i2c_write(struct i2c_client *client, uint8_t regaddr, uint8_t txbyte, uint8_t *data) { int ret = 0; unsigned char buffer[8]; struct i2c_msg msg; memset(&msg, 0, sizeof(struct i2c_msg)); buffer[0] = regaddr; memcpy((buffer + 1),data,txbyte); msg.addr = client->addr; msg.flags = 0; msg.len = txbyte+1; msg.buf = buffer; // msg.timing = 100;  //i2c speed KHz, if not set timing, i2c driver will use default speed 100K ret = i2c_transfer(client->adapter, &msg, 1); if (ret != 1) { //error } return ret; } static int i2c_read(struct i2c_client *client, uint8_t regaddr, uint8_t rxbyte, uint8_t *data) { int ret = 0; unsigned char buffer[8]; struct i2c_msg msg; memset(&msg, 0, sizeof(struct i2c_msg)); buffer[0] = regaddr; msg.addr = client->addr; msg.flags = 0; msg.len = ((rxbyte & 0xff)<<8) | 1; msg.buf = buffer; msg.ext_flag = I2C_WR_FLAG | I2C_RS_FLAG; // msg.timing = 100; ret = i2c_transfer(client->adapter, &msg, 1); if (ret != 1) { //error } memcpy(data, buffer, rxbyte); return ret; } DMA MODE (> 8 byte): static int i2c_write_dma(struct i2c_client *client, uint8_t regaddr, uint8_t txbyte, uint8_t *data) { uint8_t *v_buf = NULL; dma_addr_t p_buf; int ret = 0; struct i2c_msg msg; memset(&msg, 0, sizeof(struct i2c_msg)); v_buf = dma_alloc_coherent(&(client->adapter->dev), txbyte, &p_buf, GFP_KERNEL|GFP_DMA32); *v_buf = regaddr; memcpy((v_buf + 1), data, txbyte); msg.addr = client->addr; msg.flags = 0; msg.len = txbyte + 1; msg.buf = (uint8_t *)p_buf; msg.ext_flag |= I2C_DMA_FLAG; // msg.timing = 100; ret = i2c_transfer(client->adapter, &msg, 1); if (ret != 1) { //error } dma_free_coherent(&(client->adapter->dev), txbyte, v_buf, p_buf); return ret; } static int i2c_read_dma(struct i2c_client *client, uint8_t regaddr, uint8_t rxbyte, uint8_t *data)  { uint8_t *v_buf = NULL; dma_addr_t p_buf; int ret = 0; struct i2c_msg msg; memset(&msg, 0, sizeof(struct i2c_msg)); // client->adapter->dev.coherent_dma_mask = DMA_BIT_MASK(32); // client->adapter->dev.dma_mask = &client->adapter->dev.coherent_dma_mask; v_buf = dma_alloc_coherent(&(client->adapter->dev), rxbyte, &p_buf, GFP_KERNEL|GFP_DMA32); *v_buf = regaddr; msg.addr = client->addr; msg.flags = 0; msg.len = ((rxbyte & 0xff)<<8) | 1; msg.buf = (uint8_t *)p_buf; msg.ext_flag = I2C_WR_FLAG | I2C_RS_FLAG | I2C_DMA_FLAG; // msg.timing = 100; ret = i2c_transfer(client->adapter, &msg, 1); if(ret != 1) { //error } memcpy(data, v_buf, rxbyte); dma_free_coherent(&(client->adapter->dev), rxbyte, v_buf, p_buf); return ret; }
转载请注明原文地址: https://www.6miu.com/read-250020.html

最新回复(0)