sdio+fatfs创建

This commit is contained in:
sc committed 2025-10-19 00:26:13 +08:00
commit f762d5d7f8
2473 files changed
+1192014

No files matched your search

+14
View File
@@ -0,0 +1,14 @@
# RT-Thread building script for component
from building import *
Import('rtconfig')
cwd = GetCurrentDir()
src = Glob('*.c') + Glob('*.cpp') + Glob('*.s')
CPPPATH = [cwd]
ASFLAGS = ''
group = DefineGroup('CPU', src, depend = [''], CPPPATH = CPPPATH, ASFLAGS = ASFLAGS)
Return('group')
+329
View File
@@ -0,0 +1,329 @@
;
; Copyright (c) 2006-2022, RT-Thread Development Team
;
; SPDX-License-Identifier: Apache-2.0
;
; Change Logs:
; Date Author Notes
; 2018-09-01 xuzhuoyi the first version.
; 2019-06-17 zhaoxiaowei fix bugs of old c28x interrupt api.
; 2019-07-03 zhaoxiaowei add _rt_hw_calc_csb function to support __rt_ffs.
; 2019-12-05 xiaolifan add support for hardware fpu32
;
.ref _rt_interrupt_to_thread
.ref _rt_interrupt_from_thread
.ref _rt_thread_switch_interrupt_flag
.def _RTOSINT_Handler
.def _rt_hw_get_st0
.def _rt_hw_get_st1
.def _rt_hw_calc_csb
.def _rt_hw_context_switch_interrupt
.def _rt_hw_context_switch
.def _rt_hw_context_switch_to
.def _rt_hw_interrupt_thread_switch
.def _rt_hw_interrupt_disable
.def _rt_hw_interrupt_enable
;workaround for importing fpu settings from the compiler
.cdecls C,NOLIST
%{
#ifdef __TMS320C28XX_FPU32__
#define __FPU32__ 1
#else
#define __FPU32__ 0
#endif
%}
RT_CTX_SAVE .macro
PUSH AR1H:AR0H
PUSH XAR2
PUSH XAR3
PUSH XAR4
PUSH XAR5
PUSH XAR6
PUSH XAR7
PUSH XT
PUSH RPC
.if __FPU32__
PUSH RB
MOV32 *SP++, STF
MOV32 *SP++, R0H
MOV32 *SP++, R1H
MOV32 *SP++, R2H
MOV32 *SP++, R3H
MOV32 *SP++, R4H
MOV32 *SP++, R5H
MOV32 *SP++, R6H
MOV32 *SP++, R7H
.endif
.endm
RT_CTX_RESTORE .macro
.if __FPU32__
MOV32 R7H, *--SP, UNCF
MOV32 R6H, *--SP, UNCF
MOV32 R5H, *--SP, UNCF
MOV32 R4H, *--SP, UNCF
MOV32 R3H, *--SP, UNCF
MOV32 R2H, *--SP, UNCF
MOV32 R1H, *--SP, UNCF
MOV32 R0H, *--SP, UNCF
MOV32 STF, *--SP
POP RB
.endif
POP RPC
POP XT
POP XAR7
POP XAR6
POP XAR5
POP XAR4
POP XAR3
POP XAR2
MOVZ AR0 , @SP
SUBB XAR0, #6
MOVL ACC , *XAR0
AND ACC, #0xFFFF << 16
MOV AL, IER
MOVL *XAR0, ACC
POP AR1H:AR0H
.endm
.text
.newblock
;
; rt_base_t rt_hw_interrupt_disable();
;
.asmfunc
_rt_hw_interrupt_disable:
PUSH ST1
SETC INTM,DBGM
MOV AL, *--SP
LRETR
.endasmfunc
;
; void rt_hw_interrupt_enable(rt_base_t level);
;
.asmfunc
_rt_hw_interrupt_enable:
MOV *SP++, AL
POP ST1
LRETR
.endasmfunc
;
; void rt_hw_context_switch(rt_uint32 from, rt_uint32 to);
; r0 --> from
; r4 --> to
.asmfunc
_rt_hw_context_switch_interrupt:
MOVL XAR0, #0
MOV AR0, AL
MOVL XAR4, *-SP[4]
; set rt_thread_switch_interrupt_flag to 1
MOVL XAR5, #_rt_thread_switch_interrupt_flag
MOVL XAR6, *XAR5
MOVL ACC, XAR6
CMPB AL, #1
B _reswitch, EQ
MOVL XAR6, #1
MOVL *XAR5, XAR6
MOVL XAR5, #_rt_interrupt_from_thread ; set rt_interrupt_from_thread
MOVL *XAR5, XAR0
_reswitch:
MOVL XAR5, #_rt_interrupt_to_thread ; set rt_interrupt_to_thread
MOVL *XAR5, XAR4
LRETR
.endasmfunc
;
; void rt_hw_context_switch(rt_uint32 from, rt_uint32 to);
; r0 --> from
; r4 --> to
.asmfunc
_rt_hw_context_switch:
MOVL XAR0, #0
MOV AR0, AL
MOVL XAR4, *-SP[4]
; set rt_thread_switch_interrupt_flag to 1
MOVL XAR5, #_rt_thread_switch_interrupt_flag
MOVL XAR6, *XAR5
MOVL ACC, XAR6
CMPB AL, #1
B _reswitch2, EQ
MOVL XAR6, #1
MOVL *XAR5, XAR6
MOVL XAR5, #_rt_interrupt_from_thread ; set rt_interrupt_from_thread
MOVL *XAR5, XAR0
_reswitch2:
MOVL XAR5, #_rt_interrupt_to_thread ; set rt_interrupt_to_thread
MOVL *XAR5, XAR4
TRAP #16
LRETR
.endasmfunc
.asmfunc
_RTOSINT_Handler:
; disable interrupt to protect context switch
DINT
; get rt_thread_switch_interrupt_flag
MOV AR0, #_rt_thread_switch_interrupt_flag
MOV AL, *AR0
MOV AR1, AL
CMP AR1, #0
B rtosint_exit, EQ ; pendsv already handled
; clear rt_thread_switch_interrupt_flag to 0
MOV AR1, #0x00
MOV *AR0, AR1
MOV AR0, #_rt_interrupt_from_thread
MOV AL, *AR0
MOV AR1, AL
CMP AR1, #0
B switch_to_thread, EQ ; skip register save at the first time
;#if defined (__VFP_FP__) && !defined(__SOFTFP__)
; TST lr, #0x10 ; if(!EXC_RETURN[4])
; VSTMDBEQ r1!, {d8 - d15} ; push FPU register s16~s31
;#endif
RT_CTX_SAVE ; push r4 - r11 register
;#if defined (__VFP_FP__) && !defined(__SOFTFP__)
; MOV r4, #0x00 ; flag = 0
; TST lr, #0x10 ; if(!EXC_RETURN[4])
; MOVEQ r4, #0x01 ; flag = 1
; STMFD r1!, {r4} ; push flag
;#endif
MOV AL, *AR0
MOV AR0, AL
MOVZ AR1, @SP ; get from thread stack pointer
MOV *AR0, AR1 ; update from thread stack pointer
switch_to_thread:
MOV AR1, #_rt_interrupt_to_thread
MOV AL, *AR1
MOV AR1, AL
MOV AL, *AR1
MOV AR1, AL ; load thread stack pointer
;#if defined (__VFP_FP__) && !defined(__SOFTFP__)
; LDMFD r1!, {r3} ; pop flag
;#endif
MOV @SP, AR1
RT_CTX_RESTORE ; pop r4 - r11 register
rtosint_exit:
; restore interrupt
EINT
IRET
.endasmfunc
.asmfunc
_rt_hw_get_st0:
PUSH ST0
POP AL
LRETR
.endasmfunc
.asmfunc
_rt_hw_get_st1:
PUSH ST1
POP AL
LRETR
.endasmfunc
; C28x do not have a build-in "__ffs" func in its C compiler.
; We can use the "Count Sign Bits" (CSB) instruction to make one.
; CSB will return the number of 0's minus 1 above the highest set bit.
; The count is placed in T. For example:
; ACC T maxbit
; 0x00000001 30 0
; 0x00000010 26 4
; 0x000001FF 22 8
; 0x000001F0 22 8
.asmfunc
_rt_hw_calc_csb:
MOV AH, #0
CSB ACC ; T = no. of sign bits - 1
MOVU ACC, T ; ACC = no. of sign bits - 1
SUBB ACC, #30 ; ACC = ACC - 30
ABS ACC ; ACC = |ACC|
lretr
.endasmfunc
;
; * void rt_hw_context_switch_to(rt_uint32 to);
; * r0 --> to
.asmfunc
_rt_hw_context_switch_to:
MOV AR1, #_rt_interrupt_to_thread
MOV *AR1, AL
;#if defined (__VFP_FP__) && !defined(__SOFTFP__)
; CLEAR CONTROL.FPCA
; MRS r2, CONTROL ; read
; BIC r2, #0x04 ; modify
; MSR CONTROL, r2 ; write-back
;#endif
; set from thread to 0
MOV AR1, #_rt_interrupt_from_thread
MOV AR0, #0x0
MOV *AR1, AR0
; set interrupt flag to 1
MOV AR1, #_rt_thread_switch_interrupt_flag
MOV AR0, #1
MOV *AR1, AR0
TRAP #16
; never reach here!
.endasmfunc
; compatible with old version
.asmfunc
_rt_hw_interrupt_thread_switch:
LRETR
NOP
.endasmfunc
.end
+148
View File
@@ -0,0 +1,148 @@
/*
* Copyright (c) 2006-2022, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2018-09-01 xuzhuoyi the first version.
* 2019-07-03 zhaoxiaowei add support for __rt_ffs.
* 2019-12-05 xiaolifan add support for hardware fpu32
*/
#include <rtthread.h>
/* exception and interrupt handler table */
rt_uint32_t rt_interrupt_from_thread;
rt_uint32_t rt_interrupt_to_thread;
rt_uint32_t rt_thread_switch_interrupt_flag;
/* exception hook */
static rt_err_t (*rt_exception_hook)(void *context) = RT_NULL;
extern rt_uint16_t rt_hw_get_st0(void);
extern rt_uint16_t rt_hw_get_st1(void);
extern int rt_hw_calc_csb(int value);
struct exception_stack_frame
{
rt_uint32_t t_st0;
rt_uint32_t acc;
rt_uint32_t p;
rt_uint32_t ar1_ar0;
rt_uint32_t dp_st1;
rt_uint32_t dbgstat_ier;
rt_uint32_t return_address;
};
struct stack_frame
{
struct exception_stack_frame exception_stack_frame;
/* r4 ~ r11 register */
rt_uint16_t ar0h;
rt_uint16_t ar1h;
rt_uint32_t xar2;
rt_uint32_t xar3;
rt_uint32_t xar4;
rt_uint32_t xar5;
rt_uint32_t xar6;
rt_uint32_t xar7;
rt_uint32_t xt;
rt_uint32_t rpc;
#ifdef __TMS320C28XX_FPU32__
rt_uint32_t rb;
rt_uint32_t stf;
rt_uint32_t r0h;
rt_uint32_t r1h;
rt_uint32_t r2h;
rt_uint32_t r3h;
rt_uint32_t r4h;
rt_uint32_t r5h;
rt_uint32_t r6h;
rt_uint32_t r7h;
#endif
};
rt_uint8_t *rt_hw_stack_init(void *tentry,
void *parameter,
rt_uint8_t *stack_addr,
void *texit)
{
struct stack_frame *stack_frame;
rt_uint8_t *stk;
unsigned long i;
stk = stack_addr;
stk = (rt_uint8_t *)RT_ALIGN((rt_uint32_t)stk, 8);
//stk -= sizeof(struct stack_frame);
stk += 1;
stack_frame = (struct stack_frame *)stk;
/* init all register */
for (i = 0; i < sizeof(struct stack_frame) / sizeof(rt_uint32_t); i ++)
{
((rt_uint32_t *)stack_frame)[i] = 0xdeadbeef;
}
stack_frame->exception_stack_frame.t_st0 = 0x11110000 | rt_hw_get_st0();
stack_frame->exception_stack_frame.acc = 0x33332222;
stack_frame->exception_stack_frame.ar1_ar0 = 0x00001111 & (unsigned long)parameter; /* ar0 : argument */
stack_frame->exception_stack_frame.p = 0x55554444; /* p */
stack_frame->exception_stack_frame.dp_st1 = (0x00000000) | rt_hw_get_st1() & 0xFFFFFFFE; /* dp_st1 */
stack_frame->exception_stack_frame.dbgstat_ier = 0; /* dbgstat_ier */
stack_frame->exception_stack_frame.return_address = (unsigned long)tentry; /* return_address */
stack_frame->rpc = (unsigned long)texit;
#ifdef __TMS320C28XX_FPU32__
stack_frame->stf = 0x00000200;
stack_frame->rb = 0;
#endif
/* return task's current stack address */
return stk + sizeof(struct stack_frame);
}
/**
* This function set the hook, which is invoked on fault exception handling.
*
* @param exception_handle the exception handling hook function.
*/
void rt_hw_exception_install(rt_err_t (*exception_handle)(void *context))
{
rt_exception_hook = exception_handle;
}
struct exception_info
{
rt_uint32_t exc_return;
struct stack_frame stack_frame;
};
#ifdef RT_USING_CPU_FFS
/*
* This function called rt_hw_calc_csb to finds the first bit set in value.
* rt_hw_calc_csb is a native assembly program that use "CSB" instruction in C28x.
* When you use this function, remember that "int" is only 16-bit in C28x's C compiler.
* If value is a number bigger that 0xFFFF, trouble may be caused.
* Maybe change "int __rt_ffs(int value)" to "rt_int32_t __rt_ffs(rt_int32_t value)" will be better.
*/
int __rt_ffs(int value)
{
return rt_hw_calc_csb(value);
}
#endif
/**
* shutdown CPU
*/
RT_WEAK void rt_hw_cpu_shutdown(void)
{
rt_kprintf("shutdown...\n");
RT_ASSERT(0);
}