150 lines
3.0 KiB
C
Executable File
150 lines
3.0 KiB
C
Executable File
#ifdef __KERNEL__
|
|
#include <linux/i2c.h>
|
|
#else
|
|
#include <stdio.h>
|
|
#define i2c_put_adapter(adapt)
|
|
#endif
|
|
|
|
#include "kflow_videocapture/ctl_sen.h"
|
|
#include "ad_i2c_int.h"
|
|
#include "ad_dbg_int.h"
|
|
|
|
#if defined(__FREERTOS)
|
|
static struct i2c_board_info i2c_device_tab[CTL_SEN_ID_MAX] = {
|
|
};
|
|
#endif
|
|
|
|
static struct i2c_client *i2c_client_tab[CTL_SEN_ID_MAX] = {
|
|
[0 ... (CTL_SEN_ID_MAX-1)] = NULL
|
|
};
|
|
|
|
#if defined(__FREERTOS)
|
|
static struct i2c_board_info* ad_get_i2c_device(UINT32 id)
|
|
{
|
|
if (id >= CTL_SEN_ID_MAX) {
|
|
DBG_ERR("id(%d) overflow\r\n", id);
|
|
return NULL;
|
|
}
|
|
return &i2c_device_tab[id];
|
|
}
|
|
#endif
|
|
|
|
static struct i2c_client* ad_get_i2c_client(UINT32 id)
|
|
{
|
|
if (id >= CTL_SEN_ID_MAX) {
|
|
DBG_ERR("id(%d) overflow\r\n", id);
|
|
return NULL;
|
|
}
|
|
return i2c_client_tab[id];
|
|
}
|
|
|
|
static void ad_set_i2c_client(UINT32 id, struct i2c_client *client)
|
|
{
|
|
if (id >= CTL_SEN_ID_MAX) {
|
|
DBG_ERR("id(%d) overflow\r\n", id);
|
|
return;
|
|
}
|
|
i2c_client_tab[id] = client;
|
|
}
|
|
|
|
#if defined(__FREERTOS)
|
|
ER AD_UTIL_DECLARE_FUNC(ad_i2c_init_driver)(char *name, UINT32 id, AD_I2C_ID i2c_id, UINT32 slave_addr)
|
|
{
|
|
ER rt = E_SYS;
|
|
|
|
struct i2c_client *client;
|
|
struct i2c_adapter *adapt;
|
|
struct i2c_board_info *board;
|
|
|
|
client = ad_get_i2c_client(id);
|
|
if (client != NULL) {
|
|
DBG_ERR("id(%d) client is not null\r\n", id);
|
|
return rt;
|
|
}
|
|
|
|
adapt = i2c_get_adapter(i2c_id);
|
|
if (adapt == NULL) {
|
|
DBG_ERR("id(%d) i2c_get_adapter(%d) fail\r\n", id, i2c_id);
|
|
return rt;
|
|
}
|
|
|
|
board = ad_get_i2c_device(id);
|
|
if (board == NULL) {
|
|
goto err;
|
|
}
|
|
|
|
//set board name
|
|
snprintf(board->type, sizeof(board->type), "%s_%d", name, (int)id);
|
|
board->addr = slave_addr;
|
|
client = i2c_new_device(adapt, board);
|
|
if (client == NULL) {
|
|
DBG_ERR("id(%d) i2c_new_device fail.\r\n", id);
|
|
goto err;
|
|
}
|
|
ad_set_i2c_client(id, client);
|
|
rt = E_OK;
|
|
|
|
err:
|
|
i2c_put_adapter(adapt);
|
|
return rt;
|
|
}
|
|
|
|
ER AD_UTIL_DECLARE_FUNC(ad_i2c_uninit_driver)(UINT32 id)
|
|
{
|
|
struct i2c_client *org_client;
|
|
|
|
org_client = ad_get_i2c_client(id);
|
|
if (org_client != NULL)
|
|
{
|
|
i2c_unregister_device(org_client);
|
|
}
|
|
ad_set_i2c_client(id, NULL);
|
|
return E_OK;
|
|
}
|
|
#else
|
|
ER AD_UTIL_DECLARE_FUNC(ad_i2c_init_driver)(UINT32 id, struct i2c_client *client)
|
|
{
|
|
ER rt = E_SYS;
|
|
struct i2c_client *org_client;
|
|
|
|
org_client = ad_get_i2c_client(id);
|
|
if (org_client != NULL) {
|
|
DBG_ERR("id(%d) client is not null\r\n", id);
|
|
return rt;
|
|
}
|
|
|
|
if (client == NULL) {
|
|
DBG_ERR("input client is null\r\n");
|
|
return rt;
|
|
}
|
|
rt = E_OK;
|
|
ad_set_i2c_client(id, client);
|
|
return rt;
|
|
}
|
|
|
|
ER AD_UTIL_DECLARE_FUNC(ad_i2c_uninit_driver)(UINT32 id)
|
|
{
|
|
ad_set_i2c_client(id, NULL);
|
|
return E_OK;
|
|
}
|
|
#endif
|
|
|
|
INT32 AD_UTIL_DECLARE_FUNC(ad_i2c_transfer)(UINT32 id, struct i2c_msg *msgs, INT32 num)
|
|
{
|
|
INT i2c_num;
|
|
struct i2c_client *client;
|
|
|
|
client = ad_get_i2c_client(id);
|
|
if (client == NULL) {
|
|
DBG_ERR("id(%d) client is null\r\n", id);
|
|
return -1;
|
|
}
|
|
|
|
i2c_num = i2c_transfer(client->adapter, msgs, num);
|
|
if (i2c_num != num) {
|
|
DBG_ERR("id(%d) i2c_transfer fail. \r\n", id);
|
|
return -1;
|
|
}
|
|
return 0;
|
|
}
|