You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
2.7 KiB
97 lines
2.7 KiB
#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);
|
|
|
|
#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)<<REG_ACCESS_WIDTH)))
|
|
|
|
#define IORD_32DIRECT(BASE, OFFSET) IO_READ32(__IO_CALC_ADDRESS_DYNAMIC ((BASE), (OFFSET)))
|
|
#define IORD_16DIRECT(BASE, OFFSET) IO_READ16(__IO_CALC_ADDRESS_DYNAMIC ((BASE), (OFFSET)))
|
|
#define IORD_8DIRECT(BASE, OFFSET) IO_READ8(__IO_CALC_ADDRESS_DYNAMIC ((BASE), (OFFSET)))
|
|
|
|
#define IOWR_32DIRECT(BASE, OFFSET, DATA) IO_WRITE32(__IO_CALC_ADDRESS_DYNAMIC ((BASE), (OFFSET)), (DATA))
|
|
#define IOWR_16DIRECT(BASE, OFFSET, DATA) IO_WRITE16(__IO_CALC_ADDRESS_DYNAMIC ((BASE), (OFFSET)), (DATA))
|
|
#define IOWR_8DIRECT(BASE, OFFSET, DATA) IO_WRITE8(__IO_CALC_ADDRESS_DYNAMIC ((BASE), (OFFSET)), (DATA))
|
|
|
|
|
|
inline static void HI_RegSetBit(unsigned long value, unsigned long offset,
|
|
unsigned long addr)
|
|
{
|
|
unsigned long t, mask;
|
|
|
|
mask = 1 << offset;
|
|
t = readl((const volatile void *)addr);
|
|
t &= ~mask;
|
|
t |= (value << offset) & mask;
|
|
writel(t, (volatile void *)addr);
|
|
}
|
|
|
|
inline static void HI_RegWrite32(unsigned long value, unsigned long mask,
|
|
unsigned long addr)
|
|
{
|
|
unsigned long t;
|
|
|
|
t = readl((const volatile void *)addr);
|
|
t &= ~mask;
|
|
t |= value & mask;
|
|
writel(t, (volatile void *)addr);
|
|
}
|
|
|
|
inline static void HI_RegRead(unsigned long *pvalue, unsigned long addr)
|
|
{
|
|
*pvalue = readl((const volatile void *)addr);
|
|
}
|
|
|
|
inline static void HI_RegSetBitEx(unsigned long value, unsigned long offset,
|
|
unsigned long bitwidth, unsigned long addr)
|
|
{
|
|
unsigned long t, mask=0;
|
|
int i = 0;
|
|
|
|
while (i < bitwidth)
|
|
{
|
|
mask |= (1<<i);
|
|
i++;
|
|
};
|
|
mask = (mask << offset);
|
|
t = readl((const volatile void *)addr);
|
|
t &= ~mask;
|
|
t |= (value << offset) & mask;
|
|
writel(t, (volatile void *)addr);
|
|
}
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* __HI_IO_H__ */
|
|
|