#ifndef __HI_IO_H__ #define __HI_IO_H__ #include "hi_type.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /* user and kernel are different. */ HI_U8 IO_READ8(HI_U32 u32Addr); HI_S32 IO_WRITE8(HI_U32 u32Addr, HI_U32 u32Value); HI_U16 IO_READ16(HI_U32 u32Addr); HI_S32 IO_WRITE16(HI_U32 u32Addr, HI_U32 u32Value); HI_U32 IO_READ32(HI_U32 u32Addr); HI_S32 IO_WRITE32(HI_U32 u32Addr, HI_U32 u32Value); HI_U32 ISP_Mmap(void); HI_U32 ISP_Munmap(void); HI_U32 ISP_GetExtRegAddr(void); //HI_VOID HI_RegSetBitEx(unsigned long value, unsigned long offset, // unsigned long length, unsigned long addr); //HI_VOID HI_RegRead(unsigned long *pvalue, unsigned long addr); static __inline HI_VOID HI_RegWrite32(unsigned long value, unsigned long mask, HI_U32 addr) { unsigned long t; t = readl(addr); t &= ~mask; t |= value & mask; writel(t, addr); } static __inline HI_VOID HI_RegSetBitEx(unsigned long value, unsigned long offset, unsigned long length, unsigned long addr) { unsigned long mask; mask = ((1 << length) - 1) << offset; value = value << offset; HI_RegWrite32(value, mask, addr); } static __inline HI_VOID HI_RegRead(unsigned long *pvalue, unsigned long addr) { *pvalue = readl(addr); } #define REG_ACCESS_WIDTH 0 // 1: 16bit 2: 8bit #define EXT_REG_BASE 0x10200 #define ISP_REG_BASE_ADDR 0x205a0000 #define EXT_REG_BASE_ISP 0x8000 #define EXT_REG_BASE_VIU 0x8400 #define EXT_REG_BASE_VPP 0x8600 #define EXT_REG_BASE_VEDU 0x8800 #define EXT_REG_BASE_VOU 0x8A00 /* Dynamic bus access functions, 4 byte align access */ //TODO: allocate dev addr (such as ISP_REG_BASE_ADDR) according to devId. #define __IO_CALC_ADDRESS_DYNAMIC(BASE, OFFSET) ((HI_U32)(((BASE >= EXT_REG_BASE)? 0 : ISP_REG_BASE_ADDR) + ((((BASE >= EXT_REG_BASE)? (BASE - EXT_REG_BASE) : BASE) + OFFSET)<