CedarX/Kernel Driver guide
Driver IOCTL guide
Blob mostly use MMIO Access but CedarX should be gate-on and support PLLs should be confugired before
CORE IOCTL
IOCTL_GET_ENV_INFO = 0x101
copy memory configuration info to userspace struct:
typedef struct ve_info{ unsigned int reserved; int reserved_size; unsigned int io_base; } cedar_env_info_t;
c_info.io_base - constain ioremapped cedarx hw registers offset. Must be used for cedarX hw registers access using mmio
c_info.reserved - constain cedarx reserved memory offset. Must be used for hw register access using mmio
c_info.reserved_size - constain cedarx reserved memory size
Example:
ve_info c_info; ioctl(cedar, IOCTL_GET_ENV_INFO, (unsigned long)&c_info);
IOCTL_WAIT_VE = 0x102
used for cedar IRQ wait, when some operation ends, for example, end jpeg decoding process end. don't forget clean IRQ flag after.
IOCTL_RESET_VE = 0x103
do reset cedarx engine
IOCTL_ENABLE_VE = 0x104
start base clocks for cedarx
IOCTL_DISABLE_VE = 0x105
disable base clocks for cedarx
IOCTL_SET_VE_FREQ = 0x106
config cedarx frequency, get in argument freqency in Mhz
for A13 freq are 180 Mhz
Example
ioctl(cedar, IOCTL_SET_VE_FREQ, freq);
AVS2 IOCTL
IOCTL_CONFIG_AVS2 = 0x200
IOCTL_GETVALUE_AVS2 = 0x201
IOCTL_PAUSE_AVS2 = 0x202
IOCTL_START_AVS2 = 0x203
IOCTL_RESET_AVS2 = 0x204
IOCTL_ADJUST_AVS2 = 0x205
ENGINE IOCTL
IOCTL_ENGINE_REQ = 0x206
count references to cedar hardware and more important start some clocks that required for cedar init
IOCTL_ENGINE_REL = 0x207
decrement reference count
IOCTL_ENGINE_CHECK_DELAY = 0x208
IOCTL_GET_IC_VER = 0x209
IOCTL_ADJUST_AVS2_ABS = 0x20a
IOCTL_FLUSH_CACHE = 0x20b do invalidate CPU cache for internal cedar dma
Kernel driver init procedure
This required for make CedarX hardware regs in workable state
ioctl(cedar, IOCTL_ENABLE_VE,0); /*en*/ ioctl(cedar, IOCTL_ENGINE_REQ,0);/*eng req*/ ioctl(cedar, IOCTL_SET_VE_FREQ,180); /*set freq in Mhz*/ ioctl(cedar, IOCTL_RESET_VE,0); /*ve reset*/
after this step user-space lib must mmap /dev/cedar_dev and get direct access to hardware registers
MMAP procedure
You must request ioremaped cedar base address using IOCTL_GET_ENV_INFO that will fill flowing struct
typedef struct cedarv_env_info{ unsigned int phymem_start; int phymem_total_size; unsigned int address_macc; } cedar_env_info_t;
cedarx_env_info c_info;
ioctl(cedar, IOCTL_GET_ENV_INFO, (unsigned long)&c_info);
Than you must do mmap like that:
io_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, cedar, c_info.address_macc);
Same for reserved memory buffer:
data_base = mmap(NULL, c_info.phymem_total_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, c_info.phymem_start);
and after than cedarx version show be checked by reading "VE Revision register" [CEDAR_BASE+0xf2] that constain chip version
0x1623 for a10, 0x1625 for a13