159 lines
3.9 KiB
C
159 lines
3.9 KiB
C
#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;
|
|
}
|
|
}
|
|
|
|
|