nt9856x/code/hdal/ext_devices/ad/ad_common/ad_i2c.c
2023-03-28 15:07:53 +08:00

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;
}