Прерывание данных на A20 SoC

Я пытаюсь написать небольшое приложение, которое показывает сообщение через последовательный порт. Этот бинарный файл выполняется без ОС, поэтому он голый.

Код выглядит следующим образом:

#include <stdint.h>
#define FIFO 0x0
#define NOFIFO 0x1
#define FIFO_STATUS 0x0

#define THR_READY 0x1
#define THR_STATUS 0x5

#define UART_MEM        0x1C28000


volatile unsigned int *uart0 = (unsigned int *)UART_MEM;
volatile unsigned int *uart_str = (unsigned int *)(UART_MEM + 0x7c);
volatile unsigned int *uart_lstr = (unsigned int *)(UART_MEM + 0x14);


void print_smth(const char *str) {
    while (*str != '\0') {
            while ((*uart_lstr & (1 << THR_STATUS)) != THR_READY)
                    ;
            *uart0 = (unsigned int)(*str);
            str++;
    }
}

void c_entry(void) {
    print_smth("Hello");
}

Я загружаю этот бинарный файл с помощью u-boot, и на самом деле бинарный загружается нормально, пока он не достигнет:

*uart0 = (unsigned int)(*str);

Как только я пытаюсь записать в эту память, я получаю сообщение об ошибке сброса данных. Похоже, мне не разрешают писать по этому адресу памяти, но, взглянув на руководство пользователя A20, я вижу, что на самом деле UART0 отображается на 0x01C28000, поэтому у меня должен быть доступ для записи туда.

Это вывод:

=> loadx
## Ready for binary (xmodem) download to 0x42000000 at 115200 bps...                                                                                          
CxyzModem - CRC mode, 2(SOH)/0(STX)/0(CAN) packets, 2 retries
## Total Size      = 0x000000c4 = 196 Bytes
=>  go 0x42000000
## Starting application at 0x42000000 ...
data abort
pc : [<4200007c>]          lr : [<420000ac>]
reloc pc : [<0d0a207c>]    lr : [<0d0a20ac>]
sp : 000010b0  ip : 7fe79000     fp : 000010bc
r10: 00000002  r9 : 7af3dee0     r8 : 7efb47a8
r7 : 7af3fab8  r6 : 42000000     r5 : 00000002  r4 : 7af3fabc
r3 : ee070f15  r2 : 0000001e     r1 : 7af3fabc  r0 : 000000b0
Flags: nZCv  IRQs off  FIQs off  Mode SVC_32
Resetting CPU ...

resetting ...

Вы представляете, почему это происходит?

Возможно, что код не отображается в ОЗУ, и именно поэтому я получаю эту ошибку?

== ОБНОВЛЕНИЕ ==

После определения переменной как константы теперь работает "лучше". Это все еще не работает нормально, потому что я получаю мусор вместо моего текста.

Вот обновленный код:

#include <stdint.h>

#define TEMT_STATUS (0x1 << 6)

#define UART0   0x1C28000
    #define UART_LSR        0x14



volatile unsigned int *const uart0 = (unsigned int *)(UART0);
volatile unsigned int *const uart_lsr = (unsigned int *)(UART0 + UART_LSR);


void print_smth(const char *str) {

    while (*str != '\0') {
            while ( !(*uart_lsr & TEMT_STATUS))
                    ;
            *uart0 = (unsigned int)(*str);
            str++;
    }
}

void c_entry(void) {
    print_smth("os");
}

И вывод:

=>  go 0x42000000
## Starting application at 0x42000000 ...
��ᚕ��
    ��

Я уверен, что что-то упустил, но я не уверен, что. Я взглянул на драйвер, который используется u-boot, расположенный по адресу:

arch/arm/cpu/armv7/sunxi/early_print.c

И на самом деле это не делает больше, чем я. Вот мне и интересно, где же провал.

Спасибо заранее С уважением

1 ответ

Наиболее вероятный ответ здесь заключается в том, что вы неправильно строите голое железо. Пожалуйста, посмотрите на пример hello_world в U-Boot в examples/standalone, чтобы узнать, как наиболее важно связать приложение. Возможно, вы захотите начать с вызова некоторых из экспортированных функций, просто чтобы убедиться, что вы преодолели эти препятствия, прежде чем переходить непосредственно к аппаратному обеспечению.

Другие вопросы по тегам