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

Allwinner V3s BareMetal -попытки

Соседний топик разросся и всем надоел.  Попытаюсь задать теме новый старт.  UBoot с поодержкой ethernet собрать так и не удалось. Помощь уважаемого aaarrr  не спасла. Попробовал из текущего uboot два  приложнения(свое, и чужое - xboot) запустить с sdcard. С адреса 0x400000000. В обоих случаях результат отрицательный. Свое приложение HelloWord я готов считать насквозь косячным. Но...Приложение xboot при запуске посредством утилиты sunxi-fel с того же адреса 0x40000000 таки работало.. UBoot стандартный, без моих допиливаний. XBoot загружал и запускал следующим образом:

 

load mmc 0:1 0x40000000 xboot.bin
go 0x40000000

 

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

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


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

8 минут назад, nanorobot сказал:

запустить с sdcard. С адреса 0x400000000. В обоих случаях результат отрицательный. Свое приложение HelloWord я готов считать насквозь косячным.

Ваша прога через усб (sunxi-fel) запустилась? Условие, что не должно превышать 32кбайта.

В курсе, что для прямого запуска (усб, сдкарта), должен быть заголовок с контрольной суммой?

13 минут назад, nanorobot сказал:

Свое приложение HelloWord я готов считать насквозь косячным.

Какая в нем есть инициализация и чего? Я начинал освоение подобных процов с простого мигания диодом на ножке порта, т.к. понятия не имел об инициализации более сложной периферии, прерываний и пр...

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

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


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

14 minutes ago, mantech said:

Ваша прога через усб (sunxi-fel) запустилась? Условие, что не должно превышать 32кбайта.

В курсе, что для прямого запуска (усб, сдкарта), должен быть заголовок с контрольной суммой?

 

мое приложение > 32k. про заголовок с CRC не в курсе..
запуск через усб (sunxi-fel)  заголовка не требует?
где прочитать про заголовки с CRC и способы их генерации?

 

upd: разглядел что при запуске через USB заголовок тоже нужен. тем страннее неработа при запуске с SD через UBOOT

 

 

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

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


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

1 минуту назад, nanorobot сказал:

мое приложение > 32k.

Что вы там такого наворотили, что >32кб? У меня в этот объем вошла инициализация портов, уарта, ДДР, сд карты и еще мелочи. Начинайте с чего-нить попроще, как написал выше.

4 минуты назад, nanorobot сказал:

где прочитать про заголовки с CRC и способы их генерации?

Посмотрите на linux-sunxi подобных ресурсах.

Вот пример простой программы с заголовком:

 

#define u32 unsigned long int

#define CCMBase  0x01C20000 /* Clock Module */
#define GPIOBase 0x01C20800 /* GPIO         */

#define GPIOIncrement 0x24

#define GPIO_A (GPIOBase+(0*GPIOIncrement))
#define GPIO_B (GPIOBase+(1*GPIOIncrement))
#define GPIO_C (GPIOBase+(2*GPIOIncrement))
#define GPIO_D (GPIOBase+(3*GPIOIncrement))
#define GPIO_E (GPIOBase+(4*GPIOIncrement))
#define GPIO_F (GPIOBase+(5*GPIOIncrement))
#define GPIO_G (GPIOBase+(6*GPIOIncrement))
#define GPIO_H (GPIOBase+(7*GPIOIncrement))
#define 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

#define APB0_Gating  *(volatile u32*)(CCMBase+0x68     )
#define PortG_Config *(volatile u32*)(GPIO_G +Port_CFG1)
#define PortG_Data   *(volatile u32*)(GPIO_G +Port_DAT )

void delay_ms(u32 ms)
{
 register u32 loops=ms*500;
 __asm__ __volatile__ ("1:\n" "subs %0, %1, #1\n" "bne 1b":"=r" (loops):"0"(loops));
}

void __attribute__((section(".start"))) __attribute__((naked)) start(void)
{
 __asm__ __volatile__ ("b main          \n" //Jump to main()
                       ".long 0x4E4F4765\n" //eGON
                       ".long 0x3054422E\n" //.BT0
                       ".long 0x00000000\n" //checksum for boot0 (must be calculated !!!)
                       ".long 0x00000400\n" //length for boot0 (1 kB)
                       ".long 0x00000000\n"
                       ".long 0x00000000\n"
                       ".long 0x00000000\n");
}

