Перейти к содержанию
    

Alwinner A13 не стартует с SD-карты

Здравствуйте!

 

Начал осваивать Allwinner A13 и пока безуспешно. Использую отладочную плату "A13-olinuxino", загрузиться хочу с SD карты (4 ГБ класс скорости 4).

 

Компилятор arm-none-eabi , исходник программы ниже, мигает светодиодом на порте G 9 (штатный порт на отладочной плате со светодиодом):

 

#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) - и ничего не горит.

 

Пожалуйста, помогите разобраться, чего не хватает и что не так?

 

Весь проект прилагаю, мейк-файлы, скрипты и утилиты там же.

 

post-99126-1522415112_thumb.png

 

src.zip

 

P.S.

Звонил светодиод и ножку контроллера - контакт есть, диод зажигается от тестера.

 

Объявил переменные volatile, не помогло:

 

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
[codebox] для длинного кода. [code]-для короткого!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуйте сначала этот бинарник из-под u-boot'а запустить с любого адреса. Версию с volatile, конечно, т.к. первый вариант ничем мигать не может точно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

может быть проблема в этом:

sudo dd if=bin/release.bin of=/dev/sdb bs=1024 seek=8

 

И почему bs=1024, когда сектор карты 512 байт? И что мне вместо sudo в винде использовать? Пока пишу дисковым редактором на 16-й сектор карты памяти.

 

С uboot пока бесполезно, нету под рукой RS232 <=> UART

 

Может всё-же проверяет карту и если там упоминание о винде(первые 2 сектора), то не грузится?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

может быть проблема в этом:
sudo dd if=bin/release.bin of=/dev/sdb bs=1024 seek=8

 

И почему bs=1024, когда сектор карты 512 байт?

Это просто удобный способ задать смещение: 8 * 1K нагляднее, чем 16 * 512. К размеру сектора отношения не имеет.

 

С uboot пока бесполезно, нету под рукой RS232 <=> UART

Надо завести, без UART никак.

 

Может всё-же проверяет карту и если там упоминание о винде(первые 2 сектора), то не грузится?

Содержимое первых секторов ему безразлично.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ещё один момент: на отладочной плате A13-Olinuxino не установлена NAND-Flash микросхема, и перемычка (SMD) замкнута: NCE_NAND_E - это Chip Enable как я понимаю. Может процессор пытается с неё загрузиться и перемычку надо разомкнуть, чтоб с SD карты пошла загрузка? Если да, прийдётся скальпелем резать потому что перемычка замкнута печатным проводником, а не резистором

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Allwinner'ы грузятся с нулевой SD карты при любых условиях, она первая в списке загрузки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Содержимое первых секторов ему безразлично.

 

Первые сектора резервируются под бут рекорд, например, если используете сд карту как загрузчик и ФС одновременно.

 

Начал осваивать Allwinner A13 и пока безуспешно. Использую отладочную плату "A13-olinuxino", загрузиться хочу с SD карты (4 ГБ класс скорости 4).

 

Не дадите ссылочки на компиляторы, ИДЕ и пр. инструменты, которые используете, тоже попробовать хочется, но с настройками гнушных программ туговато :crying:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Allwinner'ы грузятся с нулевой SD карты при любых условиях, она первая в списке загрузки.

Приобрёл адаптер RS232 <>UART.

 

К какому UART цепляться к UART1 или UART0 ? На линиях UART0 сидит карта SD - конфликт?

Формат данных: 115200, 8 , N, 1?

 

Для убута надо: u-boot-sunxi-with-spl.bin или 2 файла: sunxi-spl.bin и u-boot.img - бинарников не нашёл, только огромный tar.gz который надо самому собирать и компилить.

 

Поделитесь плиз SPL и U-Boot-ом для A13 пожалуйста.

А то чувствую себя застрявшим уже 2й день..

Изменено пользователем repstosw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Взял spl и u-boot отсюдова: http://dl.linux-sunxi.org/users/amery/sunxi-3.0/latest/

Архив: a13_olinuxino_hwpack.tar.xz

 

Закатал spl с 16-го сектор а карты, u-boot с 64-го сектора.

 

Скачал терминалку, при включенни питания на плату, валят несколько нулей, причем независимо от того стоит SD карта или нет. Если что-то послать, в ответ идут снова нули.

Подключился к UART1.

 

Соединение прямое: TX allwinner => TX адаптера RS232-UART, RX alwinner => RX адаптера. Питание 3,3V с платы на адаптер, GND вместе.

 

Бред идёт какой-то в общем:

