Files
Linux_Drivers/u-boot-2021.10/drivers/jpeg/jdi_osal.c
wangliang.wang 607778300c [uboot] Upgrade the MMF SDK from V4.0.0 to V4.1.0
1. add cv181x functions
	2. Delete some useless files and add .gitignore

Change-Id: Iea2b2fa43b5a1152e5e99fb32b88f8d2c249251a
2023-03-10 20:42:30 +08:00

718 lines
14 KiB
C

//------------------------------------------------------------------------------
// File: vdi_osal.c
//
// Copyright (c) 2006, Chips & Media. All rights reserved.
//------------------------------------------------------------------------------
//#if defined(_WIN32) || defined(__WIN32__) || defined(_WIN64) || defined(WIN32) || defined(__MINGW32__)
//#elif defined(linux) || defined(__linux) || defined(ANDROID)
//#else
#include <linux/string.h>
#include <stdarg.h>
#include <malloc.h>
#include "jdi.h"
#include "jdi_osal.h"
#include "asm/cache.h"
#include "jpulog.h"
#if defined(JPEG_FVP)
#define FILE_BUFFER_BASE 0xE0000000
#elif defined(JPEG_FPGA)
#define FILE_BUFFER_BASE 0x116000000
#endif
#define FILE_BUFFER_BASE 0x138000000
#define MAX_LIST_NUM 1
#define DEC_BS_FILE_BUFFER_BASE FILE_BUFFER_BASE
#define DEC_BS_FILE_BUFFER_SIZE (0x400000 * MAX_LIST_NUM)
#define DEC_YUV_FILE_BUFFER_BASE (DEC_BS_FILE_BUFFER_BASE + DEC_BS_FILE_BUFFER_SIZE)
#define DEC_YUV_FILE_BUFFER_SIZE (0x800000 * MAX_LIST_NUM)
#define ENC_YUV_FILE_BUFFER_BASE (DEC_YUV_FILE_BUFFER_BASE + DEC_YUV_FILE_BUFFER_SIZE)
#define ENC_YUV_FILE_BUFFER_SIZE (0x800000 * MAX_LIST_NUM)
#define ENC_BS_FILE_BUFFER_BASE (ENC_YUV_FILE_BUFFER_BASE + ENC_YUV_FILE_BUFFER_SIZE)
#define ENC_BS_FILE_BUFFER_SIZE (0x400000 * MAX_LIST_NUM)
#define ENC_HUFF_FILE_BUFFER_BASE (ENC_BS_FILE_BUFFER_BASE + ENC_BS_FILE_BUFFER_SIZE)
#define ENC_HUFF_FILE_BUFFER_SIZE (0x100000 * MAX_LIST_NUM)
#define ENC_QMAT_FILE_BUFFER_BASE (ENC_HUFF_FILE_BUFFER_BASE + ENC_HUFF_FILE_BUFFER_BASE)
#define ENC_QMAT_FILE_BUFFER_SIZE (0x100000 * MAX_LIST_NUM)
#define ENC_QP_FILE_BUFFER_BASE (ENC_QMAT_FILE_BUFFER_BASE + ENC_QMAT_FILE_BUFFER_SIZE)
#define ENC_QP_FILE_BUFFER_SIZE (0x100000 * MAX_LIST_NUM)
#define ENC_CFG_FILE_BUFFER_BASE (ENC_QP_FILE_BUFFER_BASE + ENC_QP_FILE_BUFFER_SIZE)
#define ENC_CFG_FILE_BUFFER_SIZE (0x10000 * MAX_LIST_NUM)
#define MULTI_FILE_BUFFER_BASE (ENC_CFG_FILE_BUFFER_BASE + ENC_CFG_FILE_BUFFER_SIZE)
#define MULTI_FILE_BUFFER_SIZE (0x10000)
#define MULTI_YUV_FILE_BUFFER_BASE (MULTI_FILE_BUFFER_BASE + MULTI_FILE_BUFFER_SIZE)
#define MULTI_YUV_FILE_BUFFER_SIZE (0x400000)
#if defined(JPEG_FVP)
#define LOG_MSG_BUF_BASE 0xD0000000
#elif defined(JPEG_FPGA)
#define LOG_MSG_BUF_BASE 0x120500000
#endif
#define LOG_MSG_BUF_BASE 0x120500000 // fixme fix me
#define LOG_MSG_BUF_SIZE 0x100000
static char *LOG_MSG_BUF = (char *)LOG_MSG_BUF_BASE;
#define MAX_MALLOC_BLOCK_SIZE 0x50000//0x200000
#define MAX_MALLOC_BLOCK_NUM 7
int jpu_level = BM_MASK_ERR;
//To
#define FILE_BUFFER_SIZE 0x1000000 * (MAX_FD_NUM - 1)
#define CMP_FILE_BUFFER_SIZE 0x1000000
unsigned char osal_malloc_heap[MAX_MALLOC_BLOCK_NUM][MAX_MALLOC_BLOCK_SIZE]; // allocate 64 4M-block for malloc
unsigned char osal_malloc_used[MAX_MALLOC_BLOCK_NUM] = {0};
typedef struct fileio_buf_t {
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
} fileio_buf_t;
#define MAX_FD_NUM 5 // 0-bitstream file 1-yuv cmp file 2-
static fileio_buf_t s_file[MAX_FD_NUM] = {0};
static void myprintf(char *MsgBuf)
{
int size = strlen(MsgBuf);
if (size == 0)
return;
if (LOG_MSG_BUF + size >= (char *)(LOG_MSG_BUF_BASE + LOG_MSG_BUF_SIZE))
return;
josal_memcpy(LOG_MSG_BUF, MsgBuf, size);
LOG_MSG_BUF += size;
}
void *josal_memcpy(void *dst, const void *src, int count)
{
void *ret;
ret = memcpy(dst, src, count);
flush_dcache_range((unsigned long)dst, count);
return ret;
}
void *josal_memset(void *dst, int val, int count)
{
return memset(dst, val, count);
}
int josal_memcmp(const void *src, const void *dst, int size)
{
return memcmp(src, dst, size);
}
void *josal_malloc(int size)
{
int i;
if (size > MAX_MALLOC_BLOCK_SIZE || size == 0)
return NULL;
for (i = 0; i < MAX_MALLOC_BLOCK_NUM; i++)
if (osal_malloc_used[i] == 0)
break;
if (i < MAX_MALLOC_BLOCK_NUM) {
osal_malloc_used[i] = 1;
// JLOG(INFO, "malloc: %d, addr: 0x%p, size: %d\n", i, osal_malloc_heap[i], size);
return (void *)osal_malloc_heap[i];
}
return NULL;
}
void *josal_realloc(void *ptr, int size)
{
if (!ptr)
return josal_malloc(size);
if (size == 0 || size > MAX_MALLOC_BLOCK_SIZE) {
josal_free(ptr);
return NULL;
}
if (size <= MAX_MALLOC_BLOCK_SIZE)
return ptr;
return NULL;
}
void josal_free(void *p)
{
//free(p);
int i;
for (i = 0; i < MAX_MALLOC_BLOCK_NUM; i++)
if ((void *)osal_malloc_heap[i] == p)
break;
osal_malloc_used[i] = 0;
}
int josal_fflush(osal_file_t fp)
{
return 1;
}
int josal_feof(osal_file_t fp)
{
fileio_buf_t *p_fp = (fileio_buf_t *)fp;
if ((uint64_t)p_fp->_ptr >= p_fp->_bufsiz)
return 1;
else
return 0;
}
osal_file_t josal_fopen(const char *osal_file_tname, const char *mode)
{
int i;
for (i = 0; i < MAX_FD_NUM; i++)
if (s_file[i]._bufsiz == 0) // not used
break;
if (i == MAX_FD_NUM)
return NULL;
if (i != 1) // 1 - cmp file
s_file[i]._bufsiz = FILE_BUFFER_SIZE / (MAX_FD_NUM - 1);
else
s_file[i]._bufsiz = CMP_FILE_BUFFER_SIZE; // 256M for YUV compare file
if (i == 0)
s_file[i]._base = (char *)FILE_BUFFER_BASE;
else
s_file[i]._base = s_file[i - 1]._base + s_file[i - 1]._bufsiz;
s_file[i]._ptr = (char *)0;
for (i = 0; i < MAX_FD_NUM; i++) {
JLOG(INFO, "file = %d, base = 0x%lX, size = 0x%lX\n", i,
(unsigned long)s_file[i]._base,
(unsigned long)s_file[i]._bufsiz);
}
return &s_file[i];
}
size_t josal_fwrite(const void *p, int size, int count, osal_file_t fp)
{
long addr;
long real_size;
fileio_buf_t *p_fp = (fileio_buf_t *)fp;
if (!p_fp)
return 0;
if ((unsigned long)(size * count + p_fp->_ptr) > p_fp->_bufsiz)
real_size = p_fp->_bufsiz - (unsigned long)p_fp->_ptr;
else
real_size = size * count;
addr = (long)((long)p_fp->_base + (long)p_fp->_ptr);
josal_memcpy((void *)addr, (void *)p, real_size);
p_fp->_ptr += real_size;
JLOG(INFO, "fp: 0x%lx, size: %ld\n", addr, real_size);
return real_size;
}
size_t josal_fread(void *p, int size, int count, osal_file_t fp)
{
long addr;
long real_size;
fileio_buf_t *p_fp = (fileio_buf_t *)fp;
if (!p_fp)
return 0;
if ((unsigned long)(size * count + p_fp->_ptr) > p_fp->_bufsiz)
real_size = p_fp->_bufsiz - (unsigned long)p_fp->_ptr;
else
real_size = size * count;
addr = (long)((long)p_fp->_base + (long)p_fp->_ptr);
josal_memcpy((void *)p, (void *)addr, real_size);
p_fp->_ptr += real_size;
//printf("p_fp: _ptr = 0x%016llx _base = 0x%016llx _bufsiz = 0x%08x\n",
// (uint64_t)p_fp->_ptr, (uint64_t)p_fp->_base, p_fp->_bufsiz);
return real_size;
}
char *josal_fgets(void *p, int size, osal_file_t fp)
{
int s = josal_fread(p, 1, size, fp);
if (s == size)
return p;
else
return NULL;
}
char josal_fgetc(osal_file_t fp)
{
char *ptr;
fileio_buf_t *p_fp = (fileio_buf_t *)fp;
if (!p_fp)
return -1;
if ((unsigned long)p_fp->_ptr + sizeof(char) == p_fp->_bufsiz)
return -1;
ptr = p_fp->_base + (unsigned long)p_fp->_ptr;
p_fp->_ptr++;
return *ptr;
}
size_t josal_fputs(const char *s, osal_file_t fp)
{
return josal_fwrite(s, sizeof(char), strlen(s), fp);
}
long josal_ftell(osal_file_t fp)
{
fileio_buf_t *p_fp = (fileio_buf_t *)fp;
return p_fp->_bufsiz;
}
int josal_fseek(osal_file_t fp, long offset, int origin)
{
char *curr_p;
fileio_buf_t *p_fp = (fileio_buf_t *)fp;
if (!fp)
return -1;
switch (origin) {
case SEEK_CUR:
curr_p = (char *)p_fp->_ptr;
break;
case SEEK_END:
curr_p = (char *)(uint64_t)p_fp->_bufsiz;
break;
case SEEK_SET:
curr_p = (char *)0;
break;
default:
return -1;
}
p_fp->_ptr = curr_p + offset;
if (p_fp->_ptr > p_fp->_base + p_fp->_bufsiz)
p_fp->_ptr = p_fp->_base + p_fp->_bufsiz;
return 0;
}
int josal_fclose(osal_file_t fp)
{
fileio_buf_t *p_fp = (fileio_buf_t *)fp;
if (!p_fp)
return -1;
p_fp->_base = (char *)0;
p_fp->_bufsiz = 0;
p_fp->_ptr = (char *)0;
return 1;
}
int josal_fscanf(osal_file_t fp, const char *_Format, ...)
{
return 1;
}
int josal_fprintf(osal_file_t fp, const char *_Format, ...)
{
va_list ptr;
char logBuf[MAX_PRINT_LENGTH] = {0};
va_start(ptr, _Format);
vsnprintf(logBuf, MAX_PRINT_LENGTH, _Format, ptr);
va_end(ptr);
myprintf(logBuf);
return 1;
}
int josal_kbhit(void)
{
return 0;
}
int josal_getch(void)
{
return -1;
}
int josal_flush_ch(void)
{
return -1;
}
int josal_srand(int seed)
{
return 0;
}
/* to return a integer between 0~FEEDING_MAX_SIZE(4M) */
int josal_rand(void)
{
return 0x10000;
}
/* to conver c to upper case */
int josal_toupper(int c)
{
int ret = c;
char *ptr = (char *)&ret;
int i;
for (i = 0; i < sizeof(int); i++) {
if (ptr[i] > 96 && ptr[i] < 123)
ptr[i++] -= 32;
}
return ret;
}
void jinv_dcache_range(unsigned long start, unsigned long size)
{
invalidate_dcache_range(start, size);
}
#ifdef LIB_C_STUB
/*
* newlib_stubs.c
* the bellow code is just to build ref-code.
* customers will removed the bellow code bacuase they need a library which is related to the
* system library such as newlibc
*/
#include <errno.h>
#include <sys/stat.h>
#include <sys/times.h>
#include <sys/unistd.h>
#ifndef STDOUT_USART
#define STDOUT_USART 0
#endif
#ifndef STDERR_USART
#define STDERR_USART 0
#endif
#ifndef STDIN_USART
#define STDIN_USART 0
#endif
#undef errno
int errno;
extern int errno;
/*
* environ
* A pointer to a list of environment variables and their values.
* For a minimal environment, this empty list is adequate:
*/
char *__env[1] = { 0 };
char **environ = __env;
//int _write(int file, char *ptr, int len);
void _exit(int status)
{
_write(1, "exit", 4);
while (1) {
;
}
}
int _close(int file)
{
return -1;
}
/*
* execve
* Transfer control to a new process. Minimal implementation (for a system without processes):
*/
int _execve(char *name, char **argv, char **env)
{
errno = ENOMEM;
return -1;
}
/*
* fork
* Create a new process. Minimal implementation (for a system without processes):
*/
int _fork(void)
{
errno = EAGAIN;
return -1;
}
/*
* fstat
* Status of an open file. For consistency with other minimal implementations in these examples,
* all files are regarded as character special devices.
* The `sys/stat.h' header file required is distributed in the `include' subdirectory for this C library.
*/
int _fstat(int file, struct stat *st)
{
st->st_mode = S_IFCHR;
return 0;
}
/*
* getpid
* Process-ID; this is sometimes used to generate strings unlikely to conflict with other processes.
* Minimal implementation,
* for a system without processes:
*/
int _getpid(void)
{
return 1;
}
/*
* isatty
* Query whether output stream is a terminal. For consistency with the other minimal implementations,
*/
int _isatty(int file)
{
switch (file) {
case STDOUT_FILENO:
case STDERR_FILENO:
case STDIN_FILENO:
return 1;
default:
//errno = ENOTTY;
errno = EBADF;
return 0;
}
}
/*
* kill
* Send a signal. Minimal implementation:
*/
int _kill(int pid, int sig)
{
errno = EINVAL;
return (-1);
}
/*
* link
* Establish a new name for an existing file. Minimal implementation:
*/
int _link(char *old, char *new)
{
errno = EMLINK;
return -1;
}
/*
* lseek
* Set position in a file. Minimal implementation:
*/
int _lseek(int file, int ptr, int dir)
{
return 0;
}
/*
* sbrk
* Increase program data space.
* Malloc and related functions depend on this
*/
caddr_t _sbrk(int incr)
{
// extern char _ebss; // Defined by the linker
char _ebss;
static char *heap_end;
char *prev_heap_end;
if (heap_end == 0) {
heap_end = &_ebss;
}
prev_heap_end = heap_end;
heap_end += incr;
return (caddr_t)prev_heap_end;
}
/*
* read
* Read a character to a file. `libc' subroutines will use this system routine for input from all files,
* including stdin
* Returns -1 on error or blocks until the number of characters have been read.
*/
int _read(int file, char *ptr, int len)
{
int n;
int num = 0;
switch (file) {
case STDIN_FILENO:
for (n = 0; n < len; n++) {
char c = 0;
#if STDIN_USART == 1
while ((USART1->SR & USART_FLAG_RXNE) == (u16)RESET) {
}
c = (char)(USART1->DR & (u16)0x01FF);
#elif STDIN_USART == 2
while ((USART2->SR & USART_FLAG_RXNE) == (u16)RESET) {
}
c = (char)(USART2->DR & (u16)0x01FF);
#elif STDIN_USART == 3
while ((USART3->SR & USART_FLAG_RXNE) == (u16)RESET) {
}
c = (char)(USART3->DR & (u16)0x01FF);
#endif
*ptr++ = c;
num++;
}
break;
default:
errno = EBADF;
return -1;
}
return num;
}
/*
* stat
* Status of a file (by name). Minimal implementation:
* int _EXFUN(stat,( const char *__path, struct stat *__sbuf ));
*/
int stat(const char *filepath, struct stat *st)
{
return _stat(filepath, st);
}
int _stat(const char *filepath, struct stat *st)
{
st->st_mode = S_IFCHR;
st->st_size = CMP_FILE_BUFFER_SIZE;
return 0;
}
/*
* times
* Timing information for current process. Minimal implementation:
*/
clock_t _times(struct tms *buf)
{
return -1;
}
/*
* unlink
* Remove a file's directory entry. Minimal implementation:
*/
int _unlink(char *name)
{
errno = ENOENT;
return -1;
}
/*
* wait
* Wait for a child process. Minimal implementation:
*/
int _wait(int *status)
{
errno = ECHILD;
return -1;
}
/*
* write
* Write a character to a file. `libc' subroutines will use this system routine for output to all files,
* including stdout
* Returns -1 on error or number of bytes sent
*/
int _write(int file, char *ptr, int len)
{
int n;
switch (file) {
case STDOUT_FILENO: /*stdout*/
for (n = 0; n < len; n++) {
#if STDOUT_USART == 1
while ((USART1->SR & USART_FLAG_TC) == (u16)RESET) {
}
USART1->DR = (*ptr++ & (u16)0x01FF);
#elif STDOUT_USART == 2
while ((USART2->SR & USART_FLAG_TC) == (u16)RESET) {
}
USART2->DR = (*ptr++ & (u16)0x01FF);
#elif STDOUT_USART == 3
while ((USART3->SR & USART_FLAG_TC) == (u16)RESET) {
}
USART3->DR = (*ptr++ & (u16)0x01FF);
#endif
}
break;
case STDERR_FILENO: /* stderr */
for (n = 0; n < len; n++) {
#if STDERR_USART == 1
while ((USART1->SR & USART_FLAG_TC) == (u16)RESET) {
}
USART1->DR = (*ptr++ & (u16)0x01FF);
#elif STDERR_USART == 2
while ((USART2->SR & USART_FLAG_TC) == (u16)RESET) {
}
USART2->DR = (*ptr++ & (u16)0x01FF);
#elif STDERR_USART == 3
while ((USART3->SR & USART_FLAG_TC) == (u16)RESET) {
}
USART3->DR = (*ptr++ & (u16)0x01FF);
#endif
}
break;
default:
errno = EBADF;
return -1;
}
return len;
}
#endif
//#endif