void main(void)
{
 APB0_Gating|=0x0020; //enable clocking for GPIO

 PortG_Config|=0x10;  //configure port G pin 9 to output

 Loop:

 PortG_Data^=0x0200;  //toggle output to on/off

 delay_ms(1000);      //delay 1s

 goto Loop;
}

 

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


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

4 minutes ago, mantech said:

Что вы там такого наворотили, что >32кб? У меня в этот объем вошла инициализация портов, уарта, ДДР, сд карты и еще мелочи. Начинайте с чего-нить попроще, как написал выше.

сделано под RT-THREAD и не убирались неиспользуемые  драйвера и сервисы. Видимо отсюда и весь  объем.. само приложение простейшее, мигание лед и вывод в уарт хелловорд

 

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

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


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

1 минуту назад, nanorobot сказал:

само приложение простейшее, мигание лед и вывод в уарт хелловорд

Простейшее то, что привел выше, занимает пару килобайт. Инит уарта там не простой, требует еще инита прерываний, в курсе?

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


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

6 minutes ago, mantech said:

Что вы там такого наворотили, что >32кб? У меня в этот объем вошла инициализация портов, уарта, ДДР, сд карты и еще мелочи. Начинайте с чего-нить попроще, как написал выше.

Посмотрите на linux-sunxi подобных ресурсах.

Вот пример простой программы с заголовком:

 


#define u32 unsigned long int

#define CCMBase  0x01C20000 /* Clock Module */
#define GPIOBase 0x01C20800 /* GPIO         */

#define GPIOIncrement 0x24

#define GPIO_A (GPIOBase+(0*GPIOIncrement))
#define GPIO_B (GPIOBase+(1*GPIOIncrement))
#define GPIO_C (GPIOBase+(2*GPIOIncrement))
#define GPIO_D (GPIOBase+(3*GPIOIncrement))
#define GPIO_E (GPIOBase+(4*GPIOIncrement))
#define GPIO_F (GPIOBase+(5*GPIOIncrement))
#define GPIO_G (GPIOBase+(6*GPIOIncrement))
#define GPIO_H (GPIOBase+(7*GPIOIncrement))
#define 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

#define APB0_Gating  *(volatile u32*)(CCMBase+0x68     )
#define PortG_Config *(volatile u32*)(GPIO_G +Port_CFG1)
#define PortG_Data   *(volatile u32*)(GPIO_G +Port_DAT )

void delay_ms(u32 ms)
{
 register u32 loops=ms*500;
 __asm__ __volatile__ ("1:\n" "subs %0, %1, #1\n" "bne 1b":"=r" (loops):"0"(loops));
}

void __attribute__((section(".start"))) __attribute__((naked)) start(void)
{
 __asm__ __volatile__ ("b main          \n" //Jump to main()
                       ".long 0x4E4F4765\n" //eGON
                       ".long 0x3054422E\n" //.BT0
                       ".long 0x00000000\n" //checksum for boot0 (must be calculated !!!)
                       ".long 0x00000400\n" //length for boot0 (1 kB)
                       ".long 0x00000000\n"
                       ".long 0x00000000\n"
                       ".long 0x00000000\n");
}

void main(void)
{
 APB0_Gating|=0x0020; //enable clocking for GPIO

 PortG_Config|=0x10;  //configure port G pin 9 to output

 Loop:

 PortG_Data^=0x0200;  //toggle output to on/off

 delay_ms(1000);      //delay 1s

 goto Loop;
}

 

весьма признателен, буду изучать

 

1 minute ago, mantech said:

Простейшее то, что привел выше, занимает пару килобайт. Инит уарта там не простой, требует еще инита прерываний, в курсе?

полагал, что инит уарта входит в инит RT-Thread.

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


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

5 минут назад, nanorobot сказал:

полагал, что инит уарта входит в инит RT-Thread.

Совсем не факт. Начинать нужно с самого простого, по своему опыту, любой неправильный инит приводил к зависанию...

5 минут назад, nanorobot сказал:

весьма признателен, буду изучать

Это было для А13го, поэтому посмотрите правильность адресов gpio, заголовок такой же.

Контрольную сумму считал так:

checksum.exe          led.bin spl.bin

 led.bin - источник  spl.bin-результат

 

checksum.exe

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

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


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

