MAX_CARLINK_A270S/MXC_A27-PCB4.5-270T/ArkmicroFiles/libboard-amt630hv100/source/board_lowlevel.c

191 lines
6.1 KiB
C
Raw Permalink Normal View History

2025-01-21 16:49:37 +08:00
#include "FreeRTOS.h"
#include "board.h"
#include "sysinfo.h"
#include "chip.h"
static const char* abort_status[][2]=
{
// IFSR status , DFSR status
{"Unknown(reserved status)", "Unknown(reserved status)" },//0
{"Unknown(reserved status)", "Alignment Fault" },//1
{"Debug Event", "Debug Event" },//2
{"Access flag - section", "Access flag - section" },//3
{"Unknown(reserved status)", "Instruction cache maintenance" },//4
{"Translation fault - section", "Translation fault - section" },//5
{"Access flag - Page", "Access flag - Page" },//6
{"Translation fault -Page", "Translation fault -Page" },//7
{"Synchronous external abort", "Synchronous external abort, nontranslation" },//8
{"Domain fault - Section", "Domain fault - Section" },//9
{"Unknown(reserved status)", "Unknown(reserved status)" },//10
{"Domain fault - Page", "Domain fault - Page" },//11
{"Synchronous external abort - L1 Translation", "Synchronous external abort - L1 Translation" },//12
{"Permission fault - Section", "Permission fault - Section" },//13
{"Synchronous external abort - L2 Translation", "Synchronous external abort - L2 Translation" },//14
{"Permission fault - Page", "Permission fault - Page" },//15
{"Unknown(reserved status)", "Unknown(reserved status)" },//16
{"Unknown(reserved status)", "Unknown(reserved status)" },//17
{"Unknown(reserved status)", "Unknown(reserved status)" },//18
{"Unknown(reserved status)", "Unknown(reserved status)" },//19
{"Unknown(reserved status)", "Unknown(reserved status)" },//20
{"Unknown(reserved status)", "Unknown(reserved status)" },//21
{"Unknown(reserved status)", "Asynchronous external abort"}
};
void LowLevelInit( void )
{
}
void Abort_C_Handler( void)
{
uint32_t v1,v2, dfsr;
v1= 0;
v2= 0;
asm("mrc p15, 0, %0, c5, c0, 0" : : "r"(v1));
asm("mrc p15, 0, %0, c6, c0, 0" : : "r"(v2));
dfsr = ((v1 >> 4) & 0x0F);
printf("\n\r######################################################################\n\r");
printf("Data Abort occured in %x domain\n\r", (unsigned int)dfsr);
dfsr = (((v1 & 0x400) >> 6) | (v1 & 0x0F));
printf("Data abort fault reason is: %s\n\r", (char*)abort_status[dfsr][1]);
printf("Data fault occured at Address = 0x%08x\n\n\r",(unsigned int)v2);
printf("-[Info]-Data fault status register value = 0x%x\n\r",(unsigned int)v1);
while(1);
}
void Prefetch_C_Handler( void)
{
uint32_t v1,v2, ifsr;
v1= 0;
v2= 0;
asm("mrc p15, 0, %0, c5, c0, 1" : : "r"(v1));
asm("mrc p15, 0, %0, c6, c0, 2" : : "r"(v2));
ifsr = (((v1 & 0x400) >> 6) | (v1 & 0x0F));
printf("\n\r######################################################################\n\r");
printf("Instruction prefetch abort reason is: %s\n\r", (char*)abort_status[ifsr][0]);
printf("Instruction prefetch Fault occured at Address = 0x%08x\n\n\r",(unsigned int)v2);
printf("-[INFO]- Prefetch Fault status register value by = 0x%x\n\r",(unsigned int)v1);
while(1);
}
void Undefined_C_Handler( void)
{
printf("Undefined abort \n\r");
while(1);
}
typedef enum {
VBUF_STATUS_FREE = 0,
VBUF_STATUS_USED,
VBUF_STATUS_RENDERED,
} VIDEO_BUFFER_STATUS;
typedef struct {
uint32_t addr;
int status;
}VideoBufInfo;
static SemaphoreHandle_t vdisbuf_mutex = NULL;
static VideoBufInfo vdisbufs[VIDEO_DISPLAY_BUF_NUM] = {0};
void VideoDisplayBufInit(void)
{
int i;
vdisbuf_mutex = xSemaphoreCreateRecursiveMutex();
for (i = 0; i < VIDEO_DISPLAY_BUF_NUM; i++) {
vdisbufs[i].addr = (uint32_t)pvPortMalloc(VIDEO_DISPLAY_WIDTH * VIDEO_DISPLAY_HEIGHT * 2);
vdisbufs[i].status = VBUF_STATUS_FREE;
}
}
int xVideoDisplayBufTake(uint32_t xTicksToWait)
{
return xSemaphoreTakeRecursive(vdisbuf_mutex, xTicksToWait);
}
void vVideoDisplayBufGive(void)
{
xSemaphoreGiveRecursive(vdisbuf_mutex);
}
uint32_t ulVideoDisplayBufGet(void)
{
uint32_t bufaddr = 0;
int i;
xSemaphoreTakeRecursive(vdisbuf_mutex, portMAX_DELAY);
for (i = 0; i < VIDEO_DISPLAY_BUF_NUM; i++) {
if (vdisbufs[i].status == VBUF_STATUS_FREE) {
bufaddr = vdisbufs[i].addr;
vdisbufs[i].status = VBUF_STATUS_USED;
break;
}
}
xSemaphoreGiveRecursive(vdisbuf_mutex);
configASSERT(bufaddr != 0);
return bufaddr;
}
uint32_t ulVideoDisplayBufGetSize(void)
{
return VIDEO_DISPLAY_WIDTH * VIDEO_DISPLAY_HEIGHT * 2;
}
void vVideoDisplayBufRender(uint32_t buf_addr)
{
int i, j;
xSemaphoreTakeRecursive(vdisbuf_mutex, portMAX_DELAY);
for (i = 0; i < VIDEO_DISPLAY_BUF_NUM; i++) {
if (vdisbufs[i].addr == buf_addr) {
for (j = 0; j < VIDEO_DISPLAY_BUF_NUM; j++) {
if (vdisbufs[j].status == VBUF_STATUS_RENDERED)
vdisbufs[j].status = VBUF_STATUS_FREE;
}
vdisbufs[i].status = VBUF_STATUS_RENDERED;
break;
}
}
xSemaphoreGiveRecursive(vdisbuf_mutex);
}
void vVideoDisplayBufFree(uint32_t buf_addr)
{
int i;
xSemaphoreTakeRecursive(vdisbuf_mutex, portMAX_DELAY);
for (i = 0; i < VIDEO_DISPLAY_BUF_NUM; i++) {
if (vdisbufs[i].addr == buf_addr) {
vdisbufs[i].status = VBUF_STATUS_FREE;
break;
}
}
xSemaphoreGiveRecursive(vdisbuf_mutex);
}
unsigned int ulVideoDisplayGetBufferAddr(int index)
{
configASSERT(index < VIDEO_DISPLAY_BUF_NUM);
return vdisbufs[index].addr;
}