Здравствуйте!
Начал осваивать Allwinner A13 и пока безуспешно. Использую отладочную плату "A13-olinuxino", загрузиться хочу с SD карты (4 ГБ класс скорости 4).
Компилятор arm-none-eabi , исходник программы ниже, мигает светодиодом на порте G 9 (штатный порт на отладочной плате со светодиодом):
CODE
#define uint32_t unsigned long int
#define CCMBase 0x01C20000 //clock module
#define Def_APB0_Gating CCMBase + 0x68
//#define Def_APB0_Gating 0x01C20068
#define GPIOBase 0x01C20800
#define GPIOIncrement 0x24
#define ALLWINNER_GPIO_A GPIOBase
#define ALLWINNER_GPIO_B GPIOBase + (1*GPIOIncrement)
#define ALLWINNER_GPIO_C GPIOBase + (2*GPIOIncrement)
#define ALLWINNER_GPIO_D GPIOBase + (3*GPIOIncrement)
#define ALLWINNER_GPIO_E GPIOBase + (4*GPIOIncrement)
#define ALLWINNER_GPIO_F GPIOBase + (5*GPIOIncrement)
#define ALLWINNER_GPIO_G GPIOBase + (6*GPIOIncrement)
#define ALLWINNER_GPIO_H GPIOBase + (7*GPIOIncrement)
#define ALLWINNER_GPIO_I GPIOBase + (8*GPIOIncrement)
#define Port_CFG0 0x00 //pin direction and function 0 to 7
#define Port_CFG1 0x04 //pin direction and function 8 to 15
#define Port_CFG2 0x08 //pin direction and function 16 to 24
#define Port_CFG3 0x0C //pin direction and function 25 to 32
#define Port_DAT 0x10
#define Port_DRV0 0x14
#define Port_DRV1 0x18
#define Port_PUL0 0x1C
void main(void)
{
int i;
int j;
int foo;
uint32_t *portGConfig;
uint32_t *portGData;
uint32_t *APB0Gating;
//setup pointers for registers
portGConfig = (uint32_t *)(ALLWINNER_GPIO_G + Port_CFG1);
portGData = (uint32_t *)(ALLWINNER_GPIO_G + Port_DAT);
APB0Gating = (uint32_t *)(Def_APB0_Gating);
//enable clocking for GPIO
*APB0Gating |= 0x0020;
//configure port G pin 9 to output
*portGConfig |= 0x10;
//set output to on
*portGData |= 0x0200;
Loop:
foo = 0;
for (j = 0; j < 100; j++)
{
//toggle output
*portGData ^= 0x0200;
foo=j;
for (i = 0; i < 30000000; i++)
{
if(i>10)
{
foo++;
}
}
}
goto Loop;
}
Файл линковщика:
Код
MEMORY
{
RAM (XRW) : ORIGIN = 0x00000000, LENGTH = 0x00004000 /* 16 KB */
}
SECTIONS
{
.start : { *(.start) } > RAM
.text : { *(.text) } > RAM
.bss : { *(.bss) } > RAM
.fill :
{
FILL(0x00);
. = ORIGIN(RAM) + LENGTH(RAM) - 1;
BYTE(0x00);
} > RAM
/DISCARD/ : { *(.dynstr*) }
/DISCARD/ : { *(.dynamic*) }
/DISCARD/ : { *(.plt*) }
/DISCARD/ : { *(.interp*) }
/DISCARD/ : { *(.gnu*) }
/DISCARD/ : { *(.note*) }
}
ассемблерный листинг:
Код
test.elf: file format elf32-littlearm
Disassembly of section .text.startup:
00000000 <main>:
0: e59f3030 ldr r3, [pc, #48]; 38 <main+0x38>
4: e5932068 ldr r2, [r3, #104]; 0x68
8: e3822020 orr r2, r2, #32
c: e5832068 str r2, [r3, #104]; 0x68
10: e59328dc ldr r2, [r3, #2268]; 0x8dc
14: e3822010 orr r2, r2, #16
18: e58328dc str r2, [r3, #2268]; 0x8dc
1c: e59328e8 ldr r2, [r3, #2280]; 0x8e8
20: e3822c02 orr r2, r2, #512; 0x200
24: e58328e8 str r2, [r3, #2280]; 0x8e8
28: e59f300c ldr r3, [pc, #12]; 3c <main+0x3c>
2c: e2533001 subs r3, r3, #1
30: 1afffffd bne 2c <main+0x2c>
34: eafffffb b 28 <main+0x28>
мейк-скрипт:
Код
arm-none-eabi-gcc -Os -march=armv7-a -std=c99 -marm -fpic -Wall -fno-common -fno-builtin -ffreestanding -nostdinc -nostdlib -fno-strict-aliasing -mno-thumb-interwork -fno-stack-protector -fno-toplevel-reorder -Wstrict-prototypes -Wno-format-nonliteral -Wno-format-security -c test.c -o test.o
arm-none-eabi-ld -T test.lds -M -o test.elf test.o
arm-none-eabi-objdump -D test.elf > test.asm
arm-none-eabi-objcopy -O binary test.elf test.bin
mksunxiboot.exe test.bin test-sd.bin
Для создания загрузочного образа использую программу с аргументами: mksunxiboot.exe test.bin test-sd.bin
С помощью дискового редактора копирую весь образ на 16-й сектор карты памяти (это смещение 8кБ от начала).
Карта памяти отформатирована в винде. Первые сектора - ДОСовский загрузчик-заглушка .
Из ассемблерного листинга видно что программа идет с адреса 0, как требуется в A13.
Хедер вроде тоже с верной контрольной суммой.
Стек инитится BROM-ом (при старте) SP=0x7FF8
Вставляю карту в одладочную плату, подаю питание (внешний БП 6V 2A) - и ничего не горит.
Пожалуйста, помогите разобраться, чего не хватает и что не так?
Весь проект прилагаю, мейк-файлы, скрипты и утилиты там же.
src.zip ( 21.23 килобайт )
Кол-во скачиваний: 17P.S.
Звонил светодиод и ножку контроллера - контакт есть, диод зажигается от тестера.
Объявил переменные volatile, не помогло:
CODE
void main(void)
{
volatile int i;
volatile int j;
volatile int foo;
volatile uint32_t *portGConfig;
volatile uint32_t *portGData;
volatile uint32_t *APB0Gating;
//setup pointers for registers
portGConfig = (volatile uint32_t *)(ALLWINNER_GPIO_G + Port_CFG1);
portGData = (volatile uint32_t *)(ALLWINNER_GPIO_G + Port_DAT);
APB0Gating = (volatile uint32_t *)(Def_APB0_Gating);
//enable clocking for GPIO
*APB0Gating |= 0x0020;
//configure port G pin 9 to output
*portGConfig |= 0x10;
//set output to on
*portGData |= 0x0200;
Loop:
foo = 0;
for (j = 0; j < 100; j++)
{
//toggle output
*portGData ^= 0x0200;
foo=j;
for (i = 0; i < 30000000; i++)
{
if(i>10)
{
foo++;
}
}
}
goto Loop;
}
00000000 <main>:
0: e59f3094 ldr r3, [pc, #148]; 9c <main+0x9c>
4: e24dd010 sub sp, sp, #16
8: e5932068 ldr r2, [r3, #104]; 0x68
c: e3822020 orr r2, r2, #32
10: e5832068 str r2, [r3, #104]; 0x68
14: e59328dc ldr r2, [r3, #2268]; 0x8dc
18: e3822010 orr r2, r2, #16
1c: e58328dc str r2, [r3, #2268]; 0x8dc
20: e59328e8 ldr r2, [r3, #2280]; 0x8e8
24: e3822c02 orr r2, r2, #512; 0x200
28: e58328e8 str r2, [r3, #2280]; 0x8e8
2c: e3a02000 mov r2, #0
30: e58d200c str r2, [sp, #12]
34: e58d2008 str r2, [sp, #8]
38: e59d2008 ldr r2, [sp, #8]
3c: e3520063 cmp r2, #99; 0x63
40: cafffff9 bgt 2c <main+0x2c>
44: e59328e8 ldr r2, [r3, #2280]; 0x8e8
48: e2222c02 eor r2, r2, #512; 0x200
4c: e58328e8 str r2, [r3, #2280]; 0x8e8
50: e59d2008 ldr r2, [sp, #8]
54: e58d200c str r2, [sp, #12]
58: e3a02000 mov r2, #0
5c: e58d2004 str r2, [sp, #4]
60: e59d1004 ldr r1, [sp, #4]
64: e59f2034 ldr r2, [pc, #52]; a0 <main+0xa0>
68: e1510002 cmp r1, r2
6c: ca000007 bgt 90 <main+0x90>
70: e59d2004 ldr r2, [sp, #4]
74: e352000a cmp r2, #10
78: c59d200c ldrgt r2, [sp, #12]
7c: c2822001 addgt r2, r2, #1
80: c58d200c strgt r2, [sp, #12]
84: e59d2004 ldr r2, [sp, #4]
88: e2822001 add r2, r2, #1
8c: eafffff2 b 5c <main+0x5c>
90: e59d2008 ldr r2, [sp, #8]
94: e2822001 add r2, r2, #1
98: eaffffe5 b 34 <main+0x34>
9c: 01c20000 biceq r0, r2, r0
a0: 01c9c37f biceq ip, r9, pc, ror r3
Сообщение отредактировал IgorKossak - Mar 30 2018, 14:33
Причина редактирования: [codebox] для длинного кода. [code]-для короткого!!!