Initial commit: TXW82x FPV v2.7.0.7-42229 SDK + project sources

This commit is contained in:
2026-07-06 11:30:13 +08:00
commit e76462eeb7
3451 changed files with 1415300 additions and 0 deletions

838
sdk/driver/vpp/hgvpp_v3.c Normal file
View File

@@ -0,0 +1,838 @@
#include "typesdef.h"
#include "errno.h"
#include "osal/irq.h"
#include "devid.h"
#include "dev/vpp/hgvpp.h"
#include "osal/string.h"
struct hgvpp_hw
{
__IO uint32_t CON;
__IO uint32_t CON1;
__IO uint32_t SIZE;
__IO uint32_t DLT;
__IO uint32_t DHT;
__IO uint32_t STA;
__IO uint32_t DMA_YADR;
__IO uint32_t DMA_UADR;
__IO uint32_t DMA_VADR;
__IO uint32_t DMA_YADR1;
__IO uint32_t DMA_UADR1;
__IO uint32_t DMA_VADR1;
__IO uint32_t IWM0_CON;
__IO uint32_t IWM0_CON1;
__IO uint32_t IWM0_SIZE;
__IO uint32_t IWM0_YUV;
__IO uint32_t IWM0_YUV1;
__IO uint32_t IWM0_LADR;
__IO uint32_t IWM0_HADR;
__IO uint32_t IWM0_IDX0;
__IO uint32_t IWM0_IDX1;
__IO uint32_t IWM0_IDX2;
__IO uint32_t IWM1_CON;
__IO uint32_t IWM1_SIZE;
__IO uint32_t IWM1_YUV;
__IO uint32_t IWM1_LADR;
__IO uint32_t IPF_SADR;
__IO uint32_t MD_CON;
__IO uint32_t MD_WIN_CON0;
__IO uint32_t MD_WIN_CON1;
__IO uint32_t MD_BASE_ADDR;
__IO uint32_t ITP_PSRAM_YADR;
__IO uint32_t ITP_PSRAM_UADR;
__IO uint32_t ITP_PSRAM_VADR;
__IO uint32_t FRM_PSRAM_YCNT;
__IO uint32_t FRM_PSRAM_UVCNT;
__IO uint32_t FRM1_PSRAM_YCNT;
__IO uint32_t FRM1_PSRAM_UVCNT;
};
vpp_irq_hdl vppirq_vector_table[VPP_IRQ_NUM];
volatile uint32 vppirq_dev_table[VPP_IRQ_NUM];
extern volatile uint8 isp_ov_err;
static int32 hgvpp_ioctl(struct vpp_device *p_vpp, enum vpp_ioctl_cmd ioctl_cmd, uint32 param1, uint32 param2)
{
int32 ret_val = RET_OK;
uint32 w,h,num;
uint32 x_s,y_s,x_e,y_e;
//uint32 *size_array;
struct hgvpp *vpp_hw = (struct hgvpp*)p_vpp;
struct hgvpp_hw *hw = (struct hgvpp_hw *)vpp_hw->hw;
switch(ioctl_cmd){
case VPP_IOCTL_CMD_ITP_AUTO_CLOSE:
if(param1)
hw->CON &= ~BIT(30);
else
hw->CON |= BIT(30);
break;
case VPP_IOCTL_CMD_ITP_Y_ADDR:
hw->ITP_PSRAM_YADR = param1;
break;
case VPP_IOCTL_CMD_ITP_U_ADDR:
hw->ITP_PSRAM_UADR = param1;
break;
case VPP_IOCTL_CMD_ITP_V_ADDR:
hw->ITP_PSRAM_VADR = param1;
break;
case VPP_IOCTL_CMD_ITP_EN:
if(param1)
hw->CON |= BIT(29);
else
hw->CON &= ~BIT(29);
break;
case VPP_IOCTL_CMD_SET_TAKE_PHOTO_LINEBUF:
if(param1 < 8){
hw->CON1 &= ~(0x7<<10);
hw->CON1 |= (param1<<10);
}
break;
case VPP_IOCTL_CMD_DIS_UV_MODE:
if(param1)
hw->CON |= BIT(4);
else
hw->CON &= ~BIT(4);
if(param2){
hw->CON1 |= BIT(5);
}else{
hw->CON1 &= ~BIT(5);
}
break;
case VPP_IOCTL_CMD_SET_THRESHOLD:
hw->DLT = param1;
hw->DHT = param2;
break;
case VPP_IOCTL_CMD_SET_WATERMARK0_RC:
if(param1)
hw->IWM0_CON |= BIT(5);
else
hw->IWM0_CON &= ~BIT(5);
break;
case VPP_IOCTL_CMD_SET_WATERMARK1_RC:
if(param1)
hw->IWM1_CON |= BIT(5);
else
hw->IWM1_CON &= ~BIT(5);
break;
case VPP_IOCTL_CMD_SET_WATERMARK0_COLOR:
hw->IWM0_YUV = param1;
break;
case VPP_IOCTL_CMD_SET_WATERMARK1_COLOR:
hw->IWM1_YUV = param1;
break;
case VPP_IOCTL_CMD_SET_WATERMARK0_BMPADR:
hw->IWM0_LADR = param1;
break;
case VPP_IOCTL_CMD_SET_WATERMARK1_BMPADR:
hw->IWM1_LADR = param1;
break;
case VPP_IOCTL_CMD_SET_WATERMARK0_LOCATED:
hw->IWM0_CON &= ~(0x1ff<<15);
hw->IWM0_CON &= ~(0xff<<24);
hw->IWM0_CON |= (((param1&0Xff00)>>8)<<24);
hw->IWM0_CON |= ((param1&0Xff)<<15);
break;
case VPP_IOCTL_CMD_SET_WATERMARK1_LOCATED:
hw->IWM1_CON &= ~(0xff<<16);
hw->IWM1_CON &= ~(0xff<<24);
hw->IWM1_CON |= (((param1&0Xff00)>>8)<<24);
hw->IWM1_CON |= ((param1&0Xff)<<16);
break;
case VPP_IOCTL_CMD_SET_WATERMARK0_CONTRAST:
hw->IWM0_CON &= ~(0x7<<2);
hw->IWM0_CON |= (param1<<2);
break;
case VPP_IOCTL_CMD_SET_WATERMARK1_CONTRAST:
hw->IWM1_CON &= ~(0x7<<2);
hw->IWM1_CON |= (param1<<2);
break;
case VPP_IOCTL_CMD_SET_WATERMARK0_CHAR_SIZE_AND_NUM:
w = param1&0xff;
h = ((param1&0xff00)>>8)&0xff;
num = param2&0xff;
hw->IWM0_SIZE &= ~(0x1f<<0);
hw->IWM0_SIZE |= (num<<0);
hw->IWM0_SIZE &= ~(0x3f<<5);
hw->IWM0_SIZE |= (w<<5);
hw->IWM0_SIZE &= ~(0x3ff<<12);
hw->IWM0_SIZE |= ((w*num)<<12);
hw->IWM0_SIZE &= ~(0xff<<23);
hw->IWM0_SIZE |= (h<<23);
break;
case VPP_IOCTL_CMD_SET_WATERMARK0_CHAR_IDX:
if(param2 > 23)
return ret_val;
if(param2 < 8){
hw->IWM0_IDX0 &= ~(0xf<<(param2*4));
hw->IWM0_IDX0 |= (param1<<(param2*4));
}
else if(param2 < 16){
hw->IWM0_IDX1 &= ~(0xf<<((param2-8)*4));
hw->IWM0_IDX1 |= (param1<<((param2-8)*4));
}else{
hw->IWM0_IDX2 &= ~(0xf<<((param2-16)*4));
hw->IWM0_IDX2 |= (param1<<((param2-16)*4));
}
break;
case VPP_IOCTL_CMD_SET_WATERMARK1_PHOTO_SIZE:
w = param1&0xff;
h = ((param1&0xff00)>>8)&0xff;
hw->IWM1_SIZE &= ~(0xff<<12);
hw->IWM1_SIZE |= (w<<12);
hw->IWM1_SIZE &= ~(0xff<<23);
hw->IWM1_SIZE |= (h<<23);
break;
case VPP_IOCTL_CMD_SET_WATERMARK0_MODE:
if(param1)
hw->IWM0_CON |= BIT(1);
else
hw->IWM0_CON &= ~BIT(1);
break;
case VPP_IOCTL_CMD_SET_WATERMARK1_MODE:
if(param1)
hw->IWM1_CON |= BIT(1);
else
hw->IWM1_CON &= ~BIT(1);
break;
case VPP_IOCTL_CMD_SET_WATERMARK0_EN:
if(param1)
hw->IWM0_CON |= BIT(0);
else
hw->IWM0_CON &= ~BIT(0);
break;
case VPP_IOCTL_CMD_SET_WATERMARK1_EN:
if(param1)
hw->IWM1_CON |= BIT(0);
else
hw->IWM1_CON &= ~BIT(0);
break;
case VPP_IOCTL_CMD_SET_MOTION_DET_EN:
if(param1){
//hw->MD_CON &= ~(0x1f<<18);
//hw->MD_CON |= (BIT(23));
hw->MD_CON |= BIT(0);
}
else{
hw->MD_CON &= ~BIT(0);
}
break;
case VPP_IOCTL_CMD_SET_MOTION_ALL_FRAME_OR_WINDOW:
if(param1 == 0){
hw->MD_CON |= (BIT(26));
}
else{
hw->MD_CON &= ~BIT(26);
}
break;
case VPP_IOCTL_CMD_SET_MOTION_CALBUF:
hw->MD_BASE_ADDR = param1;
break;
case VPP_IOCTL_CMD_SET_MOTION_RANGE:
x_s = param1&0xfff;
y_s = ((param1&0xfff0000)>>16)&0xfff;
x_e = param2&0xfff;
y_e = ((param2&0xfff0000)>>16)&0xfff;
//hw->MD_WIN_CON0 = param1;
//hw->MD_WIN_CON1 = param1;
hw->MD_WIN_CON0 = (x_s | (y_s<<16));
hw->MD_WIN_CON1 = ((x_e-1) | ((y_e-1)<<16));
break;
case VPP_IOCTL_CMD_SET_MOTION_BLK_THRESHOLD:
param1 = param1&0xff;
hw->MD_CON &= ~(0xff<<1);
hw->MD_CON |= (param1<<1);
break;
case VPP_IOCTL_CMD_SET_MOTION_FRAME_THRESHOLD:
param1 = param1&0xfff;
hw->MD_CON &= ~(0xfff<<9);
hw->MD_CON |= (param1<<9);
break;
case VPP_IOCTL_CMD_SET_MOTION_FRAME_INTERVAL:
param1 = param1&0x1f;
hw->MD_CON &= ~(0x1f<<21);
hw->MD_CON |= (param1<<21);
break;
case VPP_IOCTL_CMD_SET_IFP_ADDR:
hw->IPF_SADR = param1;
break;
case VPP_IOCTL_CMD_SET_IFP_EN:
if(param1){
hw->CON |= BIT(28);
}
else{
hw->CON &= ~BIT(28);
}
break;
case VPP_IOCTL_CMD_SET_MODE:
if(param1){
hw->CON |= BIT(1);
//os_printf("vpp input raw or rgb888\r\n");
}
else{
hw->CON &= ~BIT(1);
//os_printf("vpp input YUV422\r\n");
}
break;
case VPP_IOCTL_CMD_SET_SIZE:
w = param1;
h = param2;
if(w%16 != 0){
os_printf("###############################warning image_w no align 16 Byte##################################################\r\n");
}
if(h%8 != 0){
os_printf("###############################warning image_h no align 8 Byte##################################################\r\n");
}
hw->SIZE = (h<<12) | (w<<0);
break;
case VPP_IOCTL_CMD_SET_YCBCR:
if(param1 > 3){
os_printf("set ycbcr error:%d\r\n",param1);
}
hw->CON &= ~(BIT(2)|BIT(3));
hw->CON |= param1<<2;
break;
case VPP_IOCTL_CMD_BUF0_CNT:
if(param1 > 16){
os_printf("set buf0 error:%d\r\n",param1);
}
hw->CON &= ~(0x0f<<9);
hw->CON |= (param1<<9);
break;
case VPP_IOCTL_CMD_BUF1_CNT:
if(param1 > 16){
os_printf("set buf1 error:%d\r\n",param1);
}
hw->CON1 &= ~(0x0f<<6);
hw->CON1 |= (param1<<6);
break;
case VPP_IOCTL_CMD_BUF0_EN:
if(param1)
hw->CON |= BIT(8);
else
hw->CON &= ~BIT(8);
break;
case VPP_IOCTL_CMD_BUF1_EN:
if(param1)
hw->CON1 |= BIT(1);
else
hw->CON1 &= ~BIT(1);
break;
case VPP_IOCTL_CMD_FTUSB3_EN:
if(param1)
hw->CON1 |= BIT(0);
else
hw->CON1 &= ~BIT(0);
break;
case VPP_IOCTL_CMD_BUF1_SHRINK:
hw->CON1 &= ~(0x07<<2);
hw->CON1 |= (param1<<2); //0: 1/2
//1: 1/3
//2: 1/4
//3: 1/6
//4: 2/3
//5: 1/1
break;
case VPP_IOCTL_CMD_INPUT_INTERFACE:
hw->CON &= ~(0x07<<5);
hw->CON |= (param1<<5);
break;
case VPP_IOCTL_CMD_BUF0_Y_ADDR:
hw->DMA_YADR = param1;
break;
case VPP_IOCTL_CMD_BUF0_U_ADDR:
hw->DMA_UADR = param1;
break;
case VPP_IOCTL_CMD_BUF0_V_ADDR:
hw->DMA_VADR = param1;
break;
case VPP_IOCTL_CMD_BUF1_Y_ADDR:
hw->DMA_YADR1 = param1;
break;
case VPP_IOCTL_CMD_BUF1_U_ADDR:
hw->DMA_UADR1 = param1;
break;
case VPP_IOCTL_CMD_BUF1_V_ADDR:
hw->DMA_VADR1 = param1;
break;
// case VPP_IOCTL_CMD_ISP_CONFIG:
// hw->CON = 0;
// hw->CON |= 0x3 << 20;
// hw->CON |= 0x3 << 5;
// hw->CON |= 0x1 << 1;
// hw->CON1 |= 0x1 << 0;
// hw->CON |= BIT(0);
// break;
case VPP_IOCTL_CMD_GET_STA:
ret_val = hw->STA;
break;
case VPP_IOCTL_CMD_PSRAM_YCNT:
w = param1;
h = param2;
hw->FRM_PSRAM_YCNT = (w*h)/4 -1;
break;
case VPP_IOCTL_CMD_PSRAM_UVCNT:
w = param1;
h = param2;
hw->FRM_PSRAM_UVCNT = (w*h)/16 -1;
break;
case VPP_IOCTL_CMD_PSRAM1_YCNT:
w = param1;
h = param2;
hw->FRM1_PSRAM_YCNT = (w*h)/4 -1;
break;
case VPP_IOCTL_CMD_PSRAM1_UVCNT:
w = param1;
h = param2;
hw->FRM1_PSRAM_UVCNT = (w*h)/16 -1;
break;
case VPP_IOCTL_CMD_FRAME_SAVE_NO_SRAM:
hw->CON1 &= ~(3<<13);
if(param1 == 1){
hw->CON1 |= (1<<13);
}else if(param1 == 2){
hw->CON1 |= (2<<13);
}
break;
case VPP_IOCTL_CMD_F1_SAVE_NO_SRAM:
if(param1 == 1){ //frame1 save
hw->CON1 |= BIT(15); //enable
}else{
hw->CON1 &= ~BIT(15); //disable
}
break;
case VPP_IOCTL_CMD_GET_F0_IS_PSRAM:
if((hw->CON1 & (3<<13)) == (1<<13)){
ret_val = 1;
}else{
ret_val = 0;
}
break;
case VPP_IOCTL_CMD_GET_F1_IS_PSRAM:
if((hw->CON1 & (3<<13)) == (2<<13)){
ret_val = 1;
}else if((hw->CON1 & BIT(15)) == BIT(15)){
ret_val = 1;
}else{
ret_val = 0;
}
break;
case VPP_IOCTL_CMD_GET_F0_IS_ENABLE:
if(hw->CON&BIT(8)){
ret_val = 1;
}else{
ret_val = 0;
}
break;
case VPP_IOCTL_CMD_GET_F1_IS_ENABLE:
if(hw->CON1&BIT(1)){
ret_val = 1;
}else{
ret_val = 0;
}
break;
case VPP_IOCTL_CMD_GET_F1_MODE:
if(hw->CON1&BIT(17)){
ret_val = 1; //2N mode
}else{
ret_val = 0; //16+2n mode
}
break;
case VPP_IOCTL_CMD_GET_F1_SHRINK:
ret_val = (hw->CON1&0x07)>>2;
break;
case VPP_IOCTL_CMD_SRAMBUFF_CNT_MODE:
if(param1 == 1){ //VPP BUF0
hw->CON1 |= BIT(16); //2N
}else{
hw->CON1 &= ~BIT(16); //16+2N
}
if(param2 == 1){ //VPP BUF1
hw->CON1 |= BIT(17); //2N
}else{
hw->CON1 &= ~BIT(17); //16+2N
}
break;
case VPP_IOCTL_CMD_SCALEBUF_SELECT:
if(param1 == 1){ //SCALE1
hw->CON1 |= BIT(18); //BUF 1
}else{
hw->CON1 &= ~BIT(18); //BUF 0
}
if(param2 == 1){ //SCALE3
hw->CON1 |= BIT(19); //BUF 1
}else{
hw->CON1 &= ~BIT(19); //BUF 0
}
break;
case VPP_IOCTL_CMD_GET_SCALE1BUF_SELECT:
if(hw->CON1&BIT(18)){
ret_val = 1; //<2F>õ<EFBFBD><C3B5><EFBFBD>buf1
}else{
ret_val = 0; //<2F>õ<EFBFBD><C3B5><EFBFBD>buf0
}
break;
case VPP_IOCTL_CMD_GET_SCALE3BUF_SELECT:
if(hw->CON1&BIT(19)){
ret_val = 1; //<2F>õ<EFBFBD><C3B5><EFBFBD>buf1
}else{
ret_val = 0; //<2F>õ<EFBFBD><C3B5><EFBFBD>buf0
}
break;
case VPP_IOCTL_CMD_GEN420_BUF_SEL:
if(param1 == 0){
hw->CON1 &= ~BIT(20); //BUF 0
}else{
hw->CON1 |= BIT(20); //BUF 1
}
break;
case VPP_IOCTL_CMD_SET_WATERMARK0_AUTO_RC_THRESHOLD:
hw->IWM0_CON1 = 0;
hw->IWM0_CON1 = param1/8;
hw->IWM0_CON1 |= (param2/8)<<18;
break;
case VPP_IOCTL_CMD_SET_WATERMARK0_AUTO_RC_COLOR:
if(param1)
hw->IWM0_CON |= BIT(6);
else
hw->IWM0_CON &= ~BIT(6);
hw->IWM0_YUV1 = param2;
break;
case VPP_IOCTL_CMD_SET_WATERMARK0_AUTO_RC_HADR:
hw->IWM0_HADR = param1; //sram for moudle cal threshold
break;
case VPP_IOCTL_CMD_SET_WATERMARK0_AUTO_RC_MODE:
if(param1)
hw->IWM0_CON |= BIT(7);
else
hw->IWM0_CON &= ~BIT(7);
break;
case VPP_IOCTL_CMD_IS_CLOSED:
ret_val = vpp_hw->opened?0:1;
break;
default:
os_printf("NO VPP IOCTL:%d\r\n",ioctl_cmd);
ret_val = -ENOTSUPP;
break;
}
return ret_val;
}
void VPP_IRQHandler_action(void *p_vpp)
{
uint32 jpgr = 0;
uint32 sta = 0;
uint8 loop;
struct hgvpp *vpp_hw = (struct hgvpp*)p_vpp;
struct hgvpp_hw *hw = (struct hgvpp_hw *)vpp_hw->hw;
jpgr = *(volatile uint32_t*)0x40005200; //fix jpg reg error bug,imp
sta = hw->STA;
for(loop = 0;loop < VPP_IRQ_NUM;loop++){
if(sta&BIT(loop)){
hw->STA = BIT(loop);
if(loop == IPF_OV_ISR){
isp_ov_err = 1;
}
if(isp_ov_err){
if(loop == FRAME_DONE_ISR){
os_printf("isp ov,vpp drop\r\n");
isp_ov_err = 0;
}
}else{
if(loop == FRAME_DONE_ISR){
isp_ov_err = 0;
}
if(vppirq_vector_table[loop] != NULL)
vppirq_vector_table[loop] (loop,vppirq_dev_table[loop],0);
}
}
}
}
void irq_vpp_enable(struct vpp_device *p_vpp,uint8 mode,uint8 irq){
struct hgvpp *vpp_hw = (struct hgvpp*)p_vpp;
struct hgvpp_hw *hw = (struct hgvpp_hw *)vpp_hw->hw;
if(mode){
hw->CON |= BIT(irq+19);
}else{
hw->CON &= ~BIT(irq+19);
}
}
int32 vppirq_register(struct vpp_device *p_vpp,uint32 irq, vpp_irq_hdl isr, uint32 dev_id){
struct hgvpp *vpp_hw = (struct hgvpp*)p_vpp;
struct hgvpp_hw *hw = (struct hgvpp_hw *)vpp_hw->hw;
request_irq(vpp_hw->irq_num, VPP_IRQHandler_action, p_vpp);
irq_vpp_enable(p_vpp, 1, irq);
vppirq_vector_table[irq] = isr;
vppirq_dev_table[irq] = dev_id;
hw->STA |= BIT(irq);
os_printf("vppirq_register:%d %x %x\r\n",irq,(uint32)vppirq_vector_table[irq],(uint32)isr);
return 0;
}
int32 vppirq_unregister(struct vpp_device *p_vpp,uint32 irq){
struct hgvpp *vpp_hw = (struct hgvpp*)p_vpp;
struct hgvpp_hw *hw = (struct hgvpp_hw *)vpp_hw->hw;
irq_vpp_enable(p_vpp, 0, irq);
vppirq_vector_table[irq] = NULL;
vppirq_dev_table[irq] = 0;
hw->STA |= BIT(irq);
return 0;
}
static int32 hgvpp_open(struct vpp_device *p_vpp){
struct hgvpp *vpp_hw = (struct hgvpp*)p_vpp;
struct hgvpp_hw *hw = (struct hgvpp_hw *)vpp_hw->hw;
vpp_hw->opened = 1;
hw->CON |= BIT(0);
irq_enable(vpp_hw->irq_num);
return 0;
}
static int32 hgvpp_close(struct vpp_device *p_vpp){
struct hgvpp *vpp_hw = (struct hgvpp*)p_vpp;
struct hgvpp_hw *hw = (struct hgvpp_hw *)vpp_hw->hw;
vpp_hw->opened = 0;
hw->CON &= ~BIT(0);
irq_disable(vpp_hw->irq_num);
return 0;
}
int32 hgvpp_suspend(struct dev_obj *obj){
struct hgvpp *vpp_hw = (struct hgvpp*)obj;
struct hgvpp_hw *hw;
struct hgvpp_hw *hw_cfg;
//确保已经被打开并且休眠过,直接返回
if(!vpp_hw->opened || vpp_hw->dsleep)
{
return RET_OK;
}
vpp_hw->dsleep = 1;
vpp_hw->cfg_backup = (uint32 *)os_malloc(sizeof(struct hgvpp_hw));
hw_cfg = (struct hgvpp_hw*)vpp_hw->cfg_backup;
hw = (struct hgvpp_hw*)vpp_hw->hw;
hw_cfg->CON = hw->CON;
hw_cfg->CON1 = hw->CON1;
hw_cfg->SIZE = hw->SIZE;
hw_cfg->DLT = hw->DLT;
hw_cfg->DHT = hw->DHT;
hw_cfg->STA = hw->STA;
hw_cfg->DMA_YADR = hw->DMA_YADR;
hw_cfg->DMA_UADR = hw->DMA_UADR;
hw_cfg->DMA_VADR = hw->DMA_VADR;
hw_cfg->DMA_YADR1 = hw->DMA_YADR1;
hw_cfg->DMA_UADR1 = hw->DMA_UADR1;
hw_cfg->DMA_VADR1 = hw->DMA_VADR1;
hw_cfg->IWM0_CON = hw->IWM0_CON;
hw_cfg->IWM0_CON1 = hw->IWM0_CON1;
hw_cfg->IWM0_SIZE = hw->IWM0_SIZE;
hw_cfg->IWM0_YUV = hw->IWM0_YUV;
hw_cfg->IWM0_YUV1 = hw->IWM0_YUV1;
hw_cfg->IWM0_LADR = hw->IWM0_LADR;
hw_cfg->IWM0_HADR = hw->IWM0_HADR;
hw_cfg->IWM0_IDX0 = hw->IWM0_IDX0;
hw_cfg->IWM0_IDX1 = hw->IWM0_IDX1;
hw_cfg->IWM0_IDX2 = hw->IWM0_IDX2;
hw_cfg->IWM1_CON = hw->IWM1_CON;
hw_cfg->IWM1_SIZE = hw->IWM1_SIZE;
hw_cfg->IWM1_YUV = hw->IWM1_YUV;
hw_cfg->IWM1_LADR = hw->IWM1_LADR;
hw_cfg->IPF_SADR = hw->IPF_SADR;
hw_cfg->MD_CON = hw->MD_CON;
hw_cfg->MD_WIN_CON0 = hw->MD_WIN_CON0;
hw_cfg->MD_WIN_CON1 = hw->MD_WIN_CON1;
hw_cfg->MD_BASE_ADDR = hw->MD_BASE_ADDR;
hw_cfg->ITP_PSRAM_YADR = hw->ITP_PSRAM_YADR;
hw_cfg->ITP_PSRAM_UADR = hw->ITP_PSRAM_UADR;
hw_cfg->ITP_PSRAM_VADR = hw->ITP_PSRAM_VADR;
hw_cfg->FRM_PSRAM_YCNT = hw->FRM_PSRAM_YCNT;
hw_cfg->FRM_PSRAM_UVCNT = hw->FRM_PSRAM_UVCNT;
hw_cfg->FRM1_PSRAM_YCNT = hw->FRM1_PSRAM_YCNT;
hw_cfg->FRM1_PSRAM_UVCNT = hw->FRM1_PSRAM_UVCNT;
irq_disable(vpp_hw->irq_num);
return 0;
}
int32 hgvpp_resume(struct dev_obj *obj){
struct hgvpp *vpp_hw = (struct hgvpp*)obj;
struct hgvpp_hw *hw;
struct hgvpp_hw *hw_cfg;
//如果已经被打开并且没有休眠过,直接返回
if(!vpp_hw->opened || !vpp_hw->dsleep)
{
return RET_OK;
}
vpp_hw->dsleep = 0;
hw_cfg = (struct hgvpp_hw*)vpp_hw->cfg_backup;
hw = (struct hgvpp_hw*)vpp_hw->hw;
hw->CON = hw_cfg->CON;
hw->CON1 = hw_cfg->CON1;
hw->SIZE = hw_cfg->SIZE;
hw->DLT = hw_cfg->DLT;
hw->DHT = hw_cfg->DHT;
hw->STA = hw_cfg->STA;
hw->DMA_YADR = hw_cfg->DMA_YADR;
hw->DMA_UADR = hw_cfg->DMA_UADR;
hw->DMA_VADR = hw_cfg->DMA_VADR;
hw->DMA_YADR1 = hw_cfg->DMA_YADR1;
hw->DMA_UADR1 = hw_cfg->DMA_UADR1;
hw->DMA_VADR1 = hw_cfg->DMA_VADR1;
hw->IWM0_CON = hw_cfg->IWM0_CON;
hw->IWM0_CON1 = hw_cfg->IWM0_CON1;
hw->IWM0_SIZE = hw_cfg->IWM0_SIZE;
hw->IWM0_YUV = hw_cfg->IWM0_YUV;
hw->IWM0_YUV1 = hw_cfg->IWM0_YUV1;
hw->IWM0_LADR = hw_cfg->IWM0_LADR;
hw->IWM0_HADR = hw_cfg->IWM0_HADR;
hw->IWM0_IDX0 = hw_cfg->IWM0_IDX0;
hw->IWM0_IDX1 = hw_cfg->IWM0_IDX1;
hw->IWM0_IDX2 = hw_cfg->IWM0_IDX2;
hw->IWM1_CON = hw_cfg->IWM1_CON;
hw->IWM1_SIZE = hw_cfg->IWM1_SIZE;
hw->IWM1_YUV = hw_cfg->IWM1_YUV;
hw->IWM1_LADR = hw_cfg->IWM1_LADR;
hw->IPF_SADR = hw_cfg->IPF_SADR;
hw->MD_CON = hw_cfg->MD_CON;
hw->MD_WIN_CON0 = hw_cfg->MD_WIN_CON0;
hw->MD_WIN_CON1 = hw_cfg->MD_WIN_CON1;
hw->MD_BASE_ADDR = hw_cfg->MD_BASE_ADDR;
hw->ITP_PSRAM_YADR = hw_cfg->ITP_PSRAM_YADR;
hw->ITP_PSRAM_UADR = hw_cfg->ITP_PSRAM_UADR;
hw->ITP_PSRAM_VADR = hw_cfg->ITP_PSRAM_VADR;
hw->FRM_PSRAM_YCNT = hw_cfg->FRM_PSRAM_YCNT;
hw->FRM_PSRAM_UVCNT = hw_cfg->FRM_PSRAM_UVCNT;
hw->FRM1_PSRAM_YCNT = hw_cfg->FRM1_PSRAM_YCNT;
hw->FRM1_PSRAM_UVCNT = hw_cfg->FRM1_PSRAM_UVCNT;
irq_enable(vpp_hw->irq_num);
os_free(vpp_hw->cfg_backup);
return 0;
}
static const struct vpp_hal_ops dev_ops = {
.open = hgvpp_open,
.close = hgvpp_close,
.ioctl = hgvpp_ioctl,
.request_irq = vppirq_register,
.release_irq = vppirq_unregister,
#ifdef CONFIG_SLEEP
.ops.suspend = hgvpp_suspend,
.ops.resume = hgvpp_resume,
#endif
};
int32 hgvpp_attach(uint32 dev_id, struct hgvpp *vpp){
vpp->opened = 0;
vpp->use_dma = 0;
vpp->irq_hdl = NULL;
//memset(dvp->irq_hdl,0,sizeof(dvp->irq_hdl));
vpp->irq_data = 0;
//memset(dvp->irq_data,0,sizeof(dvp->irq_data));
vpp->dev.dev.ops = (const struct devobj_ops *)&dev_ops;
irq_disable(vpp->irq_num);
dev_register(dev_id, (struct dev_obj *)vpp);
return 0;
}