4 hours ago, nanorobot said:

UBoot с поодержкой ethernet собрать так и не удалось. Помощь уважаемого aaarrr  не спасла.

Рецепт был актуален для u-boot 2018.01, теперь все немного изменилось. Для свежего:

1. Патч 0001-Allwinner-V3s-EMAC-support.patch

2. Результат сборки u-boot-sunxi-with-spl.bin

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


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

Первый шаг сделан. Светодиодиками помигал(бинарник 300 с чем то байт). Многое стало яснее... :acute:Но есть и неожиданности.  Мигающее приложение загружаю/запускаю в RAM c адреса 0х4000 используя утилиту sunxi-fel. Утлиту для вычисления контрольной суммы заголовка написал сам(уважаемый mantech предложил мне свою, но она под винду,  а у меня линукс). Точнее допилил пример с гитхаба который по факту не работал, все время выдавал КС = 0. Эксперимента ради загрузил без вычисления КС, тоже загружается и работает... Возможно я не до конца понял про заголовок и КС - в каком случае они нужны..
  Возвращаясь к XBOOT. Использую его в единственном качестве - из него можно загрузить SPL, который инициализирует DDR память и дает возможность используя ту же самую утилиту sunxi-fel загрузить в эту память приложение не ограниченное размером 32к и запустить его. Вероятно есть более прямые пути для этого, но пока мне о них неизвестно(наверное это UBOOT  с SPL), и мне удобно использовать этот.  При этом не нужен ни UBOOT ни что либо еще. Отдаю себе отчет в том, что эта технология применима только на этапе отладки - ну этот этап еще надолго..

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

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


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

10 минут назад, nanorobot сказал:

Вероятно есть более прямые пути для этого, но пока мне о них неизвестно

Прямой путь здесь только один, грузим программу инита ДДР, и нужного загрузочного устр-ва, затем грузим основной загрузчик, уже в ДДР, и делаем все, что пожелается, можно дальше грузить что-то, а можно уже и саму целевую программу. Все-равно придется в 2 этапа грузиться, т.к. AW не позаботился о хотябы 128кило статической памяти для полнофункционального загрузчика, и не сделал предварительной конфигурации памяти, как это сделали в IMX чипах...

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


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

9 minutes ago, mantech said:

Прямой путь здесь только один, грузим программу инита ДДР, и нужного загрузочного устр-ва, затем грузим основной загрузчик, уже в ДДР, и делаем все, что пожелается, можно дальше грузить что-то, а можно уже и саму целевую программу. Все-равно придется в 2 этапа грузиться, т.к. AW не позаботился о хотябы 128кило статической памяти для полнофункционального загрузчика, и не сделал предварительной конфигурации памяти, как это сделали в IMX чипах...

Собственно именно так, или почти так,  у меня сейчас и происходит. Программа инита ДДР и загрузки  XBOOT. Полагаю, что есть возможность оба этапа совместить в своем приложении, но это высший пилотаж, котрый мне (пока) не по плечу.

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

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


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

2 минуты назад, nanorobot сказал:

но это высший пилотаж, котрый мне (пока) не по плечу.

Это нормально. Сначала разберитесь до конца с портами, потом инит уарта и контроллера прерываний, а там уже можно и за ДДР браться, благо есть исходники...

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

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


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

Разбираюсь с DMA. Копаю исходники проекта rpidmx512. Регулярно встречаю макросы содержащие 'COHERENT_REGION ' и указывающие на область памяти начинающейся с адреса H3_MEM_DRAM_START + 0x400000.  Эта область памяти чем то уникальна?  В V3S тоже есть аналогичная? Доступные даташиты для v3s и h4 слова coherent не знают..

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

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


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

17 часов назад, nanorobot сказал:

Разбираюсь с DMA. Копаю исходники проекта rpidmx512. Регулярно встречаю макросы содержащие 'COHERENT_REGION ' и указывающие на область памяти начинающейся с адреса H3_MEM_DRAM_START + 0x400000.  Эта область памяти чем то уникальна?  В V3S тоже есть аналогичная? Доступные даташиты для v3s и h4 слова coherent не знают..

Это скорее всего зависит от настроек MMU.

По идее COHERENT_REGION должна быть некэшируемой чтобы процессор видел операции DMA без инвалидации кэша.

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


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

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

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

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

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

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

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

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

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

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