Files
TAIXIN/sdk/lib/ui_vpp_ipf/ui_vpp_ipf_ctrl.c

159 lines
3.9 KiB
C
Raw Normal View History

#include "basic_include.h"
#include "lib/video/dvp/cmos_sensor/csi.h"
#include "lib/video/vpp/vpp_dev.h"
#include "ui_vpp_ipf_resource.h"
#include "lib/heap/av_heap.h"
#include "lib/heap/av_psram_heap.h"
// data申请空间函数
#define STREAM_MALLOC av_psram_malloc
#define STREAM_FREE av_psram_free
#define STREAM_ZALLOC av_psram_zalloc
// 结构体申请空间函数
#define STREAM_LIBC_MALLOC av_malloc
#define STREAM_LIBC_FREE av_free
#define STREAM_LIBC_ZALLOC av_zalloc
#define UI_VPP_IPF_RES_CACHE_NUM 2
struct ui_vpp_ipf_ctrl_priv
{
struct vpp_device *vpp_dev;
uint8_t *ui_vpp_ifp_flush_addr;
uint8_t *ui_vpp_ifp_res_cache[UI_VPP_IPF_RES_CACHE_NUM];
uint8_t ui_vpp_ifp_res_cache_num;
uint8_t ui_vpp_ipf_flush_flag;
uint8_t ui_vpp_ipf_ctrl_en;
};
static struct ui_vpp_ipf_ctrl_priv* g_ui_ipf_priv = NULL;
void ui_vpp_ipf_update_resource(void* img_data)
{
if (g_ui_ipf_priv == NULL) {
return ;
}
_ipf_img_resource_ *img_src = (_ipf_img_resource_*)img_data;
if (img_src == NULL) {
uint32_t flags = disable_irq();
g_ui_ipf_priv->ui_vpp_ipf_ctrl_en = 0;
g_ui_ipf_priv->ui_vpp_ipf_flush_flag = 1;
enable_irq(flags);
return ;
}
uint16_t width = 0;
uint16_t height = 0;
get_vpp_w_h(&width, &height);
uint32_t size = img_src->data_size;
uint8_t *data = g_ui_ipf_priv->ui_vpp_ifp_res_cache[g_ui_ipf_priv->ui_vpp_ifp_res_cache_num];
os_printf("####### ui_vpp_ipf_update_resource = %d \n", size);
hw_memset(data, 0, (width * height + width * height / 2));
os_memcpy(data, img_src->data, size);
sys_dcache_clean_range((uint32_t*)data, size);
uint32_t flags = disable_irq();
g_ui_ipf_priv->ui_vpp_ifp_flush_addr = data;
g_ui_ipf_priv->ui_vpp_ifp_res_cache_num ^= 1;
g_ui_ipf_priv->ui_vpp_ipf_ctrl_en = 1;
g_ui_ipf_priv->ui_vpp_ipf_flush_flag = 1;
enable_irq(flags);
}
int32_t ui_vpp_ipf_flush_irq(uint32 dev)
{
struct ui_vpp_ipf_ctrl_priv *ui_ipf_priv = (struct ui_vpp_ipf_ctrl_priv *)dev;
if(ui_ipf_priv->ui_vpp_ipf_flush_flag)
{
ui_ipf_priv->ui_vpp_ipf_flush_flag = 0;
if(ui_ipf_priv->ui_vpp_ipf_ctrl_en)
{
vpp_set_ifp_en(ui_ipf_priv->vpp_dev, 0);
vpp_set_ifp_addr(ui_ipf_priv->vpp_dev, (uint32_t)ui_ipf_priv->ui_vpp_ifp_flush_addr);
vpp_set_ifp_en(ui_ipf_priv->vpp_dev, 1);
}
else
{
vpp_set_ifp_en(ui_ipf_priv->vpp_dev, 0);
}
}
return 0;
}
void ui_vpp_ipf_ctrl_init()
{
uint16_t width = 0;
uint16_t height = 0;
struct vpp_device *vpp_dev = (struct vpp_device *)dev_get(HG_VPP_DEVID);
g_ui_ipf_priv = (struct ui_vpp_ipf_ctrl_priv*)STREAM_LIBC_ZALLOC(sizeof(struct ui_vpp_ipf_ctrl_priv));
if (!g_ui_ipf_priv) {
goto __err_exit;
}
get_vpp_w_h(&width, &height);
for (int i = 0; i < UI_VPP_IPF_RES_CACHE_NUM; i++) {
g_ui_ipf_priv->ui_vpp_ifp_res_cache[i] = STREAM_MALLOC(width * height + width * height / 2);
if (g_ui_ipf_priv->ui_vpp_ifp_res_cache[i] == NULL) {
goto __err_exit;
}
}
g_ui_ipf_priv->vpp_dev = vpp_dev;
g_ui_ipf_priv->ui_vpp_ifp_res_cache_num = 0;
vppdone_func_register(VPP_IFP_EN_CTRL, ui_vpp_ipf_flush_irq, (uint32_t)g_ui_ipf_priv);
os_printf("%s %d\n", __FUNCTION__, __LINE__);
return ;
__err_exit:
if (g_ui_ipf_priv) {
for (int i = 0; i < UI_VPP_IPF_RES_CACHE_NUM; i++) {
if (g_ui_ipf_priv->ui_vpp_ifp_res_cache[i]) {
STREAM_FREE(g_ui_ipf_priv->ui_vpp_ifp_res_cache[i]);
g_ui_ipf_priv->ui_vpp_ifp_res_cache[i] = NULL;
}
}
STREAM_LIBC_FREE(g_ui_ipf_priv);
g_ui_ipf_priv = NULL;
}
return ;
}
void ui_vpp_ipf_ctrl_deinit()
{
vppdone_func_unregister(VPP_IFP_EN_CTRL);
if (g_ui_ipf_priv) {
for (int i = 0; i < UI_VPP_IPF_RES_CACHE_NUM; i++) {
if (g_ui_ipf_priv->ui_vpp_ifp_res_cache[i]) {
STREAM_FREE(g_ui_ipf_priv->ui_vpp_ifp_res_cache[i]);
g_ui_ipf_priv->ui_vpp_ifp_res_cache[i] = NULL;
}
}
STREAM_LIBC_FREE(g_ui_ipf_priv);
g_ui_ipf_priv = NULL;
}
}