Initial commit: TXW82x FPV v2.7.0.7-42229 SDK + project sources
This commit is contained in:
158
sdk/lib/ui_vpp_ipf/ui_vpp_ipf_ctrl.c
Normal file
158
sdk/lib/ui_vpp_ipf/ui_vpp_ipf_ctrl.c
Normal file
@@ -0,0 +1,158 @@
|
||||
#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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user