Files
checker_m4/source/rt_thread/board.c
2023-06-25 15:30:36 +08:00

266 lines
4.4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "stm32mp1xx.h"
#include <rthw.h>
#include <rtthread.h>
#include "board.h"
#include "string.h"
#include "debug.h"
#include "core_delay.h"
#include "stdio.h"
#include "mystdlib.h"
#include "signal.h"
//#include "dev_backup.h"
#include "stdlib.h"
#define _SCB_BASE (0xE000E010UL)
#define _SYSTICK_CTRL (*(rt_uint32_t *)(_SCB_BASE + 0x0))
#define _SYSTICK_LOAD (*(rt_uint32_t *)(_SCB_BASE + 0x4))
#define _SYSTICK_VAL (*(rt_uint32_t *)(_SCB_BASE + 0x8))
#define _SYSTICK_CALIB (*(rt_uint32_t *)(_SCB_BASE + 0xC))
#define _SYSTICK_PRI (*(rt_uint8_t *)(0xE000ED23UL))
static uint32_t _SysTick_Config(rt_uint32_t ticks)
{
if ((ticks - 1) > 0xFFFFFF)
{
return 1;
}
_SYSTICK_LOAD = ticks - 1;
_SYSTICK_PRI = 0xFF;
_SYSTICK_VAL = 0;
_SYSTICK_CTRL = 0x07;
return 0;
}
#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
static uint32_t g_heap[32*1024/4];
RT_WEAK void *rt_heap_begin_get(void)
{
return (void *)g_heap;
}
RT_WEAK void *rt_heap_end_get(void)
{
return (void *)(g_heap+(32*1024/4));
}
#endif
#ifdef RT_THREAD
void rt_hw_board_init()
{
//NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x20000);
// 1msÒ»¸ötick
_SysTick_Config (HAL_RCC_GetMCUFreq()/1000);
rt_system_heap_init(rt_heap_begin_get(),rt_heap_end_get());
//mem_init();
//tempptr_init();
delay_init();
signal_init();
}
void SysTick_Handler(void)
{
rt_interrupt_enter();
rt_tick_increase();
rt_interrupt_leave();
}
uint32_t HAL_GetTick(void)
{
return rt_tick_get();
}
void HAL_Delay(uint32_t Delay)
{
rt_thread_mdelay(Delay);
}
HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
{
return HAL_OK;
}
#endif
void *dev_get(const char *name)
{
extern const int devstruct$$Base;
extern const int devstruct$$Limit;
struct dev_struct *start=(struct dev_struct *)&devstruct$$Base;
struct dev_struct *end=(struct dev_struct *)&devstruct$$Limit;
for(struct dev_struct *t=start;t<end;t++)
{
if(strcmp(t->name,name)==0)
{
return t->dev;
}
}
param_check(0);
return 0;
}
void param_err_handle(const char *param,const char *file,const char *fun,int line)
{
//bk_reboot_param_err();
// printf("param=%s,file=%s,fun=%s,line=%d.\r\n",param,file,fun,line);
DBG_ERR("param=%s,file=%s,fun=%s,line=%d.\r\n",param,file,fun,line);
while(1);
}
void app_init(void)
{
extern const int initstruct$$Base;
extern const int initstruct$$Limit;
struct init_struct *start=(struct init_struct *)&initstruct$$Base;
struct init_struct *end=(struct init_struct *)&initstruct$$Limit;
int ret=0;
for(struct init_struct *t=start;t<end;t++)
{
if(ret=t->init_fun(),ret<0)
{
DBG_WARN("fun:%08x init failed,ret=%d",t->init_fun,ret);
}
}
}
typedef struct _params_def{
const char *name;
void *p;
void (*fun)(void *t);
void *t;
void (*del)(void *t);
struct _params_def *next;
}params_def;
static params_def *g_parhead=0;
// ÉèÖñäÁ¿£¬·µ»Ø±äÁ¿Ö¸Õë
// Èç¹û±äÁ¿ÒÑÉèÖã¬Ôò·µ»ØÖ®Ç°ÉèÖõıäÁ¿Ö¸Õë
void *app_variable(const char *name,void *p,void (*del)(void *t))
{
params_def *t=g_parhead;
params_def *prev=0;
if(name){
while(t!=0){
if(strcmp(t->name,name)==0){
if(p){
if(t->del) t->del(t->p);
t->p=p;
if(t->fun){
t->fun(t->t);
t->fun=0;
t->t=0;
}
}
return t->p;
}
prev=t;
t=t->next;
}
}
if(p){
t=calloc(1,sizeof(params_def));
t->name=name;
t->p=p;
t->del=del;
t->next=0;
if(g_parhead==0) g_parhead=t;
else prev->next=t;
return t->p;
}
return 0;
}
// ÔÚ±äÁ¿ÓÐЧʱµ÷ÓÃ
void app_valid_call(const char *name,void (*fun)(void *t),void *t)
{
void *par=app_variable(name,0,0);
if(fun==0) return;
if(par){
fun(t);
}else{
// °Ñº¯Êý¹ÒÔÚ±äÁ¿ÉÏ
params_def *t=g_parhead;
params_def *prev=0;
if(name){
while(t!=0){
prev=t;
t=t->next;
}
t=calloc(1,sizeof(params_def));
t->name=name;
t->next=0;
t->fun=fun;
t->t=t;
if(g_parhead==0) g_parhead=t;
else prev->next=t;
}
}
}
void cpy4byte(uint32_t *dst,uint32_t *src,int num_4byte)
{
for(int i=0;i<num_4byte;i++)
{
dst[i]=src[i];
}
}
//#pragma import(__use_no_semihosting)
//struct __FILE
//{
// int handle;
//};
//FILE __stdout;
//void _sys_exit(int x)
//{
// x = x;
//}
//int fputc(int ch, FILE *f)
//{
//// SEGGER_RTT_PutChar(0,ch);
// return ch;
//}