GK SDK 源码库: XMIPCLinuxV100R005C00SPC030 (kernel/tools/open_source excluded)

This commit is contained in:
lai
2026-09-06 03:52:57 +08:00
commit b1928b41c0
21813 changed files with 4413081 additions and 0 deletions
+16
View File
@@ -0,0 +1,16 @@
/*
* Copyright (c) XMEDIA. All rights reserved.
*/
#include "drv_sys.h"
#include "sys_drv.h"
#include "sys_hal.h"
xmedia_s32 drv_sys_mod_ctrl(xmedia_chn_info *chn_info, sys_func_id func_id, xmedia_void *io_args)
{
xmedia_s32 ret = XMEDIA_FAILURE;
ret = sys_mod_ctrl(chn_info, func_id, io_args);
return ret;
}
+60
View File
@@ -0,0 +1,60 @@
/*
* Copyright (c) XMEDIA. All rights reserved.
*/
#ifndef DRV_SYS_H
#define DRV_SYS_H
#include "drv_vo_comm.h"
#ifdef __cplusplus
extern "C" {
#endif /* End of #ifdef __cplusplus */
typedef enum {
SYS_VO_VOU_HD_CKSEL,
SYS_VO_VOU_PPC_CKSEL,
SYS_VO_LVDS_POR_SRST,
SYS_VO_MIPITX_PLL_REF_CKSEL,
SYS_VO_LVDS_CKSEL,
SYS_VO_LCD_DIV_CFG,
SYS_VO_PLL_DIV_CFG,
SYS_VO_VOU_HD_CKEN,
SYS_VO_VOU_SRST_REQ,
SYS_VO_VOU_SRST_GET,
SYS_VO_LCD_DIV_CKEN,
SYS_VO_PLL_DIV_CKEN,
SYS_VO_BT_HD_CKSEL,
SYS_VO_LCD_HD_CKSEL,
SYS_VO_MIPITX_HD_CKSEL,
SYS_VO_LVDSTX_HD_CKSEL,
SYS_VO_BT_PCTRL,
SYS_VO_LCD_PCTRL,
SYS_VO_MIPITX_PCTRL,
SYS_VO_LVDSTX_PCTRL,
SYS_VO_BT_CKEN,
SYS_VO_LCD_CKEN,
SYS_VO_MIPITX_CKEN,
SYS_VO_LVDSTX_CKEN,
SYS_MAX
} sys_func_id;
#ifndef xmedia_chn_info
typedef struct {
xmedia_mod_id mod_id;
xmedia_s32 dev_id;
xmedia_s32 chn_id;
} xmedia_chn_info;
#endif
xmedia_s32 drv_sys_mod_init(xmedia_void);
xmedia_void drv_sys_mod_exit(xmedia_void);
xmedia_s32 drv_sys_mod_ctrl(xmedia_chn_info *chn_info, sys_func_id func_id, xmedia_void *io_args);
#ifdef __cplusplus
}
#endif /* End of #ifdef __cplusplus */
#endif /* DRV_SYS_H */
+434
View File
@@ -0,0 +1,434 @@
/*
* Copyright (c) XMEDIA. All rights reserved.
*/
#ifndef __DRV_VO_SYS_H__
#define __DRV_VO_SYS_H__
#ifdef __cplusplus
extern "C" {
#endif
typedef unsigned char xmedia_uchar;
typedef unsigned char xmedia_u8;
typedef unsigned short xmedia_u16;
typedef unsigned int xmedia_u32;
typedef unsigned long long xmedia_u64;
typedef unsigned long xmedia_ulong;
typedef char xmedia_char;
typedef signed char xmedia_s8;
typedef short xmedia_s16;
typedef int xmedia_s32;
typedef long long xmedia_s64;
typedef long xmedia_slong;
typedef float xmedia_float;
typedef double xmedia_double;
typedef void xmedia_void;
typedef xmedia_u32 xmedia_handle;
typedef xmedia_ulong xmedia_uintptr_t;
typedef xmedia_slong xmedia_intptr_t;
typedef enum {
XMEDIA_FALSE = 0,
XMEDIA_TRUE = 1,
} xmedia_bool;
#define XMEDIA_NULL 0L
#define XMEDIA_SUCCESS 0
#define XMEDIA_FAILURE (-1)
#define XMEDIA_INVALID_HANDLE (0xffffffff)
#define XMEDIA_UNUSED(x) ((x) = (x))
#define XMEDIA_ERRCODE_INVALID_PARAM (xmedia_s32)(0x80010001)
#define XMEDIA_ERRCODE_NULL_PTR (xmedia_s32)(0x80010002)
#define XMEDIA_ERRCODE_NOT_ENOUGH_MEMORY (xmedia_s32)(0x80010003) // memory allocation fails
#define XMEDIA_ERRCODE_NOT_INIT (xmedia_s32)(0x80010004)
#define XMEDIA_ERRCODE_NOT_SUPPORT (xmedia_s32)(0x80010005)
#define XMEDIA_ERRCODE_TIMEOUT (xmedia_s32)(0x80010006)
#define XMEDIA_ERRCODE_BAD_ADDRESS (xmedia_s32)(0x80010007)
#define XMEDIA_ERRCODE_OPEN_FAILED (xmedia_s32)(0x80010008)
#define XMEDIA_ERRCODE_CLOSE_FAILED (xmedia_s32)(0x80010009)
#define XMEDIA_ERRCODE_CREATE_FAILED (xmedia_s32)(0x8001000A)
#define XMEDIA_ERRCODE_DESTROY_FAILED (xmedia_s32)(0x8001000B)
#define XMEDIA_ERRCODE_BUFFER_EMPTY (xmedia_s32)(0x8001000C)
#define XMEDIA_ERRCODE_BUFFER_FULL (xmedia_s32)(0x8001000D)
#define XMEDIA_ERRCODE_NO_BUFFER_FREE (xmedia_s32)(0x8001000E)
#define XMEDIA_ERRCODE_NOT_PERMITTED (xmedia_s32)(0x8001000F) // Operation not permitted
#define XMEDIA_ERRCODE_EXIST (xmedia_s32)(0x80010010) // Target exists
#define XMEDIA_ERRCODE_NOT_EXIST (xmedia_s32)(0x80010011) // Target does not exist
#define XMEDIA_ERRCODE_NOT_READY (xmedia_s32)(0x80010012) // Target not ready
#define XMEDIA_ERRCODE_BUSY (xmedia_s32)(0x80010013) // Device or resource busy
#define XMEDIA_ERRCODE_COPY_DATA_ERROR (xmedia_s32)(0x80010014)
#define XMEDIA_ERRCODE_TYPE_ERROR (xmedia_s32)(0x80010015)
#define XMEDIA_ERRCODE_CHN_FULL (xmedia_s32)(0x80010016)
#define XMEDIA_ERRCODE_INVALID_CHN_ID (xmedia_s32)(0x80010017)
#define XMEDIA_ERRCODE_INVALID_DEV_ID (xmedia_s32)(0x80010018)
#define XMEDIA_ERRCODE_INVALID_PIPE_ID (xmedia_s32)(0x80010019)
#define XMEDIA_ERRCODE_INVALID_GRP_ID (xmedia_s32)(0x8001001A)
#define XMEDIA_ERRCODE_NOT_CONFIG (xmedia_s32)(0x8001001B)
#define XMEDIA_ERRCODE_NOT_ENABLE (xmedia_s32)(0x8001001C)
#define XMEDIA_ERRCODE_NOT_DISABLE (xmedia_s32)(0x8001001D)
#define XMEDIA_ERRCODE_NOT_BIND (xmedia_s32)(0x8001001E)
#define XMEDIA_ERRCODE_BINDED (xmedia_s32)(0x8001001F)
#define MODULE_DBG_EMERG 0
#define MODULE_DBG_ALERT 1
#define MODULE_DBG_CRIT 2
#define MODULE_DBG_ERR 3
#define MODULE_DBG_WARN 4
#define MODULE_DBG_NOTICE 5
#define MODULE_DBG_INFO 6
#define MODULE_DBG_DEBUG 7
#define ALIGN_NUM 4
#define MODULE_USR_DEFAULT_DBG MODULE_DBG_ERR // 用户态日志管理初始化失败时各模块的打印等级
#define ATTRIBUTE __attribute__((aligned (ALIGN_NUM)))
typedef enum {
MOD_ID_VB = 0,
MOD_ID_SYS = 1,
MOD_ID_LOG = 2,
MOD_ID_RGN = 3,
MOD_ID_CHNL = 4,
MOD_ID_VI = 5,
MOD_ID_VO = 6,
MOD_ID_DIS = 7,
MOD_ID_AVS = 8,
MOD_ID_VPSS = 9,
MOD_ID_ISP = 10,
MOD_ID_FB = 11,
MOD_ID_GDC = 12,
MOD_ID_TDE = 13,
MOD_ID_VGS = 14,
MOD_ID_MCF = 15,
MOD_ID_HDMI = 16,
MOD_ID_VDEC = 17,
MOD_ID_VENC = 18,
MOD_ID_VPU = 19,
MOD_ID_VALG = 20,
MOD_ID_RC = 21,
MOD_ID_JPEGE = 22,
MOD_ID_JPEGD = 23,
MOD_ID_H264E = 24,
MOD_ID_H264D = 25,
MOD_ID_H265E = 26,
MOD_ID_AIO = 29,
MOD_ID_AI = 30,
MOD_ID_AO = 31,
MOD_ID_AENC = 32,
MOD_ID_ADEC = 33,
MOD_ID_ACOMM = 34,
MOD_ID_NPU = 35,
MOD_ID_IVE = 36,
MOD_ID_USER = 37,
MOD_ID_PM = 38,
MOD_ID_GYRODIS = 39,
MOD_ID_IR = 40,
MOD_ID_NPU_SVP = 41,
MOD_ID_DDR_OST_QOS = 42,
MOD_ID_CIPHER = 43,
MOD_ID_MAX,
} xmedia_mod_id;
typedef struct {
xmedia_u32 width;
xmedia_u32 height;
} xmedia_video_size;
typedef struct {
xmedia_s32 x;
xmedia_s32 y;
xmedia_u32 width;
xmedia_u32 height;
} xmedia_video_rect;
typedef enum {
/* Semi-Planner */
XMEDIA_VIDEO_PIXEL_FMT_YUV_SEMIPLANAR_420 = 0,
XMEDIA_VIDEO_PIXEL_FMT_YVU_SEMIPLANAR_420,
XMEDIA_VIDEO_PIXEL_FMT_YUV_SEMIPLANAR_422,
XMEDIA_VIDEO_PIXEL_FMT_YVU_SEMIPLANAR_422,
XMEDIA_VIDEO_PIXEL_FMT_YUV_SEMIPLANAR_444,
XMEDIA_VIDEO_PIXEL_FMT_YVU_SEMIPLANAR_444,
/* Package */
XMEDIA_VIDEO_PIXEL_FMT_YUYV_PACKAGE_422 = 0x40,
XMEDIA_VIDEO_PIXEL_FMT_YVYU_PACKAGE_422,
XMEDIA_VIDEO_PIXEL_FMT_UYVY_PACKAGE_422,
XMEDIA_VIDEO_PIXEL_FMT_VYUY_PACKAGE_422,
XMEDIA_VIDEO_PIXEL_FMT_YYUV_PACKAGE_422,
XMEDIA_VIDEO_PIXEL_FMT_YYVU_PACKAGE_422,
XMEDIA_VIDEO_PIXEL_FMT_UVYY_PACKAGE_422,
XMEDIA_VIDEO_PIXEL_FMT_VUYY_PACKAGE_422,
XMEDIA_VIDEO_PIXEL_FMT_VY1UY0_PACKAGE_422,
/*yuv 400 */
XMEDIA_VIDEO_PIXEL_FMT_YUV_400 = 0x90,
/*RGB*/
XMEDIA_VIDEO_PIXEL_FMT_ARGB_1555 = 0xC0,
XMEDIA_VIDEO_PIXEL_FMT_ARGB_4444,
XMEDIA_VIDEO_PIXEL_FMT_ARGB_8888,
XMEDIA_VIDEO_PIXEL_FMT_ABGR_1555,
XMEDIA_VIDEO_PIXEL_FMT_ABGR_4444,
XMEDIA_VIDEO_PIXEL_FMT_ABGR_8888,
XMEDIA_VIDEO_PIXEL_FMT_RGBA_1555,
XMEDIA_VIDEO_PIXEL_FMT_RGBA_4444,
XMEDIA_VIDEO_PIXEL_FMT_RGBA_8888,
XMEDIA_VIDEO_PIXEL_FMT_BGRA_1555,
XMEDIA_VIDEO_PIXEL_FMT_BGRA_4444,
XMEDIA_VIDEO_PIXEL_FMT_BGRA_8888,
XMEDIA_VIDEO_PIXEL_FMT_RGB_565,
XMEDIA_VIDEO_PIXEL_FMT_RGB_888,
XMEDIA_VIDEO_PIXEL_FMT_BGR_565,
XMEDIA_VIDEO_PIXEL_FMT_BGR_888,
/*CLUT*/
XMEDIA_VIDEO_PIXEL_FMT_CLUT2 = 0x100,
XMEDIA_VIDEO_PIXEL_FMT_CLUT4,
XMEDIA_VIDEO_PIXEL_FMT_CLUT8,
/*RAW*/
XMEDIA_VIDEO_PIXEL_FMT_RAW = 0x110,
XMEDIA_VIDEO_PIXEL_FMT_MAX = 0x120
} xmedia_video_pixel_format;
typedef enum {
XMEDIA_VIDEO_FMT_LINEAR = 0x0,
XMEDIA_VIDEO_FMT_TILE_16x4,
XMEDIA_VIDEO_FMT_TILE_32x4,
XMEDIA_VIDEO_FMT_TILE_64x4,
XMEDIA_VIDEO_FMT_TILE_64x64,
XMEDIA_VIDEO_FMT_MAX
} xmedia_video_format;
/*维度:
*yuv、RGB、RAW
*有损/无损,
*行、帧、段紧凑、段非紧凑
*/
typedef enum {
XMEDIA_VIDEO_COMPRESS_MODE_NONE = 0x0,
XMEDIA_VIDEO_COMPRESS_MODE_LINE, // 3DNR 使用行压缩
XMEDIA_VIDEO_COMPRESS_MODE_FRAME,
XMEDIA_VIDEO_COMPRESS_MODE_SEG,
XMEDIA_VIDEO_COMPRESS_MODE_TILE,
XMEDIA_VIDEO_COMPRESS_MODE_SLICE,
XMEDIA_VIDEO_COMPRESS_MODE_MAX
} xmedia_video_compress_mode;
typedef enum {
XMEDIA_VIDEO_COLOR_SPACE_YUV = 0x0,
XMEDIA_VIDEO_COLOR_SPACE_RGB,
XMEDIA_VIDEO_COLOR_SPACE_MAX
} xmedia_video_color_space;
typedef enum {
XMEDIA_VIDEO_COLOR_GAMUT_BT601 = 0x0,
XMEDIA_VIDEO_COLOR_GAMUT_BT709,
XMEDIA_VIDEO_COLOR_GAMUT_BT2020,
XMEDIA_VIDEO_COLOR_GAMUT_USER,
XMEDIA_VIDEO_COLOR_GAMUT_MAX
} xmedia_video_color_gamut;
typedef enum {
XMEDIA_VIDEO_COLOR_LIMITED_RANGE = 0x0,
XMEDIA_VIDEO_COLOR_FULL_RANGE,
XMEDIA_VIDEO_COLOR_RANGE_MAX
} xmedia_video_color_quantify_range;
typedef struct {
xmedia_video_color_space color_space;
xmedia_video_color_gamut color_gamut;
xmedia_video_color_quantify_range quantify_range;
} xmedia_video_color_descript;
typedef enum {
XMEDIA_VIDEO_DYNAMIC_RANGE_SDR = 0x0,
XMEDIA_VIDEO_DYNAMIC_RANGE_HDR10,
XMEDIA_VIDEO_DYNAMIC_RANGE_HLG,
XMEDIA_VIDEO_DYNAMIC_RANGE_MAX
} xmedia_video_dynamic_range;
typedef enum {
XMEDIA_VIDEO_DATA_WIDTH_8 = 0x0,
XMEDIA_VIDEO_DATA_WIDTH_10,
XMEDIA_VIDEO_DATA_WIDTH_12,
XMEDIA_VIDEO_DATA_WIDTH_14,
XMEDIA_VIDEO_DATA_WIDTH_16,
XMEDIA_VIDEO_DATA_WIDTH_MAX
} xmedia_video_data_width;
typedef struct {
xmedia_u64 isp_info_phy_addr;
xmedia_u64 lowdelay_info_phy_addr;
xmedia_u64 vdec_info_phy_addr;
xmedia_void *ATTRIBUTE isp_info_vir_addr;
xmedia_void *ATTRIBUTE lowdelay_info_vir_addr;
xmedia_void *ATTRIBUTE vdec_info_vir_addr;
} xmedia_video_private_info;
typedef struct {
xmedia_u64 y_head_phy_addr;
xmedia_u64 c_head_phy_addr;
xmedia_u64 y_phy_addr;
xmedia_u64 c_phy_addr;
// xmedia_u64 y_buf_phy_addr; // luma buffer start phy addr
// xmedia_u64 c_buf_phy_addr; // chroma buffer start phy addr
// xmedia_u32 y_size; // luma buffer size
// xmedia_u32 c_size; // chroma buffer size
} xmedia_video_frame_address;
typedef struct {
xmedia_u32 y_head_stride;
xmedia_u32 c_head_stride;
xmedia_u32 y_stride;
xmedia_u32 c_stride;
} xmedia_video_frame_stride;
typedef struct {
xmedia_u32 index;
xmedia_u32 width;
xmedia_u32 height;
xmedia_video_frame_address addr;
xmedia_video_frame_stride stride;
xmedia_video_data_width bit_width;
xmedia_video_pixel_format pixel_fmt;
xmedia_video_compress_mode compress_mode;
xmedia_video_format video_fmt;
xmedia_video_dynamic_range dynamic_range;
xmedia_video_color_descript color_info;
xmedia_u64 pts;
xmedia_u32 time_ref;
xmedia_u32 frame_flag;
xmedia_video_private_info priv_info;
} xmedia_video_frame;
typedef struct {
xmedia_video_frame frame;
xmedia_u32 pool_id;
xmedia_mod_id mod_id;
} xmedia_video_frame_info;
typedef enum {
XMEDIA_INTF_MIPI_CSI_DATA_TYPE_RAW_8BIT = 0,
XMEDIA_INTF_MIPI_CSI_DATA_TYPE_RAW_10BIT,
XMEDIA_INTF_MIPI_CSI_DATA_TYPE_RAW_12BIT,
XMEDIA_INTF_MIPI_CSI_DATA_TYPE_RAW_14BIT,
XMEDIA_INTF_MIPI_CSI_DATA_TYPE_RAW_16BIT,
XMEDIA_INTF_MIPI_CSI_DATA_TYPE_RAW_20BIT,
XMEDIA_INTF_MIPI_CSI_DATA_TYPE_RAW_24BIT,
XMEDIA_INTF_MIPI_CSI_DATA_TYPE_YUV420_8BIT,
XMEDIA_INTF_MIPI_CSI_DATA_TYPE_YUV420_LEGACY_8BIT,
XMEDIA_INTF_MIPI_CSI_DATA_TYPE_YUV422_8BIT,
XMEDIA_INTF_MIPI_CSI_DATA_TYPE_MAX
} xmedia_intf_mipi_csi_data_type;
typedef enum {
XMEDIA_INTF_MIPI_DSI_DATA_TYPE_YUV422_16BIT = 0,
XMEDIA_INTF_MIPI_DSI_DATA_TYPE_RGB666_18BIT,
XMEDIA_INTF_MIPI_DSI_DATA_TYPE_RGB888_24BIT,
XMEDIA_INTF_MIPI_DSI_DATA_TYPE_MAX
} xmedia_intf_mipi_dsi_data_type;
typedef enum {
XMEDIA_INTF_BT_DATA_TYPE_YUV422_8BIT = 0,
XMEDIA_INTF_BT_DATA_TYPE_YUV422_10BIT,
XMEDIA_INTF_BT_DATA_TYPE_MAX
} xmedia_intf_bt_data_type;
typedef enum {
XMEDIA_INTF_LCD_DATA_TYPE_RGB565_16BIT = 0,
XMEDIA_INTF_LCD_DATA_TYPE_RGB666_18BIT,
XMEDIA_INTF_LCD_DATA_TYPE_RGB888_24BIT,
XMEDIA_INTF_LCD_DATA_TYPE_MAX
} xmedia_intf_lcd_data_type;
typedef enum {
XMEDIA_INTF_LVDS_DATA_TYPE_RGB666_18BIT = 0,
XMEDIA_INTF_LVDS_DATA_TYPE_RGB666_36BIT,
XMEDIA_INTF_LVDS_DATA_TYPE_RGB888_24BIT,
XMEDIA_INTF_LVDS_DATA_TYPE_RGB888_48BIT,
XMEDIA_INTF_LVDS_DATA_TYPE_MAX
} xmedia_intf_lvds_data_type;
typedef enum {
XMEDIA_INTF_DC_DATA_TYPE_RAW_8BIT = 0,
XMEDIA_INTF_DC_DATA_TYPE_RAW_10BIT,
XMEDIA_INTF_DC_DATA_TYPE_RAW_12BIT,
XMEDIA_INTF_DC_DATA_TYPE_RAW_14BIT,
XMEDIA_INTF_DC_DATA_TYPE_RAW_16BIT,
XMEDIA_INTF_DC_DATA_TYPE_MAX
} xmedia_intf_dc_data_type;
typedef enum {
XMEDIA_INTF_TYPE_BT601 = 0,
XMEDIA_INTF_TYPE_BT656,
XMEDIA_INTF_TYPE_BT1120,
XMEDIA_INTF_TYPE_MIPI_CSI,
XMEDIA_INTF_TYPE_MIPI_DSI,
XMEDIA_INTF_TYPE_LCD,
XMEDIA_INTF_TYPE_LVDS,
XMEDIA_INTF_TYPE_DC,
XMEDIA_INTF_TYPE_MCU,
XMEDIA_INTF_TYPE_MAX
} xmedia_intf_type;
/* bt601&bt656 */
typedef enum {
XMEDIA_INTF_BT601_BT656_DATA_SEQ_UYVY = 0,
XMEDIA_INTF_BT601_BT656_DATA_SEQ_VYUY,
XMEDIA_INTF_BT601_BT656_DATA_SEQ_YUYV,
XMEDIA_INTF_BT601_BT656_DATA_SEQ_YVYU,
XMEDIA_INTF_BT601_BT656_DATA_SEQ_MAX
} xmedia_intf_bt601_bt656_data_seq;
typedef enum {
XMEDIA_INTF_BT1120_DATA_SEQ_VUVU = 0,
XMEDIA_INTF_BT1120_DATA_SEQ_UVUV,
XMEDIA_INTF_BT1120_DATA_SEQ_MAX,
} xmedia_intf_bt1120_data_seq;
typedef enum {
XMEDIA_INTF_LCD_DATA_SEQ_RGB = 0,
XMEDIA_INTF_LCD_DATA_SEQ_RBG,
XMEDIA_INTF_LCD_DATA_SEQ_GRB,
XMEDIA_INTF_LCD_DATA_SEQ_GBR,
XMEDIA_INTF_LCD_DATA_SEQ_BRG,
XMEDIA_INTF_LCD_DATA_SEQ_BGR,
XMEDIA_INTF_LCD_DATA_SEQ_MAX,
} xmedia_intf_lcd_data_seq;
typedef enum {
XMEDIA_INTF_LVDS_FORMAT_VESA = 0,
XMEDIA_INTF_LVDS_FORMAT_JEIDA,
XMEDIA_INTF_LVDS_FORMAT_MAX
} xmedia_intf_lvds_format;
#ifdef __cplusplus
}
#endif
#endif
@@ -0,0 +1,318 @@
/*
* Copyright (c) XMEDIA. All rights reserved.
*/
#ifndef __DRV_VO_COMMON_H__
#define __DRV_VO_COMMON_H__
#include <net.h>
#include <exports.h>
#include <serial.h>
#include <xyzModem.h>
#include "xmedia_vo.h"
#ifdef __cplusplus
extern "C" {
#endif
#define VO_MIN_CHN_WIDTH 32
#define VO_MIN_CHN_HEIGHT 32
#define VO_MAX_ZOOM_RATIO 1000
#define VO_MAX_DEV_NUM 4
#define VO_MAX_LAYER_NUM 4
#define VO_MAX_CHN_NUM 4
#define VO_MIN_TOLERATE 1
#define VO_MAX_TOLERATE 100000
#define VO_INVALID_CHN_ID VO_MAX_CHN_NUM
#define VO_INVALID_NODE_INDEX 0
#ifdef xmorca
#define XMEDIA_VO_REAL_DEV_NUM XMEDIA_VO_DEV_1
#define XMEDIA_VO_REAL_LAYER_NUM XMEDIA_VO_LAYER_V1
#define XMEDIA_VO_VIRT_DEV_NUM 1
#define XMEDIA_VO_VIRT_LAYER_NUM 1
#endif
#ifdef xmfalcon
#define XMEDIA_VO_REAL_DEV_NUM XMEDIA_VO_DEV_VIRT_0
#define XMEDIA_VO_REAL_LAYER_NUM XMEDIA_VO_LAYER_VIRT_V0
#define XMEDIA_VO_VIRT_DEV_NUM 2
#define XMEDIA_VO_VIRT_LAYER_NUM 2
#endif
#define VO_CHECK_VAILD_DEV(dev) ((((dev) >= (XMEDIA_VO_DEV_0)) && ((dev) < (XMEDIA_VO_REAL_DEV_NUM))) || \
(((dev) >= (XMEDIA_VO_DEV_VIRT_0)) && ((dev) < ((XMEDIA_VO_DEV_VIRT_0) + (XMEDIA_VO_VIRT_DEV_NUM)))))
#define VO_CHECK_REAL_DEV(dev) (((dev) >= (XMEDIA_VO_DEV_0)) && ((dev) < (XMEDIA_VO_REAL_DEV_NUM)))
#define VO_CHECK_VIRT_DEV(dev) (((dev) >= XMEDIA_VO_DEV_VIRT_0) && \
((dev) < ((XMEDIA_VO_DEV_VIRT_0) + (XMEDIA_VO_VIRT_DEV_NUM))))
#define VO_CHECK_VAILD_LAYER(layer) ((((layer) >= (XMEDIA_VO_LAYER_V0)) && ((layer) < (XMEDIA_VO_REAL_LAYER_NUM))) || \
(((layer) >= (XMEDIA_VO_LAYER_VIRT_V0)) && ((layer) < ((XMEDIA_VO_LAYER_VIRT_V0) + (XMEDIA_VO_VIRT_LAYER_NUM)))))
#define VO_TRACE(level, fmt, ...) \
do { \
if (level <= MODULE_DBG_ERR) { \
printf("[Func]:%s [Line]:%d [Info]:" fmt, __FUNCTION__, __LINE__, ##__VA_ARGS__); \
} \
} while (0)
#define CHECK_VO_PTR_RETURN(pointer) \
do { \
if ((pointer) == XMEDIA_NULL) { \
VO_TRACE(MODULE_DBG_ERR,"vo para is null ptr.\n"); \
return XMEDIA_ERRCODE_NULL_PTR; \
} \
} while (0)
#define CHECK_VO_DEV_ID_RETURN(dev) \
do { \
if (dev >= XMEDIA_VO_DEV_MAX) { \
VO_TRACE(MODULE_DBG_ERR,"vo dev %d is invalid.\n",dev); \
return XMEDIA_ERRCODE_INVALID_DEV_ID; \
} \
} while (0)
#define CHECK_VO_DEV_ID(dev) \
do { \
if (dev >= XMEDIA_VO_DEV_MAX) { \
VO_TRACE(MODULE_DBG_ERR,"vo dev %d is invalid.\n",dev); \
return; \
} \
} while (0)
#define CHECK_VO_LAYER_ID_RETURN(layer) \
do { \
if (layer >= XMEDIA_VO_LAYER_MAX){ \
VO_TRACE(MODULE_DBG_ERR,"vo layer %d is invalid.\n",layer); \
return XMEDIA_ERRCODE_INVALID_GRP_ID; \
} \
} while (0)
#define CHECK_VO_CHN_ID_RETURN(chn) \
do { \
if ((chn < 0) || (chn >= VO_MAX_CHN_NUM)) { \
VO_TRACE(MODULE_DBG_ERR,"vo chn %d is invalid.\n",chn); \
return XMEDIA_ERRCODE_INVALID_CHN_ID; \
} \
} while (0)
#define CHECK_VO_ZERO_RETURN(value) \
do { \
if (value == 0) { \
VO_TRACE(MODULE_DBG_ERR,"a denominator of 0 is illegal\n"); \
return XMEDIA_ERRCODE_NOT_PERMITTED; \
} \
} while (0)
#define IS_ALIGN(x, bitw) (((x % bitw) == 0) ? XMEDIA_TRUE : XMEDIA_FALSE)
#define osal_memset(ptr, value, len) memset(ptr, value, len)
#define osal_mdelay(msecs) mdelay(msecs)
#define osal_memcpy(dst, src, size) memcpy(dst, src, size)
#define osal_udelay(usecs) udelay(usecs)
#define osal_vmalloc(size) malloc(size)
#define osal_vfree(addr) free(addr)
typedef enum {
VO_ISR_INTERRUPT_TYPE = 0,
VO_ISR_INTERRUPT_TYPE_DHD0_VTT0 = 0x1,
VO_ISR_INTERRUPT_TYPE_DHD0_VTT1 = 0x2,
VO_ISR_INTERRUPT_TYPE_DHD0_VTT2 = 0x4,
VO_ISR_INTERRUPT_TYPE_DHD0_VTT3 = 0x8,
VO_ISR_INTERRUPT_TYPE_DHD0_UFINT = 0x10000, //low band width
VO_ISR_INTERRUPT_TYPE_DHD1_VTT0 = 0x10,
VO_ISR_INTERRUPT_TYPE_DHD1_VTT1 = 0x20,
VO_ISR_INTERRUPT_TYPE_DHD1_VTT2 = 0x40,
VO_ISR_INTERRUPT_TYPE_DHD1_VTT3 = 0x80,
VO_ISR_INTERRUPT_TYPE_DHD1_UFINT = 0x20000,
VO_ISR_INTERRUPT_TYPE_LOW_DELAY_CERR = 0x100000,
VO_ISR_INTERRUPT_TYPE_LOW_DELAY_YERR = 0x200000,
VO_ISR_INTERRUPT_TYPE_BUSR_ERR = 0x1000000,
VO_ISR_INTERRUPT_TYPE_BUSW_ERR = 0x2000000,
VO_ISR_INTERRUPT_TYPE_ALL = 0xffffffff,
} vo_isr_interrupt_type;
typedef enum {
VO_ISR_FIELD_FLAG_FRAME = 0,
VO_ISR_FIELD_FLAG_TOP,
VO_ISR_FIELD_FLAG_BOTTOM,
VO_ISR_FIELD_FLAG_TOP_BOTTOM,
VO_ISR_FIELD_FLAG_MAX
} vo_isr_field_flag;
#ifdef xmorca
typedef enum {
VO_CSC_YUV2RGB_601_LIMIT2FULL = 0,
VO_CSC_YUV2RGB_709_LIMIT2FULL,
VO_CSC_YUV2RGB_601_FULL2LIMIT,
VO_CSC_YUV2RGB_709_FULL2LIMIT,
VO_CSC_YUV2RGB_601_FULL2FULL,
VO_CSC_YUV2RGB_709_FULL2FULL,
VO_CSC_YUV2RGB_601_LIMIT2LIMIT,
VO_CSC_YUV2RGB_709_LIMIT2LIMIT,
VO_CSC_YUV2YUV_601_601_LIMIT2LIMIT = 8,
VO_CSC_YUV2YUV_601_709_LIMIT2LIMIT,
VO_CSC_YUV2YUV_709_601_LIMIT2LIMIT,
VO_CSC_YUV2YUV_709_709_LIMIT2LIMIT,
VO_CSC_YUV2YUV_601_601_FULL2FULL = 12,
VO_CSC_YUV2YUV_601_709_FULL2FULL,
VO_CSC_YUV2YUV_709_601_FULL2FULL,
VO_CSC_YUV2YUV_709_709_FULL2FULL,
VO_CSC_YUV2YUV_601_601_LIMIT2FULL = 16,
VO_CSC_YUV2YUV_601_709_LIMIT2FULL,
VO_CSC_YUV2YUV_709_601_LIMIT2FULL,
VO_CSC_YUV2YUV_709_709_LIMIT2FULL,
VO_CSC_YUV2YUV_601_601_FULL2LIMIT = 20,
VO_CSC_YUV2YUV_601_709_FULL2LIMIT,
VO_CSC_YUV2YUV_709_601_FULL2LIMIT,
VO_CSC_YUV2YUV_709_709_FULL2LIMIT,
VO_CSC_MAX
} vo_csc_type;
#endif
#ifdef xmfalcon
typedef enum {
VO_CSC_YUV2RGB_601_LIMIT2FULL = 0,
VO_CSC_YUV2RGB_709_LIMIT2FULL,
VO_CSC_YUV2RGB_2020_LIMIT2FULL,
VO_CSC_YUV2RGB_601_FULL2LIMIT,
VO_CSC_YUV2RGB_709_FULL2LIMIT,
VO_CSC_YUV2RGB_2020_FULL2LIMIT,
VO_CSC_YUV2RGB_601_FULL2FULL,
VO_CSC_YUV2RGB_709_FULL2FULL,
VO_CSC_YUV2RGB_2020_FULL2FULL,
VO_CSC_YUV2RGB_601_LIMIT2LIMIT,
VO_CSC_YUV2RGB_709_LIMIT2LIMIT,
VO_CSC_YUV2RGB_2020_LIMIT2LIMIT,
VO_CSC_RGB2YUV_601_LIMIT2FULL = 12,
VO_CSC_RGB2YUV_709_LIMIT2FULL,
VO_CSC_RGB2YUV_2020_LIMIT2FULL,
VO_CSC_RGB2YUV_601_FULL2LIMIT,
VO_CSC_RGB2YUV_709_FULL2LIMIT,
VO_CSC_RGB2YUV_2020_FULL2LIMIT,
VO_CSC_RGB2YUV_601_FULL2FULL,
VO_CSC_RGB2YUV_709_FULL2FULL,
VO_CSC_RGB2YUV_2020_FULL2FULL,
VO_CSC_RGB2YUV_601_LIMIT2LIMIT,
VO_CSC_RGB2YUV_709_LIMIT2LIMIT,
VO_CSC_RGB2YUV_2020_LIMIT2LIMIT,
VO_CSC_YUV2YUV_601_601_LIMIT2LIMIT = 24,
VO_CSC_YUV2YUV_601_709_LIMIT2LIMIT,
VO_CSC_YUV2YUV_601_2020_LIMIT2LIMIT,
VO_CSC_YUV2YUV_709_601_LIMIT2LIMIT,
VO_CSC_YUV2YUV_709_709_LIMIT2LIMIT,
VO_CSC_YUV2YUV_709_2020_LIMIT2LIMIT,
VO_CSC_YUV2YUV_2020_601_LIMIT2LIMIT,
VO_CSC_YUV2YUV_2020_709_LIMIT2LIMIT,
VO_CSC_YUV2YUV_2020_2020_LIMIT2LIMIT,
VO_CSC_YUV2YUV_601_601_FULL2FULL = 33,
VO_CSC_YUV2YUV_601_709_FULL2FULL,
VO_CSC_YUV2YUV_601_2020_FULL2FULL,
VO_CSC_YUV2YUV_709_601_FULL2FULL,
VO_CSC_YUV2YUV_709_709_FULL2FULL,
VO_CSC_YUV2YUV_709_2020_FULL2FULL,
VO_CSC_YUV2YUV_2020_601_FULL2FULL,
VO_CSC_YUV2YUV_2020_709_FULL2FULL,
VO_CSC_YUV2YUV_2020_2020_FULL2FULL,
VO_CSC_YUV2YUV_601_601_LIMIT2FULL = 42,
VO_CSC_YUV2YUV_601_709_LIMIT2FULL,
VO_CSC_YUV2YUV_601_2020_LIMIT2FULL,
VO_CSC_YUV2YUV_709_601_LIMIT2FULL,
VO_CSC_YUV2YUV_709_709_LIMIT2FULL,
VO_CSC_YUV2YUV_709_2020_LIMIT2FULL,
VO_CSC_YUV2YUV_2020_601_LIMIT2FULL,
VO_CSC_YUV2YUV_2020_709_LIMIT2FULL,
VO_CSC_YUV2YUV_2020_2020_LIMIT2FULL,
VO_CSC_YUV2YUV_601_601_FULL2LIMIT = 51,
VO_CSC_YUV2YUV_601_709_FULL2LIMIT,
VO_CSC_YUV2YUV_601_2020_FULL2LIMIT,
VO_CSC_YUV2YUV_709_601_FULL2LIMIT,
VO_CSC_YUV2YUV_709_709_FULL2LIMIT,
VO_CSC_YUV2YUV_709_2020_FULL2LIMIT,
VO_CSC_YUV2YUV_2020_601_FULL2LIMIT,
VO_CSC_YUV2YUV_2020_709_FULL2LIMIT,
VO_CSC_YUV2YUV_2020_2020_FULL2LIMIT,
VO_CSC_RGB2RGB_LIMIT2LIMIT = 60,
VO_CSC_RGB2RGB_FULL2FULL,
VO_CSC_RGB2RGB_FULL2LIMIT,
VO_CSC_RGB2RGB_LIMIT2FULL,
VO_CSC_MAX
} vo_csc_type;
#endif
typedef struct {
vo_csc_type csc_type;
xmedia_u32 luma;
xmedia_u32 contrast;
xmedia_u32 hue;
xmedia_u32 saturation;
} vo_pic_info;
typedef struct {
xmedia_u64 lum_addr;
xmedia_u64 chm_addr;
xmedia_u32 lum_stride;
xmedia_u32 chm_stride;
} vo_addr;
typedef struct {
xmedia_bool config;
xmedia_bool enable;
xmedia_u32 chn; //硬件region区域 所对应的软件chn号
xmedia_video_rect src_rect;
xmedia_video_rect dst_rect;
xmedia_video_rect lba_rect;
xmedia_u32 lba_color;
vo_addr region_addr;
} vo_region_info;
typedef struct {
xmedia_bool mute_en;
xmedia_video_rect frame_rect; //真实内容 相对于显示窗口的rect
xmedia_video_rect video_rect; //层 相对于显示窗口的rect
xmedia_video_rect lba_rect;
xmedia_u32 lba_color;
vo_addr frame_addr;
} vo_layer_single_cfg;
typedef struct {
xmedia_video_rect reso_rect;
xmedia_video_rect disp_rect;
xmedia_u32 region_id;
xmedia_bool region_overlap;
xmedia_u32 overlap_id;
xmedia_u32 region_sort;
vo_region_info region[VO_MAX_CHN_NUM]; //硬件region区域配置
} vo_layer_multi_cfg;
typedef struct {
xmedia_bool bt656_intf_en;
xmedia_bool bt1120_intf_en;
xmedia_bool lcd_intf_en;
xmedia_bool mipi_intf_en;
xmedia_bool lvds_intf_en;
xmedia_vo_dev dev;
} vo_dev_intf_type_mux;
#ifdef __cplusplus
}
#endif
#endif
@@ -0,0 +1,22 @@
/*
* Copyright (c) XMEDIA. All rights reserved.
*/
#ifndef DRV_REG_CRG_H
#define DRV_REG_CRG_H
#define CRG_REGS_ADDR 0x12010000
#define CRG_REGS_SIZE 0X10000
#define CRG_PERCTL0_ADDR (CRG_REGS_ADDR + 0x0)
#define CRG_PERCTL1_ADDR (CRG_REGS_ADDR + 0x4)
#define CRG_PERCTL2_ADDR (CRG_REGS_ADDR + 0x8)
#define CRG_PERCTL50_ADDR (CRG_REGS_ADDR + 0xc8)
#define CRG_PERCTL65_ADDR (CRG_REGS_ADDR + 0x104)
#define CRG_PERCTL66_ADDR (CRG_REGS_ADDR + 0x108)
#define CRG_PERCTL67_ADDR (CRG_REGS_ADDR + 0x10c)
#define CRG_PERCTL121_ADDR (CRG_REGS_ADDR + 0x1e4)
#endif
@@ -0,0 +1,14 @@
/*
* Copyright (c) XMEDIA. All rights reserved.
*/
#ifndef DRV_REG_SYS_H
#define DRV_REG_SYS_H
#define SYS_REGS_ADDR 0x12020000
#define SYS_REGS_SIZE 0x8000
#define MISC_REGS_ADDR 0x12028000
#define MISC_REGS_SIZE 0x8000
#endif
@@ -0,0 +1,222 @@
/*
* Copyright (c) XMEDIA. All rights reserved.
*/
#include "common.h"
#include "sys_drv.h"
#include "sys_hal.h"
#include "drv_sys.h"
#include "xmedia_vo.h"
#include "drv_vo_comm.h"
#ifdef __cplusplus
extern "C" {
#endif /* End of #ifdef __cplusplus */
#define PHASE 32
#define SYS_MULTI_V 1048576
#define SYS_MULTI_H 1048576
xmedia_s32 sys_mod_init(xmedia_void)
{
xmedia_s32 ret;
ret = sys_hal_init();
return ret;
}
xmedia_s32 sys_mod_exit(xmedia_void)
{
sys_hal_exit();
return XMEDIA_SUCCESS;
}
xmedia_s32 sys_mod_ctrl(xmedia_chn_info *chn_info, sys_func_id func_id, xmedia_void *io_args)
{
xmedia_s32 dev;
dev = chn_info->dev_id;
switch (func_id) {
case SYS_VO_VOU_HD_CKSEL:{
xmedia_u32 *vou_hd_sel = XMEDIA_NULL;
vou_hd_sel = (xmedia_u32 *)io_args;
sys_hal_vo_vou_hd_sel(dev, *vou_hd_sel);
break;
}
case SYS_VO_VOU_PPC_CKSEL: {
xmedia_u32 *vou_ppc_cksel = XMEDIA_NULL;
vou_ppc_cksel = (xmedia_u32 *)io_args;
sys_hal_vo_vou_ppc_cksel(*vou_ppc_cksel);
break;
}
case SYS_VO_LVDS_POR_SRST: {
xmedia_bool *lvd_por_srst = XMEDIA_NULL;
lvd_por_srst = (xmedia_bool *)io_args;
sys_hal_vo_lvds_por_srst(*lvd_por_srst);
break;
}
case SYS_VO_MIPITX_PLL_REF_CKSEL: {
xmedia_bool *mipitx_pll_ref_cksel = XMEDIA_NULL;
mipitx_pll_ref_cksel = (xmedia_bool *)io_args;
sys_hal_vo_mipitx_pll_ref_cksel(*mipitx_pll_ref_cksel);
break;
}
case SYS_VO_LVDS_CKSEL:{
xmedia_bool *lvds_cksel = XMEDIA_NULL;
lvds_cksel = (xmedia_bool *)io_args;
sys_hal_vo_lvds_cksel(dev, *lvds_cksel);
break;
}
case SYS_VO_LCD_DIV_CFG:{
xmedia_u32 *lcd_div_cfg = XMEDIA_NULL;
lcd_div_cfg = (xmedia_u32 *)io_args;
sys_hal_vo_lcd_div_cfg(*lcd_div_cfg);
break;
}
case SYS_VO_PLL_DIV_CFG:{
xmedia_u32 *pll_div_cfg = XMEDIA_NULL;
pll_div_cfg = (xmedia_u32 *)io_args;
if(sys_hal_vo_pll_div_cfg(*pll_div_cfg) != XMEDIA_SUCCESS) {
return XMEDIA_FAILURE;
}
break;
}
case SYS_VO_VOU_HD_CKEN:{
xmedia_bool *vou_hd_cken = XMEDIA_NULL;
vou_hd_cken = (xmedia_bool *)io_args;
sys_hal_vo_vou_hd_cken(dev, *vou_hd_cken);
break;
}
case SYS_VO_VOU_SRST_REQ:{
xmedia_bool *vou_srst_req = XMEDIA_NULL;
vou_srst_req = (xmedia_bool *)io_args;
sys_hal_vo_vou_srst_req(*vou_srst_req);
break;
}
case SYS_VO_VOU_SRST_GET:{
xmedia_bool *vou_srst = XMEDIA_NULL;
vou_srst = (xmedia_bool *)io_args;
sys_hal_vo_vou_srst_get(vou_srst);
break;
}
case SYS_VO_LCD_DIV_CKEN:{
xmedia_bool *lcd_div_cken = XMEDIA_NULL;
lcd_div_cken = (xmedia_bool *)io_args;
sys_hal_vo_lcd_div_cken(*lcd_div_cken);
break;
}
case SYS_VO_PLL_DIV_CKEN:{
xmedia_bool *pll_div_cken = XMEDIA_NULL;
pll_div_cken = (xmedia_bool *)io_args;
sys_hal_vo_pll_div_cken(*pll_div_cken);
break;
}
case SYS_VO_BT_HD_CKSEL:{
xmedia_bool *bt_hd_cksel = XMEDIA_NULL;
bt_hd_cksel = (xmedia_bool *)io_args;
sys_hal_vo_bt_hd_cksel(*bt_hd_cksel);
break;
}
case SYS_VO_LCD_HD_CKSEL:{
xmedia_bool *lcd_hd_cksel = XMEDIA_NULL;
lcd_hd_cksel = (xmedia_bool *)io_args;
sys_hal_vo_lcd_hd_cksel(*lcd_hd_cksel);
break;
}
case SYS_VO_MIPITX_HD_CKSEL:{
xmedia_bool *mipitx_hd_cksel = XMEDIA_NULL;
mipitx_hd_cksel = (xmedia_bool *)io_args;
sys_hal_vo_mipitx_hd_cksel(*mipitx_hd_cksel);
break;
}
case SYS_VO_LVDSTX_HD_CKSEL:{
xmedia_bool *lvdstx_hd_cksel = XMEDIA_NULL;
lvdstx_hd_cksel = (xmedia_bool *)io_args;
sys_hal_vo_lvdstx_hd_cksel(*lvdstx_hd_cksel);
break;
}
case SYS_VO_BT_PCTRL:{
xmedia_bool *bt_pctrl = XMEDIA_NULL;
bt_pctrl = (xmedia_bool *)io_args;
sys_hal_vo_bt_pctrl(*bt_pctrl);
break;
}
case SYS_VO_LCD_PCTRL:{
xmedia_bool *lcd_pctrl = XMEDIA_NULL;
lcd_pctrl = (xmedia_bool *)io_args;
sys_hal_vo_lcd_pctrl(*lcd_pctrl);
break;
}
case SYS_VO_MIPITX_PCTRL:{
xmedia_bool *mipitx_pctrl = XMEDIA_NULL;
mipitx_pctrl = (xmedia_bool *)io_args;
sys_hal_vo_mipitx_pctrl(*mipitx_pctrl);
break;
}
case SYS_VO_LVDSTX_PCTRL:{
xmedia_bool *lvdstx_pctrl = XMEDIA_NULL;
lvdstx_pctrl = (xmedia_bool *)io_args;
sys_hal_vo_lvdstx_pctrl(*lvdstx_pctrl);
break;
}
case SYS_VO_BT_CKEN:{
xmedia_bool *bt_cken = XMEDIA_NULL;
bt_cken = (xmedia_bool *)io_args;
sys_hal_vo_bt_cken(*bt_cken);
break;
}
case SYS_VO_LCD_CKEN:{
xmedia_bool *lcd_cken = XMEDIA_NULL;
lcd_cken = (xmedia_bool *)io_args;
sys_hal_vo_lcd_cken(*lcd_cken);
break;
}
case SYS_VO_MIPITX_CKEN:{
xmedia_bool *mipitx_cken = XMEDIA_NULL;
mipitx_cken = (xmedia_bool *)io_args;
sys_hal_vo_mipitx_cken(*mipitx_cken);
break;
}
case SYS_VO_LVDSTX_CKEN:{
xmedia_bool *lvdstx_cken = XMEDIA_NULL;
lvdstx_cken = (xmedia_bool *)io_args;
sys_hal_vo_lvdstx_cken(*lvdstx_cken);
break;
}
default: {
return XMEDIA_FAILURE;
}
}
return XMEDIA_SUCCESS;
}
#ifdef __cplusplus
}
#endif /* End of #ifdef __cplusplus */
@@ -0,0 +1,28 @@
/*
* Copyright (c) XMEDIA. All rights reserved.
*/
#ifndef SYS_DRV_H
#define SYS_DRV_H
#include "drv_sys.h"
#ifdef __cplusplus
extern "C" {
#endif /* End of #ifdef __cplusplus */
/*
* End : Segment compress parameter data definition.
*/
xmedia_s32 sys_mod_init(xmedia_void);
xmedia_s32 sys_mod_exit(xmedia_void);
xmedia_s32 sys_mod_ctrl(xmedia_chn_info *chn_info, sys_func_id func_id, xmedia_void *io_args);
#ifdef __cplusplus
}
#endif /* End of #ifdef __cplusplus */
#endif /* End of #ifndef SYS_DRV_H */
@@ -0,0 +1,452 @@
/*
* Copyright (c) XMEDIA. All rights reserved.
*/
#include "drv_reg_crg.h"
#include "drv_reg_sys.h"
#include "sys_hal.h"
#include "xmedia_vo.h"
#include "drv_vo_comm.h"
#ifdef __cplusplus
extern "C" {
#endif /* End of #ifdef __cplusplus */
#define DDRC0_REG_ADDR 0x120d0000 /* base addr of DDRCB */
#define DDRC_REGS_SIZE 0x10000
#define SCT_REGS_ADDR 0x12050000 /* base addr of syscnt */
#define SCT_REGS_SIZE 0x100
#define OTP_REGS_ADDR 0x100A0000
#define OTP_REGS_SIZE 0X10000
#define APLL_VO_VCO_MAX 3700
#define APLL_VO_VCO_MIN 1000
void *g_reg_crg_base_va = (void *)CRG_REGS_ADDR;
void *g_reg_sys_base_va = (void *)SYS_REGS_ADDR;
void *g_reg_ddr0_base_va = (void *)DDRC0_REG_ADDR;
void *g_reg_misc_base_va = (void *)MISC_REGS_ADDR;
void *g_reg_otp_base_va = (void *)OTP_REGS_ADDR;
void *g_sct_addr = (void *)SCT_REGS_ADDR;
xmedia_u32 g_sys_efuse_addr = 0;
xmedia_u32 g_sys_chip_addr = 0;
#define IO_CRG_ADDRESS(x) ((uintptr_t)g_reg_crg_base_va + ((x) - (CRG_REGS_ADDR)))
#define IO_SYS_ADDRESS(x) ((uintptr_t)g_reg_sys_base_va + ((x) - (SYS_REGS_ADDR)))
#define IO_DDR0_ADDRESS(x) ((uintptr_t)g_reg_ddr0_base_va + ((x) - (DDRC0_REG_ADDR)))
#define IO_MISC_ADDRESS(x) ((uintptr_t)g_reg_misc_base_va + ((x) - (MISC_REGS_ADDR)))
static xmedia_u32 hal_vo_sys_reg_read(volatile xmedia_uintptr_t addr)
{
return *(volatile xmedia_u32 *)(addr);
}
static xmedia_void hal_vo_sys_reg_write(volatile xmedia_uintptr_t addr, xmedia_u32 val)
{
*(volatile xmedia_u32 *)(addr) = val;
return;
}
static inline void sys_reg_set_bit(unsigned long value, unsigned long offset, unsigned long addr)
{
unsigned long t, mask;
mask = 1 << offset;
t = hal_vo_sys_reg_read((xmedia_uintptr_t)addr);
t &= ~mask;
t |= (value << offset) & mask;
hal_vo_sys_reg_write ( (xmedia_uintptr_t)addr, t);
}
static inline void sys_reg_write_32(unsigned long value, unsigned long mask, unsigned long addr)
{
unsigned long t;
t = hal_vo_sys_reg_read((xmedia_uintptr_t)addr);
t &= ~mask;
t |= value & mask;
hal_vo_sys_reg_write((xmedia_uintptr_t)addr, t);
}
static inline void sys_reg_read(unsigned int *pvalue, unsigned long addr)
{
*pvalue = hal_vo_sys_reg_read((uintptr_t)addr);
}
xmedia_s32 sys_hal_usrdef_slv_enable(xmedia_bool enable)
{
if (enable == XMEDIA_TRUE) {
sys_reg_set_bit(1, 1, IO_CRG_ADDRESS(CRG_PERCTL50_ADDR)); // 打开时钟
sys_reg_set_bit(0, 0, IO_CRG_ADDRESS(CRG_PERCTL50_ADDR)); // 撤消复位
} else if (enable == XMEDIA_FALSE) {
sys_reg_set_bit(0, 1, IO_CRG_ADDRESS(CRG_PERCTL50_ADDR)); // 关闭时钟
} else {
return XMEDIA_FAILURE;
}
return XMEDIA_SUCCESS;
}
xmedia_void sys_hal_vo_vou_hd_sel(xmedia_s32 vo_dev, xmedia_u32 vou_hd_sel)
{
if(vo_dev == 0) {
sys_reg_write_32(vou_hd_sel << 1 , 0xf << 1, IO_CRG_ADDRESS(CRG_PERCTL67_ADDR));
} else if (vo_dev == 1) {
sys_reg_write_32(vou_hd_sel << 13 , 0xf << 13, IO_CRG_ADDRESS(CRG_PERCTL67_ADDR));
} else {
}
}
xmedia_void sys_hal_vo_vou_ppc_cksel(xmedia_u32 vou_ppc_cksel)
{
sys_reg_write_32(vou_ppc_cksel << 24 , 0x3 << 24, IO_CRG_ADDRESS(CRG_PERCTL67_ADDR));
}
xmedia_void sys_hal_vo_lvds_por_srst(xmedia_bool lvd_por_srst)
{
xmedia_u32 tmp = (lvd_por_srst == XMEDIA_TRUE) ? 1 : 0;
sys_reg_set_bit(tmp, 21, IO_CRG_ADDRESS(CRG_PERCTL66_ADDR));
}
xmedia_void sys_hal_vo_mipitx_pll_ref_cksel(xmedia_bool mipitx_pll_ref_cksel)
{
xmedia_u32 tmp = (mipitx_pll_ref_cksel == XMEDIA_TRUE) ? 1 : 0;
sys_reg_set_bit(tmp, 20, IO_CRG_ADDRESS(CRG_PERCTL66_ADDR));
}
static inline xmedia_u64 vo_div64_u64(xmedia_u64 dividend, xmedia_u64 divisor)
{
return dividend / divisor;
}
xmedia_void sys_hal_vo_lcd_div_cfg(xmedia_u32 lcd_div_cfg)
{
xmedia_u32 lcd_clk_div = (xmedia_u32)vo_div64_u64(vo_div64_u64((xmedia_u64)lcd_div_cfg , 1375) * (1 << 27),
1000*1000);
sys_reg_set_bit(0, 28, IO_CRG_ADDRESS(CRG_PERCTL65_ADDR));
sys_reg_write_32(lcd_clk_div, 0x7ffffff, IO_CRG_ADDRESS(CRG_PERCTL65_ADDR));
}
static xmedia_s32 hal_vo_find_fout_div(xmedia_u32 *fout0_div, xmedia_u32 *fout1_div, xmedia_u32 pll_div,
xmedia_u32 *pll_vco){
xmedia_u32 fout0;
xmedia_u32 fout1;
xmedia_u32 vco;
//fout0 fout1 取值范围都是0 - 15
for(fout0 = 0;fout0 < 16;fout0++) {
for(fout1 = 0;fout1 < 16;fout1++) {
vco = pll_div * (fout0 + 1) * (fout1 + 1);
//vco的取值范围是950 - 3800,但ic要求不要取临近值,所以这里使用1000 - 3700
if((vco > (APLL_VO_VCO_MIN * 1000)) && (vco < (APLL_VO_VCO_MAX * 1000))) {
*fout0_div = fout0;
*fout1_div = fout1;
*pll_vco = vco;
return XMEDIA_SUCCESS;
}
}
}
return XMEDIA_FAILURE;
}
xmedia_s32 sys_hal_vo_pll_div_cfg(xmedia_u32 pll_div_cfg)
{
xmedia_u32 apll_frac;
xmedia_u32 apll_fbdiv;
xmedia_u32 fout0_div;
xmedia_u32 fout1_div;
xmedia_u32 vco;
xmedia_u32 pll_div;
//为避免超出u32范围 对1000取整计算
pll_div = pll_div_cfg / 1000;
//理论不会存在获取不到分频因子的情况
if(hal_vo_find_fout_div(&fout0_div, &fout1_div, pll_div, &vco) != XMEDIA_SUCCESS){
return XMEDIA_FAILURE;
}
//apll倍频整数部分
apll_fbdiv = (vco / 24) / 1000;
//apll倍频小数部分
apll_frac = (vco / 24) % 1000;
apll_frac = (apll_frac * ((1 << 24) / 1000));
sys_reg_write_32(apll_frac, 0xffffff, IO_CRG_ADDRESS(CRG_PERCTL0_ADDR));
// apll 小数/整数分频控制 默认为0 小数分频
sys_reg_set_bit(0, 23, IO_CRG_ADDRESS(CRG_PERCTL1_ADDR));
//除了fout1 fout0 其他都bypass
sys_reg_write_32(0xc << 18, 0xf << 18, IO_CRG_ADDRESS(CRG_PERCTL1_ADDR));
//参考时钟分频系数默认设置为1 apll参考时钟则为24mhz
sys_reg_write_32(0x1 << 12, 0x3f << 12, IO_CRG_ADDRESS(CRG_PERCTL1_ADDR));
sys_reg_write_32(apll_fbdiv, 0xfff, IO_CRG_ADDRESS(CRG_PERCTL1_ADDR));
//APLL 配置fout0 fout1 分频因子
sys_reg_write_32(fout0_div | (fout1_div << 4), 0xffff, IO_CRG_ADDRESS(CRG_PERCTL2_ADDR));
return XMEDIA_SUCCESS;
}
xmedia_void sys_hal_vo_lvds_cksel(xmedia_s32 vo_dev, xmedia_bool lvds_cksel)
{
xmedia_u32 tmp = (lvds_cksel == XMEDIA_TRUE) ? 1 : 0;
if(vo_dev == 0) {
sys_reg_set_bit(tmp, 22, IO_CRG_ADDRESS(CRG_PERCTL67_ADDR));
} else if (vo_dev == 1){
sys_reg_set_bit(tmp, 23, IO_CRG_ADDRESS(CRG_PERCTL67_ADDR));
} else {
}
}
xmedia_void sys_hal_vo_vou_hd_cken(xmedia_s32 vo_dev, xmedia_bool vou_hd_cken)
{
xmedia_u32 tmp = (vou_hd_cken == XMEDIA_TRUE) ? 1 : 0;
if(vo_dev == 0) {
sys_reg_set_bit(tmp, 0, IO_CRG_ADDRESS(CRG_PERCTL67_ADDR));
} else if (vo_dev == 1){
sys_reg_set_bit(tmp, 12, IO_CRG_ADDRESS(CRG_PERCTL67_ADDR));
} else {
}
}
xmedia_void sys_hal_vo_vou_srst_req(xmedia_bool vou_srst_req)
{
xmedia_u32 tmp = (vou_srst_req == XMEDIA_TRUE) ? 1 : 0;
sys_reg_set_bit(tmp, 28, IO_CRG_ADDRESS(CRG_PERCTL67_ADDR));
}
xmedia_s32 sys_hal_vo_vou_srst_get(xmedia_bool* vou_srst)
{
xmedia_u32 reg;
if (vou_srst == XMEDIA_NULL) {
return XMEDIA_FAILURE;
}
sys_reg_read(&reg, IO_CRG_ADDRESS(CRG_PERCTL121_ADDR));
*vou_srst = (reg & 0x1); // bit[0]: vou reset state
return XMEDIA_SUCCESS;
}
xmedia_void sys_hal_vo_lcd_div_cken(xmedia_bool lcd_div_cken)
{
xmedia_u32 tmp = (lcd_div_cken == XMEDIA_TRUE) ? 1 : 0;
sys_reg_set_bit(tmp, 27, IO_CRG_ADDRESS(CRG_PERCTL65_ADDR));
}
xmedia_void sys_hal_vo_pll_div_cken(xmedia_bool pll_div_cken)
{
//0表示输出时钟,只使能或去使能fout1 fout0
xmedia_u32 apll_foutpostdivpd = ((!pll_div_cken) << 1) | ((!pll_div_cken) << 0);
sys_reg_write_32(apll_foutpostdivpd << 24, 0xf << 24, IO_CRG_ADDRESS(CRG_PERCTL1_ADDR));
//APLL Power Down控制
sys_reg_set_bit(!pll_div_cken, 29, IO_CRG_ADDRESS(CRG_PERCTL1_ADDR));
//APLL VCO输出Power Down控制
sys_reg_set_bit(!pll_div_cken, 28, IO_CRG_ADDRESS(CRG_PERCTL1_ADDR));
//APLL 测试信号控制
sys_reg_set_bit(!pll_div_cken, 22, IO_CRG_ADDRESS(CRG_PERCTL1_ADDR));
}
xmedia_void sys_hal_vo_bt_hd_cksel(xmedia_bool bt_hd_cksel)
{
xmedia_u32 tmp = (bt_hd_cksel == XMEDIA_TRUE) ? 1 : 0;
sys_reg_set_bit(tmp, 17, IO_CRG_ADDRESS(CRG_PERCTL66_ADDR));
}
xmedia_void sys_hal_vo_lcd_hd_cksel(xmedia_bool lcd_hd_cksel)
{
xmedia_u32 tmp = (lcd_hd_cksel == XMEDIA_TRUE) ? 1 : 0;
sys_reg_set_bit(tmp, 16, IO_CRG_ADDRESS(CRG_PERCTL66_ADDR));
}
xmedia_void sys_hal_vo_mipitx_hd_cksel(xmedia_bool mipitx_hd_cksel)
{
xmedia_u32 tmp = (mipitx_hd_cksel == XMEDIA_TRUE) ? 1 : 0;
sys_reg_set_bit(tmp, 19, IO_CRG_ADDRESS(CRG_PERCTL66_ADDR));
}
xmedia_void sys_hal_vo_lvdstx_hd_cksel(xmedia_bool lvdstx_hd_cksel)
{
xmedia_u32 tmp = (lvdstx_hd_cksel == XMEDIA_TRUE) ? 1 : 0;
sys_reg_set_bit(tmp, 18, IO_CRG_ADDRESS(CRG_PERCTL66_ADDR));
}
xmedia_void sys_hal_vo_bt_pctrl(xmedia_bool bt_pctrl)
{
xmedia_u32 tmp = (bt_pctrl == XMEDIA_TRUE) ? 1 : 0;
sys_reg_set_bit(tmp, 9, IO_CRG_ADDRESS(CRG_PERCTL66_ADDR));
}
xmedia_void sys_hal_vo_lcd_pctrl(xmedia_bool lcd_pctrl)
{
xmedia_u32 tmp = (lcd_pctrl == XMEDIA_TRUE) ? 1 : 0;
sys_reg_set_bit(tmp, 8, IO_CRG_ADDRESS(CRG_PERCTL66_ADDR));
}
xmedia_void sys_hal_vo_mipitx_pctrl(xmedia_bool mipitx_pctrl)
{
xmedia_u32 tmp = (mipitx_pctrl == XMEDIA_TRUE) ? 1 : 0;
sys_reg_set_bit(tmp, 11, IO_CRG_ADDRESS(CRG_PERCTL66_ADDR));
}
xmedia_void sys_hal_vo_lvdstx_pctrl(xmedia_bool lvdstx_pctrl)
{
xmedia_u32 tmp = (lvdstx_pctrl == XMEDIA_TRUE) ? 1 : 0;
sys_reg_set_bit(tmp, 10, IO_CRG_ADDRESS(CRG_PERCTL66_ADDR));
}
xmedia_void sys_hal_vo_bt_cken(xmedia_bool bt_cken)
{
xmedia_u32 tmp = (bt_cken == XMEDIA_TRUE) ? 1 : 0;
sys_reg_set_bit(tmp, 1, IO_CRG_ADDRESS(CRG_PERCTL66_ADDR));
}
xmedia_void sys_hal_vo_lcd_cken(xmedia_bool lcd_cken)
{
xmedia_u32 tmp = (lcd_cken == XMEDIA_TRUE) ? 1 : 0;
sys_reg_set_bit(tmp, 0, IO_CRG_ADDRESS(CRG_PERCTL66_ADDR));
}
xmedia_void sys_hal_vo_mipitx_cken(xmedia_bool mipitx_cken)
{
xmedia_u32 tmp = (mipitx_cken == XMEDIA_TRUE) ? 1 : 0;
sys_reg_set_bit(tmp, 3, IO_CRG_ADDRESS(CRG_PERCTL66_ADDR));
}
xmedia_void sys_hal_vo_lvdstx_cken(xmedia_bool lvdstx_cken)
{
xmedia_u32 tmp = (lvdstx_cken == XMEDIA_TRUE) ? 1 : 0;
sys_reg_set_bit(tmp, 2, IO_CRG_ADDRESS(CRG_PERCTL66_ADDR));
}
xmedia_s32 sys_hal_init(xmedia_void)
{
#ifdef VO_KERNEL
if (osal_spin_lock_init(&g_crg_spin_lock) < 0) {
osal_printk("spinlock init fail, line: %d. \n", __LINE__);
return -1;
}
if (g_reg_crg_base_va == XMEDIA_NULL) {
g_reg_crg_base_va = (void *)osal_ioremap(CRG_REGS_ADDR, (xmedia_u32)CRG_REGS_SIZE);
if (g_reg_crg_base_va == XMEDIA_NULL) {
osal_printk("remap crg reg fail, line: %d. \n", __LINE__);
goto fail;
}
}
if (g_reg_sys_base_va == XMEDIA_NULL) {
g_reg_sys_base_va = (void *)osal_ioremap(SYS_REGS_ADDR, (xmedia_u32)SYS_REGS_SIZE);
if (g_reg_sys_base_va == XMEDIA_NULL) {
osal_printk("remap sys reg fail, line: %d. \n", __LINE__);
goto fail;
}
}
if (g_reg_ddr0_base_va == XMEDIA_NULL) {
g_reg_ddr0_base_va = (void *)osal_ioremap(DDRC0_REG_ADDR, (xmedia_u32)DDRC_REGS_SIZE);
if (g_reg_ddr0_base_va == XMEDIA_NULL) {
osal_printk("remap ddr0 reg fail, line: %d. \n", __LINE__);
goto fail;
}
}
if (g_reg_misc_base_va == XMEDIA_NULL) {
g_reg_misc_base_va = (void *)osal_ioremap(MISC_REGS_ADDR, (xmedia_u32)MISC_REGS_SIZE);
if (g_reg_misc_base_va == XMEDIA_NULL) {
osal_printk("remap MISC reg fail, line: %d. \n", __LINE__);
goto fail;
}
}
/* version_id与性能限制相关,为了避免通过修改osal_ioremap来更改version_id,使用特殊的iomap函数 */
if (g_reg_otp_base_va == XMEDIA_NULL) {
#ifdef VO_KERNEL
g_reg_otp_base_va = (void *)osal_ioremap(OTP_REGS_ADDR, (xmedia_u32)OTP_REGS_SIZE);
#else
g_reg_otp_base_va = sys_hal_zonediv(OTP_REGS_ADDR, (xmedia_u32)OTP_REGS_SIZE);
#endif
if (g_reg_otp_base_va == XMEDIA_NULL) {
osal_printk("remap OTP reg fail, line: %d. \n", __LINE__);
goto fail;
}
}
if (g_sct_addr == XMEDIA_NULL) {
g_sct_addr = (void *)osal_ioremap(SCT_REGS_ADDR, (xmedia_u32)SCT_REGS_SIZE);
if(g_sct_addr == XMEDIA_NULL) {
osal_printk("remap SCT reg fail, line: %d. \n", __LINE__);
goto fail;
}
}
return 0;
fail:
sys_hal_exit();
return -1;
#endif
return 0;
}
xmedia_void sys_hal_exit(xmedia_void)
{
#ifdef VO_KERNEL
if (g_reg_crg_base_va != XMEDIA_NULL) {
osal_iounmap(g_reg_crg_base_va);
g_reg_crg_base_va = XMEDIA_NULL;
}
if (g_reg_sys_base_va != XMEDIA_NULL) {
osal_iounmap(g_reg_sys_base_va);
g_reg_sys_base_va = XMEDIA_NULL;
}
if (g_reg_ddr0_base_va != XMEDIA_NULL) {
osal_iounmap(g_reg_ddr0_base_va);
g_reg_ddr0_base_va = XMEDIA_NULL;
}
if (g_reg_misc_base_va != XMEDIA_NULL) {
osal_iounmap(g_reg_misc_base_va);
g_reg_misc_base_va = XMEDIA_NULL;
}
if (g_reg_otp_base_va != XMEDIA_NULL) {
#ifdef VO_KERNEL
osal_iounmap(g_reg_otp_base_va);
#else
sys_hal_atmos(g_reg_otp_base_va);
#endif
g_reg_otp_base_va = XMEDIA_NULL;
}
if (g_sct_addr != XMEDIA_NULL) {
osal_iounmap(g_sct_addr);
g_sct_addr = XMEDIA_NULL;
}
osal_spin_lock_destroy(&g_crg_spin_lock);
return;
#endif
return;
}
#ifdef __cplusplus
}
#endif /* End of #ifdef __cplusplus */
@@ -0,0 +1,45 @@
/*
* Copyright (c) XMEDIA. All rights reserved.
*/
#ifndef SYS_HAL_H
#define SYS_HAL_H
#include "drv_vo_comm.h"
#ifdef __cplusplus
extern "C" {
#endif /* End of #ifdef __cplusplus */
xmedia_s32 sys_hal_init(xmedia_void);
xmedia_void sys_hal_exit(xmedia_void);
xmedia_void sys_hal_vo_vou_hd_sel(xmedia_s32 vo_dev, xmedia_u32 vou_hd_sel);
xmedia_void sys_hal_vo_vou_ppc_cksel(xmedia_u32 vou_ppc_cksel);
xmedia_void sys_hal_vo_lvds_por_srst(xmedia_bool lvd_por_srst);
xmedia_void sys_hal_vo_mipitx_pll_ref_cksel(xmedia_bool mipitx_pll_ref_cksel);
xmedia_void sys_hal_vo_lvds_cksel(xmedia_s32 vo_dev, xmedia_bool lvds_cksel);
xmedia_void sys_hal_vo_lcd_div_cfg(xmedia_u32 lcd_div_cfg);
xmedia_s32 sys_hal_vo_pll_div_cfg(xmedia_u32 pll_div_cfg);
xmedia_void sys_hal_vo_vou_hd_cken(xmedia_s32 vo_dev, xmedia_bool vou_hd_cken);
xmedia_void sys_hal_vo_vou_srst_req(xmedia_bool vou_srst_req);
xmedia_s32 sys_hal_vo_vou_srst_get(xmedia_bool* vou_srst_req);
xmedia_void sys_hal_vo_lcd_div_cken(xmedia_bool lcd_div_cken);
xmedia_void sys_hal_vo_pll_div_cken(xmedia_bool pll_div_cken);
xmedia_void sys_hal_vo_bt_hd_cksel(xmedia_bool bt_hd_cksel);
xmedia_void sys_hal_vo_lcd_hd_cksel(xmedia_bool lcd_hd_cksel);
xmedia_void sys_hal_vo_mipitx_hd_cksel(xmedia_bool mipitx_hd_cksel);
xmedia_void sys_hal_vo_lvdstx_hd_cksel(xmedia_bool lvdstx_hd_cksel);
xmedia_void sys_hal_vo_bt_pctrl(xmedia_bool bt_pctrl);
xmedia_void sys_hal_vo_lcd_pctrl(xmedia_bool lcd_pctrl);
xmedia_void sys_hal_vo_mipitx_pctrl(xmedia_bool mipitx_pctrl);
xmedia_void sys_hal_vo_lvdstx_pctrl(xmedia_bool lvdstx_pctrl);
xmedia_void sys_hal_vo_bt_cken(xmedia_bool bt_cken);
xmedia_void sys_hal_vo_lcd_cken(xmedia_bool lcd_cken);
xmedia_void sys_hal_vo_mipitx_cken(xmedia_bool mipitx_cken);
xmedia_void sys_hal_vo_lvdstx_cken(xmedia_bool lvdstx_cken);
#ifdef __cplusplus
}
#endif /* End of #ifdef __cplusplus */
#endif /* End of #ifndef SYS_HAL_H */
@@ -0,0 +1,22 @@
/*
* Copyright (c) XMEDIA. All rights reserved.
*/
#ifndef DRV_REG_CRG_H
#define DRV_REG_CRG_H
#define CRG_REGS_ADDR 0x12010000
#define CRG_REGS_SIZE 0X10000
#define CRG_PERCTL0_ADDR (CRG_REGS_ADDR + 0x0)
#define CRG_PERCTL1_ADDR (CRG_REGS_ADDR + 0x4)
#define CRG_PERCTL2_ADDR (CRG_REGS_ADDR + 0x8)
#define CRG_PERCTL50_ADDR (CRG_REGS_ADDR + 0xc8)
#define CRG_PERCTL65_ADDR (CRG_REGS_ADDR + 0x104)
#define CRG_PERCTL66_ADDR (CRG_REGS_ADDR + 0x108)
#define CRG_PERCTL67_ADDR (CRG_REGS_ADDR + 0x10c)
#define CRG_PERCTL121_ADDR (CRG_REGS_ADDR + 0x1e4)
#endif
@@ -0,0 +1,14 @@
/*
* Copyright (c) XMEDIA. All rights reserved.
*/
#ifndef DRV_REG_SYS_H
#define DRV_REG_SYS_H
#define SYS_REGS_ADDR 0x12020000
#define SYS_REGS_SIZE 0x8000
#define MISC_REGS_ADDR 0x12028000
#define MISC_REGS_SIZE 0x8000
#endif
+222
View File
@@ -0,0 +1,222 @@
/*
* Copyright (c) XMEDIA. All rights reserved.
*/
#include "common.h"
#include "sys_drv.h"
#include "sys_hal.h"
#include "drv_sys.h"
#include "xmedia_vo.h"
#include "drv_vo_comm.h"
#ifdef __cplusplus
extern "C" {
#endif /* End of #ifdef __cplusplus */
#define PHASE 32
#define SYS_MULTI_V 1048576
#define SYS_MULTI_H 1048576
xmedia_s32 sys_mod_init(xmedia_void)
{
xmedia_s32 ret;
ret = sys_hal_init();
return ret;
}
xmedia_s32 sys_mod_exit(xmedia_void)
{
sys_hal_exit();
return XMEDIA_SUCCESS;
}
xmedia_s32 sys_mod_ctrl(xmedia_chn_info *chn_info, sys_func_id func_id, xmedia_void *io_args)
{
xmedia_s32 dev;
dev = chn_info->dev_id;
switch (func_id) {
case SYS_VO_VOU_HD_CKSEL:{
xmedia_u32 *vou_hd_sel = XMEDIA_NULL;
vou_hd_sel = (xmedia_u32 *)io_args;
sys_hal_vo_vou_hd_sel(dev, *vou_hd_sel);
break;
}
case SYS_VO_VOU_PPC_CKSEL: {
xmedia_u32 *vou_ppc_cksel = XMEDIA_NULL;
vou_ppc_cksel = (xmedia_u32 *)io_args;
sys_hal_vo_vou_ppc_cksel(*vou_ppc_cksel);
break;
}
case SYS_VO_LVDS_POR_SRST: {
xmedia_bool *lvd_por_srst = XMEDIA_NULL;
lvd_por_srst = (xmedia_bool *)io_args;
sys_hal_vo_lvds_por_srst(*lvd_por_srst);
break;
}
case SYS_VO_MIPITX_PLL_REF_CKSEL: {
xmedia_bool *mipitx_pll_ref_cksel = XMEDIA_NULL;
mipitx_pll_ref_cksel = (xmedia_bool *)io_args;
sys_hal_vo_mipitx_pll_ref_cksel(*mipitx_pll_ref_cksel);
break;
}
case SYS_VO_LVDS_CKSEL:{
xmedia_bool *lvds_cksel = XMEDIA_NULL;
lvds_cksel = (xmedia_bool *)io_args;
sys_hal_vo_lvds_cksel(dev, *lvds_cksel);
break;
}
case SYS_VO_LCD_DIV_CFG:{
xmedia_u32 *lcd_div_cfg = XMEDIA_NULL;
lcd_div_cfg = (xmedia_u32 *)io_args;
sys_hal_vo_lcd_div_cfg(*lcd_div_cfg);
break;
}
case SYS_VO_PLL_DIV_CFG:{
xmedia_u32 *pll_div_cfg = XMEDIA_NULL;
pll_div_cfg = (xmedia_u32 *)io_args;
if(sys_hal_vo_pll_div_cfg(*pll_div_cfg) != XMEDIA_SUCCESS) {
return XMEDIA_FAILURE;
}
break;
}
case SYS_VO_VOU_HD_CKEN:{
xmedia_bool *vou_hd_cken = XMEDIA_NULL;
vou_hd_cken = (xmedia_bool *)io_args;
sys_hal_vo_vou_hd_cken(dev, *vou_hd_cken);
break;
}
case SYS_VO_VOU_SRST_REQ:{
xmedia_bool *vou_srst_req = XMEDIA_NULL;
vou_srst_req = (xmedia_bool *)io_args;
sys_hal_vo_vou_srst_req(*vou_srst_req);
break;
}
case SYS_VO_VOU_SRST_GET:{
xmedia_bool *vou_srst = XMEDIA_NULL;
vou_srst = (xmedia_bool *)io_args;
sys_hal_vo_vou_srst_get(vou_srst);
break;
}
case SYS_VO_LCD_DIV_CKEN:{
xmedia_bool *lcd_div_cken = XMEDIA_NULL;
lcd_div_cken = (xmedia_bool *)io_args;
sys_hal_vo_lcd_div_cken(*lcd_div_cken);
break;
}
case SYS_VO_PLL_DIV_CKEN:{
xmedia_bool *pll_div_cken = XMEDIA_NULL;
pll_div_cken = (xmedia_bool *)io_args;
sys_hal_vo_pll_div_cken(*pll_div_cken);
break;
}
case SYS_VO_BT_HD_CKSEL:{
xmedia_bool *bt_hd_cksel = XMEDIA_NULL;
bt_hd_cksel = (xmedia_bool *)io_args;
sys_hal_vo_bt_hd_cksel(*bt_hd_cksel);
break;
}
case SYS_VO_LCD_HD_CKSEL:{
xmedia_bool *lcd_hd_cksel = XMEDIA_NULL;
lcd_hd_cksel = (xmedia_bool *)io_args;
sys_hal_vo_lcd_hd_cksel(*lcd_hd_cksel);
break;
}
case SYS_VO_MIPITX_HD_CKSEL:{
xmedia_bool *mipitx_hd_cksel = XMEDIA_NULL;
mipitx_hd_cksel = (xmedia_bool *)io_args;
sys_hal_vo_mipitx_hd_cksel(*mipitx_hd_cksel);
break;
}
case SYS_VO_LVDSTX_HD_CKSEL:{
xmedia_bool *lvdstx_hd_cksel = XMEDIA_NULL;
lvdstx_hd_cksel = (xmedia_bool *)io_args;
sys_hal_vo_lvdstx_hd_cksel(*lvdstx_hd_cksel);
break;
}
case SYS_VO_BT_PCTRL:{
xmedia_bool *bt_pctrl = XMEDIA_NULL;
bt_pctrl = (xmedia_bool *)io_args;
sys_hal_vo_bt_pctrl(*bt_pctrl);
break;
}
case SYS_VO_LCD_PCTRL:{
xmedia_bool *lcd_pctrl = XMEDIA_NULL;
lcd_pctrl = (xmedia_bool *)io_args;
sys_hal_vo_lcd_pctrl(*lcd_pctrl);
break;
}
case SYS_VO_MIPITX_PCTRL:{
xmedia_bool *mipitx_pctrl = XMEDIA_NULL;
mipitx_pctrl = (xmedia_bool *)io_args;
sys_hal_vo_mipitx_pctrl(*mipitx_pctrl);
break;
}
case SYS_VO_LVDSTX_PCTRL:{
xmedia_bool *lvdstx_pctrl = XMEDIA_NULL;
lvdstx_pctrl = (xmedia_bool *)io_args;
sys_hal_vo_lvdstx_pctrl(*lvdstx_pctrl);
break;
}
case SYS_VO_BT_CKEN:{
xmedia_bool *bt_cken = XMEDIA_NULL;
bt_cken = (xmedia_bool *)io_args;
sys_hal_vo_bt_cken(*bt_cken);
break;
}
case SYS_VO_LCD_CKEN:{
xmedia_bool *lcd_cken = XMEDIA_NULL;
lcd_cken = (xmedia_bool *)io_args;
sys_hal_vo_lcd_cken(*lcd_cken);
break;
}
case SYS_VO_MIPITX_CKEN:{
xmedia_bool *mipitx_cken = XMEDIA_NULL;
mipitx_cken = (xmedia_bool *)io_args;
sys_hal_vo_mipitx_cken(*mipitx_cken);
break;
}
case SYS_VO_LVDSTX_CKEN:{
xmedia_bool *lvdstx_cken = XMEDIA_NULL;
lvdstx_cken = (xmedia_bool *)io_args;
sys_hal_vo_lvdstx_cken(*lvdstx_cken);
break;
}
default: {
return XMEDIA_FAILURE;
}
}
return XMEDIA_SUCCESS;
}
#ifdef __cplusplus
}
#endif /* End of #ifdef __cplusplus */
@@ -0,0 +1,28 @@
/*
* Copyright (c) XMEDIA. All rights reserved.
*/
#ifndef SYS_DRV_H
#define SYS_DRV_H
#include "drv_sys.h"
#ifdef __cplusplus
extern "C" {
#endif /* End of #ifdef __cplusplus */
/*
* End : Segment compress parameter data definition.
*/
xmedia_s32 sys_mod_init(xmedia_void);
xmedia_s32 sys_mod_exit(xmedia_void);
xmedia_s32 sys_mod_ctrl(xmedia_chn_info *chn_info, sys_func_id func_id, xmedia_void *io_args);
#ifdef __cplusplus
}
#endif /* End of #ifdef __cplusplus */
#endif /* End of #ifndef SYS_DRV_H */
+453
View File
@@ -0,0 +1,453 @@
/*
* Copyright (c) XMEDIA. All rights reserved.
*/
#include "drv_reg_crg.h"
#include "drv_reg_sys.h"
#include "sys_hal.h"
#include "xmedia_vo.h"
#include "drv_vo_comm.h"
#ifdef __cplusplus
extern "C" {
#endif /* End of #ifdef __cplusplus */
#define DDRC0_REG_ADDR 0x120d0000 /* base addr of DDRCB */
#define DDRC_REGS_SIZE 0x10000
#define SCT_REGS_ADDR 0x12050000 /* base addr of syscnt */
#define SCT_REGS_SIZE 0x100
#define OTP_REGS_ADDR 0x100A0000
#define OTP_REGS_SIZE 0X10000
#define APLL_VO_VCO_MAX 3700
#define APLL_VO_VCO_MIN 1000
#define VO_LCD_DIV_SRC 1188
void *g_reg_crg_base_va = (void *)CRG_REGS_ADDR;
void *g_reg_sys_base_va = (void *)SYS_REGS_ADDR;
void *g_reg_ddr0_base_va = (void *)DDRC0_REG_ADDR;
void *g_reg_misc_base_va = (void *)MISC_REGS_ADDR;
void *g_reg_otp_base_va = (void *)OTP_REGS_ADDR;
void *g_sct_addr = (void *)SCT_REGS_ADDR;
xmedia_u32 g_sys_efuse_addr = 0;
xmedia_u32 g_sys_chip_addr = 0;
#define IO_CRG_ADDRESS(x) ((uintptr_t)g_reg_crg_base_va + ((x) - (CRG_REGS_ADDR)))
#define IO_SYS_ADDRESS(x) ((uintptr_t)g_reg_sys_base_va + ((x) - (SYS_REGS_ADDR)))
#define IO_DDR0_ADDRESS(x) ((uintptr_t)g_reg_ddr0_base_va + ((x) - (DDRC0_REG_ADDR)))
#define IO_MISC_ADDRESS(x) ((uintptr_t)g_reg_misc_base_va + ((x) - (MISC_REGS_ADDR)))
static xmedia_u32 hal_vo_sys_reg_read(volatile xmedia_uintptr_t addr)
{
return *(volatile xmedia_u32 *)(addr);
}
static xmedia_void hal_vo_sys_reg_write(volatile xmedia_uintptr_t addr, xmedia_u32 val)
{
*(volatile xmedia_u32 *)(addr) = val;
return;
}
static inline void sys_reg_set_bit(unsigned long value, unsigned long offset, unsigned long addr)
{
unsigned long t, mask;
mask = 1 << offset;
t = hal_vo_sys_reg_read((xmedia_uintptr_t)addr);
t &= ~mask;
t |= (value << offset) & mask;
hal_vo_sys_reg_write ( (xmedia_uintptr_t)addr, t);
}
static inline void sys_reg_write_32(unsigned long value, unsigned long mask, unsigned long addr)
{
unsigned long t;
t = hal_vo_sys_reg_read((xmedia_uintptr_t)addr);
t &= ~mask;
t |= value & mask;
hal_vo_sys_reg_write((xmedia_uintptr_t)addr, t);
}
static inline void sys_reg_read(unsigned int *pvalue, unsigned long addr)
{
*pvalue = hal_vo_sys_reg_read((uintptr_t)addr);
}
xmedia_s32 sys_hal_usrdef_slv_enable(xmedia_bool enable)
{
if (enable == XMEDIA_TRUE) {
sys_reg_set_bit(1, 1, IO_CRG_ADDRESS(CRG_PERCTL50_ADDR)); // 打开时钟
sys_reg_set_bit(0, 0, IO_CRG_ADDRESS(CRG_PERCTL50_ADDR)); // 撤消复位
} else if (enable == XMEDIA_FALSE) {
sys_reg_set_bit(0, 1, IO_CRG_ADDRESS(CRG_PERCTL50_ADDR)); // 关闭时钟
} else {
return XMEDIA_FAILURE;
}
return XMEDIA_SUCCESS;
}
xmedia_void sys_hal_vo_vou_hd_sel(xmedia_s32 vo_dev, xmedia_u32 vou_hd_sel)
{
if(vo_dev == 0) {
sys_reg_write_32(vou_hd_sel << 1 , 0xf << 1, IO_CRG_ADDRESS(CRG_PERCTL67_ADDR));
} else if (vo_dev == 1) {
sys_reg_write_32(vou_hd_sel << 13 , 0xf << 13, IO_CRG_ADDRESS(CRG_PERCTL67_ADDR));
} else {
}
}
xmedia_void sys_hal_vo_vou_ppc_cksel(xmedia_u32 vou_ppc_cksel)
{
sys_reg_write_32(vou_ppc_cksel << 24 , 0x3 << 24, IO_CRG_ADDRESS(CRG_PERCTL67_ADDR));
}
xmedia_void sys_hal_vo_lvds_por_srst(xmedia_bool lvd_por_srst)
{
xmedia_u32 tmp = (lvd_por_srst == XMEDIA_TRUE) ? 1 : 0;
sys_reg_set_bit(tmp, 21, IO_CRG_ADDRESS(CRG_PERCTL66_ADDR));
}
xmedia_void sys_hal_vo_mipitx_pll_ref_cksel(xmedia_bool mipitx_pll_ref_cksel)
{
xmedia_u32 tmp = (mipitx_pll_ref_cksel == XMEDIA_TRUE) ? 1 : 0;
sys_reg_set_bit(tmp, 20, IO_CRG_ADDRESS(CRG_PERCTL66_ADDR));
}
static inline xmedia_u64 vo_div64_u64(xmedia_u64 dividend, xmedia_u64 divisor)
{
return dividend / divisor;
}
xmedia_void sys_hal_vo_lcd_div_cfg(xmedia_u32 lcd_div_cfg)
{
xmedia_u32 lcd_clk_div = (xmedia_u32)vo_div64_u64(vo_div64_u64((xmedia_u64)lcd_div_cfg , VO_LCD_DIV_SRC) * (1 << 27),
1000*1000);
sys_reg_set_bit(0, 28, IO_CRG_ADDRESS(CRG_PERCTL65_ADDR));
sys_reg_write_32(lcd_clk_div, 0x7ffffff, IO_CRG_ADDRESS(CRG_PERCTL65_ADDR));
}
static xmedia_s32 hal_vo_find_fout_div(xmedia_u32 *fout0_div, xmedia_u32 *fout1_div, xmedia_u32 pll_div,
xmedia_u32 *pll_vco){
xmedia_u32 fout0;
xmedia_u32 fout1;
xmedia_u32 vco;
//fout0 fout1 取值范围都是0 - 15
for(fout0 = 0;fout0 < 16;fout0++) {
for(fout1 = 0;fout1 < 16;fout1++) {
vco = pll_div * (fout0 + 1) * (fout1 + 1);
//vco的取值范围是950 - 3800,但ic要求不要取临近值,所以这里使用1000 - 3700
if((vco > (APLL_VO_VCO_MIN * 1000)) && (vco < (APLL_VO_VCO_MAX * 1000))) {
*fout0_div = fout0;
*fout1_div = fout1;
*pll_vco = vco;
return XMEDIA_SUCCESS;
}
}
}
return XMEDIA_FAILURE;
}
xmedia_s32 sys_hal_vo_pll_div_cfg(xmedia_u32 pll_div_cfg)
{
xmedia_u32 apll_frac;
xmedia_u32 apll_fbdiv;
xmedia_u32 fout0_div;
xmedia_u32 fout1_div;
xmedia_u32 vco;
xmedia_u32 pll_div;
//为避免超出u32范围 对1000取整计算
pll_div = pll_div_cfg / 1000;
//理论不会存在获取不到分频因子的情况
if(hal_vo_find_fout_div(&fout0_div, &fout1_div, pll_div, &vco) != XMEDIA_SUCCESS){
return XMEDIA_FAILURE;
}
//apll倍频整数部分
apll_fbdiv = (vco / 24) / 1000;
//apll倍频小数部分
apll_frac = (vco / 24) % 1000;
apll_frac = (apll_frac * ((1 << 24) / 1000));
sys_reg_write_32(apll_frac, 0xffffff, IO_CRG_ADDRESS(CRG_PERCTL0_ADDR));
// apll 小数/整数分频控制 默认为0 小数分频
sys_reg_set_bit(0, 23, IO_CRG_ADDRESS(CRG_PERCTL1_ADDR));
//除了fout1 fout0 其他都bypass
sys_reg_write_32(0xc << 18, 0xf << 18, IO_CRG_ADDRESS(CRG_PERCTL1_ADDR));
//参考时钟分频系数默认设置为1 apll参考时钟则为24mhz
sys_reg_write_32(0x1 << 12, 0x3f << 12, IO_CRG_ADDRESS(CRG_PERCTL1_ADDR));
sys_reg_write_32(apll_fbdiv, 0xfff, IO_CRG_ADDRESS(CRG_PERCTL1_ADDR));
//APLL 配置fout0 fout1 分频因子
sys_reg_write_32(fout0_div | (fout1_div << 4), 0xffff, IO_CRG_ADDRESS(CRG_PERCTL2_ADDR));
return XMEDIA_SUCCESS;
}
xmedia_void sys_hal_vo_lvds_cksel(xmedia_s32 vo_dev, xmedia_bool lvds_cksel)
{
xmedia_u32 tmp = (lvds_cksel == XMEDIA_TRUE) ? 1 : 0;
if(vo_dev == 0) {
sys_reg_set_bit(tmp, 22, IO_CRG_ADDRESS(CRG_PERCTL67_ADDR));
} else if (vo_dev == 1){
sys_reg_set_bit(tmp, 23, IO_CRG_ADDRESS(CRG_PERCTL67_ADDR));
} else {
}
}
xmedia_void sys_hal_vo_vou_hd_cken(xmedia_s32 vo_dev, xmedia_bool vou_hd_cken)
{
xmedia_u32 tmp = (vou_hd_cken == XMEDIA_TRUE) ? 1 : 0;
if(vo_dev == 0) {
sys_reg_set_bit(tmp, 0, IO_CRG_ADDRESS(CRG_PERCTL67_ADDR));
} else if (vo_dev == 1){
sys_reg_set_bit(tmp, 12, IO_CRG_ADDRESS(CRG_PERCTL67_ADDR));
} else {
}
}
xmedia_void sys_hal_vo_vou_srst_req(xmedia_bool vou_srst_req)
{
xmedia_u32 tmp = (vou_srst_req == XMEDIA_TRUE) ? 1 : 0;
sys_reg_set_bit(tmp, 28, IO_CRG_ADDRESS(CRG_PERCTL67_ADDR));
}
xmedia_s32 sys_hal_vo_vou_srst_get(xmedia_bool* vou_srst)
{
xmedia_u32 reg;
if (vou_srst == XMEDIA_NULL) {
return XMEDIA_FAILURE;
}
sys_reg_read(&reg, IO_CRG_ADDRESS(CRG_PERCTL121_ADDR));
*vou_srst = (reg & 0x1); // bit[0]: vou reset state
return XMEDIA_SUCCESS;
}
xmedia_void sys_hal_vo_lcd_div_cken(xmedia_bool lcd_div_cken)
{
xmedia_u32 tmp = (lcd_div_cken == XMEDIA_TRUE) ? 1 : 0;
sys_reg_set_bit(tmp, 27, IO_CRG_ADDRESS(CRG_PERCTL65_ADDR));
}
xmedia_void sys_hal_vo_pll_div_cken(xmedia_bool pll_div_cken)
{
//0表示输出时钟,只使能或去使能fout1 fout0
xmedia_u32 apll_foutpostdivpd = ((!pll_div_cken) << 1) | ((!pll_div_cken) << 0);
sys_reg_write_32(apll_foutpostdivpd << 24, 0xf << 24, IO_CRG_ADDRESS(CRG_PERCTL1_ADDR));
//APLL Power Down控制
sys_reg_set_bit(!pll_div_cken, 29, IO_CRG_ADDRESS(CRG_PERCTL1_ADDR));
//APLL VCO输出Power Down控制
sys_reg_set_bit(!pll_div_cken, 28, IO_CRG_ADDRESS(CRG_PERCTL1_ADDR));
//APLL 测试信号控制
sys_reg_set_bit(!pll_div_cken, 22, IO_CRG_ADDRESS(CRG_PERCTL1_ADDR));
}
xmedia_void sys_hal_vo_bt_hd_cksel(xmedia_bool bt_hd_cksel)
{
xmedia_u32 tmp = (bt_hd_cksel == XMEDIA_TRUE) ? 1 : 0;
sys_reg_set_bit(tmp, 17, IO_CRG_ADDRESS(CRG_PERCTL66_ADDR));
}
xmedia_void sys_hal_vo_lcd_hd_cksel(xmedia_bool lcd_hd_cksel)
{
xmedia_u32 tmp = (lcd_hd_cksel == XMEDIA_TRUE) ? 1 : 0;
sys_reg_set_bit(tmp, 16, IO_CRG_ADDRESS(CRG_PERCTL66_ADDR));
}
xmedia_void sys_hal_vo_mipitx_hd_cksel(xmedia_bool mipitx_hd_cksel)
{
xmedia_u32 tmp = (mipitx_hd_cksel == XMEDIA_TRUE) ? 1 : 0;
sys_reg_set_bit(tmp, 19, IO_CRG_ADDRESS(CRG_PERCTL66_ADDR));
}
xmedia_void sys_hal_vo_lvdstx_hd_cksel(xmedia_bool lvdstx_hd_cksel)
{
xmedia_u32 tmp = (lvdstx_hd_cksel == XMEDIA_TRUE) ? 1 : 0;
sys_reg_set_bit(tmp, 18, IO_CRG_ADDRESS(CRG_PERCTL66_ADDR));
}
xmedia_void sys_hal_vo_bt_pctrl(xmedia_bool bt_pctrl)
{
xmedia_u32 tmp = (bt_pctrl == XMEDIA_TRUE) ? 1 : 0;
sys_reg_set_bit(tmp, 9, IO_CRG_ADDRESS(CRG_PERCTL66_ADDR));
}
xmedia_void sys_hal_vo_lcd_pctrl(xmedia_bool lcd_pctrl)
{
xmedia_u32 tmp = (lcd_pctrl == XMEDIA_TRUE) ? 1 : 0;
sys_reg_set_bit(tmp, 8, IO_CRG_ADDRESS(CRG_PERCTL66_ADDR));
}
xmedia_void sys_hal_vo_mipitx_pctrl(xmedia_bool mipitx_pctrl)
{
xmedia_u32 tmp = (mipitx_pctrl == XMEDIA_TRUE) ? 1 : 0;
sys_reg_set_bit(tmp, 11, IO_CRG_ADDRESS(CRG_PERCTL66_ADDR));
}
xmedia_void sys_hal_vo_lvdstx_pctrl(xmedia_bool lvdstx_pctrl)
{
xmedia_u32 tmp = (lvdstx_pctrl == XMEDIA_TRUE) ? 1 : 0;
sys_reg_set_bit(tmp, 10, IO_CRG_ADDRESS(CRG_PERCTL66_ADDR));
}
xmedia_void sys_hal_vo_bt_cken(xmedia_bool bt_cken)
{
xmedia_u32 tmp = (bt_cken == XMEDIA_TRUE) ? 1 : 0;
sys_reg_set_bit(tmp, 1, IO_CRG_ADDRESS(CRG_PERCTL66_ADDR));
}
xmedia_void sys_hal_vo_lcd_cken(xmedia_bool lcd_cken)
{
xmedia_u32 tmp = (lcd_cken == XMEDIA_TRUE) ? 1 : 0;
sys_reg_set_bit(tmp, 0, IO_CRG_ADDRESS(CRG_PERCTL66_ADDR));
}
xmedia_void sys_hal_vo_mipitx_cken(xmedia_bool mipitx_cken)
{
xmedia_u32 tmp = (mipitx_cken == XMEDIA_TRUE) ? 1 : 0;
sys_reg_set_bit(tmp, 3, IO_CRG_ADDRESS(CRG_PERCTL66_ADDR));
}
xmedia_void sys_hal_vo_lvdstx_cken(xmedia_bool lvdstx_cken)
{
xmedia_u32 tmp = (lvdstx_cken == XMEDIA_TRUE) ? 1 : 0;
sys_reg_set_bit(tmp, 2, IO_CRG_ADDRESS(CRG_PERCTL66_ADDR));
}
xmedia_s32 sys_hal_init(xmedia_void)
{
#ifdef VO_KERNEL
if (osal_spin_lock_init(&g_crg_spin_lock) < 0) {
osal_printk("spinlock init fail, line: %d. \n", __LINE__);
return -1;
}
if (g_reg_crg_base_va == XMEDIA_NULL) {
g_reg_crg_base_va = (void *)osal_ioremap(CRG_REGS_ADDR, (xmedia_u32)CRG_REGS_SIZE);
if (g_reg_crg_base_va == XMEDIA_NULL) {
osal_printk("remap crg reg fail, line: %d. \n", __LINE__);
goto fail;
}
}
if (g_reg_sys_base_va == XMEDIA_NULL) {
g_reg_sys_base_va = (void *)osal_ioremap(SYS_REGS_ADDR, (xmedia_u32)SYS_REGS_SIZE);
if (g_reg_sys_base_va == XMEDIA_NULL) {
osal_printk("remap sys reg fail, line: %d. \n", __LINE__);
goto fail;
}
}
if (g_reg_ddr0_base_va == XMEDIA_NULL) {
g_reg_ddr0_base_va = (void *)osal_ioremap(DDRC0_REG_ADDR, (xmedia_u32)DDRC_REGS_SIZE);
if (g_reg_ddr0_base_va == XMEDIA_NULL) {
osal_printk("remap ddr0 reg fail, line: %d. \n", __LINE__);
goto fail;
}
}
if (g_reg_misc_base_va == XMEDIA_NULL) {
g_reg_misc_base_va = (void *)osal_ioremap(MISC_REGS_ADDR, (xmedia_u32)MISC_REGS_SIZE);
if (g_reg_misc_base_va == XMEDIA_NULL) {
osal_printk("remap MISC reg fail, line: %d. \n", __LINE__);
goto fail;
}
}
/* version_id与性能限制相关,为了避免通过修改osal_ioremap来更改version_id,使用特殊的iomap函数 */
if (g_reg_otp_base_va == XMEDIA_NULL) {
#ifdef VO_KERNEL
g_reg_otp_base_va = (void *)osal_ioremap(OTP_REGS_ADDR, (xmedia_u32)OTP_REGS_SIZE);
#else
g_reg_otp_base_va = sys_hal_zonediv(OTP_REGS_ADDR, (xmedia_u32)OTP_REGS_SIZE);
#endif
if (g_reg_otp_base_va == XMEDIA_NULL) {
osal_printk("remap OTP reg fail, line: %d. \n", __LINE__);
goto fail;
}
}
if (g_sct_addr == XMEDIA_NULL) {
g_sct_addr = (void *)osal_ioremap(SCT_REGS_ADDR, (xmedia_u32)SCT_REGS_SIZE);
if(g_sct_addr == XMEDIA_NULL) {
osal_printk("remap SCT reg fail, line: %d. \n", __LINE__);
goto fail;
}
}
return 0;
fail:
sys_hal_exit();
return -1;
#endif
return 0;
}
xmedia_void sys_hal_exit(xmedia_void)
{
#ifdef VO_KERNEL
if (g_reg_crg_base_va != XMEDIA_NULL) {
osal_iounmap(g_reg_crg_base_va);
g_reg_crg_base_va = XMEDIA_NULL;
}
if (g_reg_sys_base_va != XMEDIA_NULL) {
osal_iounmap(g_reg_sys_base_va);
g_reg_sys_base_va = XMEDIA_NULL;
}
if (g_reg_ddr0_base_va != XMEDIA_NULL) {
osal_iounmap(g_reg_ddr0_base_va);
g_reg_ddr0_base_va = XMEDIA_NULL;
}
if (g_reg_misc_base_va != XMEDIA_NULL) {
osal_iounmap(g_reg_misc_base_va);
g_reg_misc_base_va = XMEDIA_NULL;
}
if (g_reg_otp_base_va != XMEDIA_NULL) {
#ifdef VO_KERNEL
osal_iounmap(g_reg_otp_base_va);
#else
sys_hal_atmos(g_reg_otp_base_va);
#endif
g_reg_otp_base_va = XMEDIA_NULL;
}
if (g_sct_addr != XMEDIA_NULL) {
osal_iounmap(g_sct_addr);
g_sct_addr = XMEDIA_NULL;
}
osal_spin_lock_destroy(&g_crg_spin_lock);
return;
#endif
return;
}
#ifdef __cplusplus
}
#endif /* End of #ifdef __cplusplus */
@@ -0,0 +1,45 @@
/*
* Copyright (c) XMEDIA. All rights reserved.
*/
#ifndef SYS_HAL_H
#define SYS_HAL_H
#include "drv_vo_comm.h"
#ifdef __cplusplus
extern "C" {
#endif /* End of #ifdef __cplusplus */
xmedia_s32 sys_hal_init(xmedia_void);
xmedia_void sys_hal_exit(xmedia_void);
xmedia_void sys_hal_vo_vou_hd_sel(xmedia_s32 vo_dev, xmedia_u32 vou_hd_sel);
xmedia_void sys_hal_vo_vou_ppc_cksel(xmedia_u32 vou_ppc_cksel);
xmedia_void sys_hal_vo_lvds_por_srst(xmedia_bool lvd_por_srst);
xmedia_void sys_hal_vo_mipitx_pll_ref_cksel(xmedia_bool mipitx_pll_ref_cksel);
xmedia_void sys_hal_vo_lvds_cksel(xmedia_s32 vo_dev, xmedia_bool lvds_cksel);
xmedia_void sys_hal_vo_lcd_div_cfg(xmedia_u32 lcd_div_cfg);
xmedia_s32 sys_hal_vo_pll_div_cfg(xmedia_u32 pll_div_cfg);
xmedia_void sys_hal_vo_vou_hd_cken(xmedia_s32 vo_dev, xmedia_bool vou_hd_cken);
xmedia_void sys_hal_vo_vou_srst_req(xmedia_bool vou_srst_req);
xmedia_s32 sys_hal_vo_vou_srst_get(xmedia_bool* vou_srst_req);
xmedia_void sys_hal_vo_lcd_div_cken(xmedia_bool lcd_div_cken);
xmedia_void sys_hal_vo_pll_div_cken(xmedia_bool pll_div_cken);
xmedia_void sys_hal_vo_bt_hd_cksel(xmedia_bool bt_hd_cksel);
xmedia_void sys_hal_vo_lcd_hd_cksel(xmedia_bool lcd_hd_cksel);
xmedia_void sys_hal_vo_mipitx_hd_cksel(xmedia_bool mipitx_hd_cksel);
xmedia_void sys_hal_vo_lvdstx_hd_cksel(xmedia_bool lvdstx_hd_cksel);
xmedia_void sys_hal_vo_bt_pctrl(xmedia_bool bt_pctrl);
xmedia_void sys_hal_vo_lcd_pctrl(xmedia_bool lcd_pctrl);
xmedia_void sys_hal_vo_mipitx_pctrl(xmedia_bool mipitx_pctrl);
xmedia_void sys_hal_vo_lvdstx_pctrl(xmedia_bool lvdstx_pctrl);
xmedia_void sys_hal_vo_bt_cken(xmedia_bool bt_cken);
xmedia_void sys_hal_vo_lcd_cken(xmedia_bool lcd_cken);
xmedia_void sys_hal_vo_mipitx_cken(xmedia_bool mipitx_cken);
xmedia_void sys_hal_vo_lvdstx_cken(xmedia_bool lvdstx_cken);
#ifdef __cplusplus
}
#endif /* End of #ifdef __cplusplus */
#endif /* End of #ifndef SYS_HAL_H */