158 lines
4.8 KiB
C
Executable File
158 lines
4.8 KiB
C
Executable File
#include <command.h>
|
|
#include <linux/lotus/i2c.h>
|
|
#include <common.h>
|
|
#include <asm/io.h>
|
|
|
|
|
|
#define BUF_LEN 8
|
|
|
|
|
|
extern int hal_i2c_init(unsigned char i2c_num);
|
|
extern int hal_i2c_recv(const struct i2c_client *client, unsigned int *buf, unsigned int count);
|
|
extern int hal_i2c_send(unsigned char i2c_num, unsigned short dev_addr, const char *buf,unsigned int count);
|
|
|
|
|
|
static int do_i2c_recv(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
|
|
{
|
|
unsigned int va_byte = 0;
|
|
int ret;
|
|
int i2c_num;
|
|
int reg_byte;
|
|
int data_byte;
|
|
unsigned short device_addr;
|
|
unsigned int reg;
|
|
struct i2c_client client = {0};
|
|
|
|
/* parse cmd args */
|
|
if(argc != 6) {
|
|
printf("invalid params\n");
|
|
return -1;
|
|
}
|
|
|
|
|
|
i2c_num = (unsigned int)simple_strtoul(argv[1], NULL, 10);
|
|
device_addr = (unsigned short)simple_strtoul(argv[2], NULL, 16);
|
|
reg = (unsigned int)simple_strtoul(argv[3], NULL, 16);
|
|
reg_byte = (unsigned int )simple_strtoul(argv[4], NULL, 10);
|
|
data_byte = (unsigned int )simple_strtoul(argv[5], NULL, 10);
|
|
|
|
printf("i2c paramaters:i2c_num[%d] device_addr[0x%x] reg[0x%x] reg_byte[%d] data_byte[%d]\n",i2c_num, device_addr, reg, reg_byte, data_byte);
|
|
|
|
client.i2c_num = i2c_num;
|
|
client.dev_addr = device_addr;
|
|
client.dev_addr = (client.dev_addr >> 1) & 0xff;
|
|
client.reg_addr = reg;
|
|
client.reg_width = reg_byte;
|
|
|
|
ret = hal_i2c_recv(&client, &va_byte, data_byte);
|
|
if (ret != 0) {
|
|
printf("[error] hal_i2c_recv err ret: %d\n", ret);
|
|
return 0;
|
|
}
|
|
printf("recv data va_byte[0x%x]\n",va_byte);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
static int do_i2c_send(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
|
|
{
|
|
int i2c_num;
|
|
int reg_byte;
|
|
int data_byte;
|
|
unsigned int idx = 0;
|
|
int ret;
|
|
char buf[BUF_LEN] = {0};
|
|
unsigned short device_addr;
|
|
unsigned int reg;
|
|
unsigned int data;
|
|
|
|
/* parse cmd args */
|
|
if(argc != 7) {
|
|
printf("invalid params\n");
|
|
return -1;
|
|
}
|
|
i2c_num = (unsigned int)simple_strtoul(argv[1], NULL, 10);
|
|
device_addr = (unsigned short)simple_strtoul(argv[2], NULL, 16);
|
|
reg = (unsigned int)simple_strtoul(argv[3], NULL, 16);
|
|
reg_byte = (unsigned int )simple_strtoul(argv[4], NULL, 10);
|
|
data = (unsigned int)simple_strtoul(argv[5], NULL, 16);
|
|
data_byte = (unsigned int )simple_strtoul(argv[6], NULL, 10);
|
|
|
|
printf("i2c paramaters:i2c_num[%d] device_addr[0x%x] reg[0x%x] reg_byte[%d] data[0x%x] data_byte[%d]\n",i2c_num, device_addr, reg, reg_byte, data, data_byte);
|
|
|
|
writel(0x1d01, 0x112C0030);
|
|
writel(0x1d01, 0x112C0034); /* i2c0 */
|
|
|
|
writel(0x1d01, 0x112C0038);
|
|
writel(0x1d01, 0x112C003C); /* i2c2 */
|
|
|
|
hal_i2c_init(i2c_num);
|
|
|
|
if (reg_byte == 1) { /* 1 byte */
|
|
buf[idx] = reg & 0xff;
|
|
idx++;
|
|
}else if(reg_byte == 2) { /* 2 byte */
|
|
buf[idx] = (reg >> 8) & 0xff; /* shift 8 */
|
|
idx++;
|
|
buf[idx] = reg & 0xff;
|
|
idx++;
|
|
}
|
|
|
|
if(data_byte == 1) { /* 1 byte */
|
|
buf[idx] = data & 0xff;
|
|
idx++;
|
|
}
|
|
else if (data_byte == 2) { /* 2 byte */
|
|
buf[idx] = (data >> 8) & 0xff; /* shift 8 */
|
|
idx++;
|
|
buf[idx] = data & 0xff;
|
|
idx++;
|
|
}
|
|
|
|
unsigned short i2c_addr = (device_addr >> 1);
|
|
const unsigned int buf_len = reg_byte + data_byte;
|
|
ret = hal_i2c_send(i2c_num, i2c_addr, buf, buf_len);
|
|
if (ret <= 0) {
|
|
printf("[error] hal_i2c_send err ret: %d\n", ret);
|
|
return -1;
|
|
}
|
|
if (ret != (reg_byte + data_byte)) {
|
|
printf("[error] hal_i2c_send error\n");
|
|
return -1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
* i2c recv test:for example 7205v200 volt sendor
|
|
* 1.i2c_recv 2 0x94 0x02 1 2
|
|
*/
|
|
U_BOOT_CMD(i2c_recv, 6, 1, do_i2c_recv,
|
|
"i2c_recv - i2c recv from device.\n"
|
|
"\t- i2c_recv [args i2c_num, device_addr,reg,reg_length, data_length]",
|
|
"\nargs: [i2c_num, device_addr,reg,reg_length, data_length]\n"
|
|
"\t-<i2c_num> : 0/1/2\n"
|
|
"\t-<device_addr> : 0x94\n"
|
|
"\t-<reg_addr> : 0xaa\n"
|
|
"\t-<reg_length>: 1\n"
|
|
"\t-<data_length>: 1\n");
|
|
|
|
|
|
/*
|
|
* i2c send test:for example 7205v200 volt sendor
|
|
* 1.i2c_send 2 0x94 0x00 1 0x3fff 2
|
|
* 2.i2c_send 2 0x94 0x05 1 0xa000 2
|
|
*/
|
|
U_BOOT_CMD(i2c_send, 7, 1, do_i2c_send,
|
|
"i2c_send - i2c send to device.\n"
|
|
"\t- i2c_send [args: i2c_num, device_addr,reg,reg_length,data, data_length]",
|
|
"\nargs: [i2c_num, device_addr,reg,reg_length,data, data_length]\n"
|
|
"\t-<i2c_num> : 0/1/2\n"
|
|
"\t-<device_addr> : 0x94\n"
|
|
"\t-<reg_addr> : 0xaa\n"
|
|
"\t-<reg_length>: 1\n"
|
|
"\t-<data> : 0x11\n"
|
|
"\t-<data_length>: 1\n");
|