WinXP, в биосе порт включен (COM1 0x2F8)

 

post-99126-1522478983_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Соединение прямое: TX allwinner => TX адаптера RS232-UART, RX alwinner => RX адаптера. Питание 3,3V с платы на адаптер, GND вместе.

обычно практикуется RX оборудования на TX адаптера и наоборот

 

а вы в архив "только огромный tar.gz" заглядывали? может там есть готовые бинарники?

 

и по начальному сообщению - цифры в адресах и битовых полях вроде правильные, поищите еще, может не хватает общего разрешения работы gpio, помимо клоков и работы с битами

и лучше не "мигать" светиком, а выставить в "1", тогда не будет неоднозначности. загорелся - значит прога стартовала

 

и еще, к вашей плате должен быть набор бинарников (ищите у производителя), накидайте на SD и запускайте с адаптером, буковки побегут, будете двигаться дальше..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я много вариантов перепробовал: и с мигающим диодом и не с мигающим. Ничего не работает.

 

И ссылку давал постом выше на тот Spl и u-boot, там ясно написано что он для olinuxino-A13. Заливал и SPL и U-boot - результат один - ничерта ничего не работает.

 

А те нули которые в терминале - разобрался, это наводка по воздуху, что доказывает, что UART1 не заводится, значит с SD-карты u-boot не грузится.

 

Много перепробовал готовых образов - ничего вообще не запускается и в терминале не бежит.

 

Пробовал ещё это:

http://radiokot.ru/articles/59/

там готовый бинарник есть, он тоже не пошёл.

 

Всё тоже самое пробовал на другой отладке - A13-SOM - результат такой же (точнее -без результата).

 

Могут ли быть проблемы с SD-картой? У меня SDmicro 4GB с классом 4.

 

Просто складывается впечатление, что приобрёл кирпичи, в Терраэлектронике, кстати, брал обе платы (Olinuxino и SOM) - напаяно дерьмовым образом - куча флюса оставлено и контроллер криво запаян как будто дрожащей рукой кто-то паял (неровности на контактах)

 

Никто не ковырял Alwinner-ы ? Мне одному выпала такая участь?

Изменено пользователем repstosw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Никто не ковырял Alwinner-ы ? Мне одному выпала такая участь?

И "ковыряли" и свои изделия проектировали.

 

Это -

обычно практикуется RX оборудования на TX адаптера и наоборот

проверили?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не дадите ссылочки на компиляторы, ИДЕ и пр. инструменты, которые используете, тоже попробовать хочется, но с настройками гнушных программ туговато :crying:

страничка от олимекса подойдет?

https://www.olimex.com/wiki/Bare_Metal_programming_A13

там вроде пошагово расписано, чего и как ставить..

 

кстати, и для проблемы ТС есть абзац:

GPIO issue
The above code works but the LED only turns on if printf is used. This appears to be caused by compiling optimization.
Not sure how to fix this with the u boot make files however the make file in the following section has optimization turned down to allow the GPIO setting to not be compiled out.

я бы попробовал вместо -Os написать -O0

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

кстати, и для проблемы ТС есть абзац

Все проблемы и так видны в листинге. Первый вариант - "без volatile" - неработоспособен, второй на вид должен работать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

страничка от олимекса подойдет?

https://www.olimex.com/wiki/Bare_Metal_programming_A13

там вроде пошагово расписано, чего и как ставить..

 

кстати, и для проблемы ТС есть абзац:

GPIO issue
The above code works but the LED only turns on if printf is used. This appears to be caused by compiling optimization.
Not sure how to fix this with the u boot make files however the make file in the following section has optimization turned down to allow the GPIO setting to not be compiled out.

я бы попробовал вместо -Os написать -O0

 

Ну не фанат я линукса, почему и спрашиваю, что под винду надобно...

 

На счет -Оs - тут правда, раз на такую засаду еще на АВРках напоролся...

 

Могут ли быть проблемы с SD-картой? У меня SDmicro 4GB с классом 4.

 

Просто складывается впечатление, что приобрёл кирпичи, в Терраэлектронике, кстати, брал обе платы (Olinuxino и SOM) - напаяно дерьмовым образом - куча флюса оставлено и контроллер криво запаян как будто дрожащей рукой кто-то паял (неровности на контактах)

 

На счет сд карты - такие карты должны работать, если сама карта живая, конечно, как-то на планшете перешивал тоже 4 гига.

 

В таком случае надо было покупать вместе с линукс-картой олимекса, она там за несколько евро продается, и сразу можно было проверить кирпич или нет...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...