191 lines
6.1 KiB
C
191 lines
6.1 KiB
C
|
#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;
|
||
|
}
|