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

Исходник BOOT0 для Allwinner R40,A40,T3

Приветствую. 

Может, кто знает, где поискать исходники прелоадера для данной линейки процессоров.

При старте пишет:

[     0.33]HELLO! BOOT0 is starting!
[     0.37]boot0 commit : 8
[     0.40]boot0 version : 4.0
[     0.43]set pll start
[     0.47]set pll end
[     0.54]PMU: [     0.55]AXP221
[     0.90]rtc[0] value = 0x00000000
[     0.93]rtc[1] value = 0x00000000
[     0.96]rtc[2] value = 0x00000000
[     0.100]rtc[3] value = 0x00000000
[     0.103]rtc[4] value = 0x00000000
[     0.107]rtc[5] value = 0x00000000
[     0.110]DRAMC IS FOUR
[     0.113]DRAM BOOT DRIVE INFO: V1.1
[     0.116]the chip id is 0x00000003
[     0.120]the chip id is 0x00000003
[     0.124]the chip id is 0x00000003
[     0.127]the chip id is 0x00000003
[     0.131]the chip id is 0x00000003
[     0.138]PMU: [     0.139]AXP221
[     0.141]ddr voltage = 1500 mv
[     0.144]DRAM CLK =576 MHZ
[     0.147]DRAM Type =3 (2:DDR2,3:DDR3,6:LPDDR2,7:LPDDR3)
[     0.152]DRAM zq value: 0x003b3bfb
[     0.158]DRAM SIZE =1024 M
[     0.161]DRAM simple test OK.
[     0.164]dram size =1024
[     0.167]rtc standby flag is 0x00000000, super standby flag is 0x00000000
[     0.175]card no is 2
[     0.178]sdcard 2 line count 8
 

Вот эту бы версию или позднее, но где ни искал, все старье только до А20го и из 2х частей (Boot0 и Boot1), тут же все вместе, после Boot0 идет сразу uboot.

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


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

On 3/21/2022 at 1:55 PM, mantech said:

тут же все вместе, после Boot0 идет сразу uboot

почему просто uboot  не подходит ? у него свой "прелоадер" SPL c конфигуратором внешней памяти. boot0 это от легаси сборок производителя, в майнстримном убуте он не нужен. Судя по статусу легаси убутом нет смысла пользоваться в настоящее время

 

https://linux-sunxi.org/U-Boot#Status_Matrix

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

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


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

9 часов назад, sasamy сказал:

почему просто uboot  не подходит ? у него свой "прелоадер" SPL c конфигуратором внешней памяти. boot0 это от легаси сборок производителя

Ну почему-то сколь не видал логов при старте, всегда запускается boot0, значит они его используют для чего-то. В allwinner есть особенность, что сперва нужно запустить прогу не более 32 КБ для первоначальной инициализации и только потом грузить убут во внешнюю память, вот этот инициализатор мне и нужен. Возможно они перестали выкладывать его исходники в открытый доступ, почему и спрашивал, может есть они у кого...

Или этот " свой "прелоадер" SPL c конфигуратором внешней памяти" и представляется, как boot0 ?

 

ЗЫ. А вообще есть у меня такой отвлеченный вопрос. Допустим захотел я сделать убут "под себя", в распоряжении есть комп в виндой и установленный эклипс с gcc ARM. Что нужно сделать, чтоб загрузить в него исходный код убута, скачанный с гитхаба например в виде zip архива и он смог там собраться? Или это можно сделать только из под линукса, для фанатов командной строки? 

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

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


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

15 hours ago, mantech said:

Или этот " свой "прелоадер" SPL c конфигуратором внешней памяти" и представляется, как boot0 ?

это аналог boot0 и подобных бутстрапов для разных SoC, обычно в логе пишет что это SPL, он в дереве исходников u-boot но собирается в отдельный бинарник а потом просто "склеивается" в один файл с основным u-boot, хотя его можно и отдельно использовать. Виндовс я не пользуюсь больше 10 лет - не знаю как там wsl  поживает, может через неё можно что-то придумать для сборки, эклипс есть и для линуксов но проще 3 команды набрать в командной строке для сборки чем перелопатить интернет в поисках рецептов настройки комбайна сомнительной цекнности.

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


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

2 часа назад, sasamy сказал:

это аналог boot0 и подобных бутстрапов для разных SoC, обычно в логе пишет что это SPL, он в дереве исходников u-boot но собирается в отдельный бинарник а потом просто "склеивается" в один файл с основным u-boot, хотя его можно и отдельно использовать.

Понятно, спасибо.

2 часа назад, sasamy сказал:

может через неё можно что-то придумать для сборки

Ясно,значит простого решения тут нет, жалко.

2 часа назад, sasamy сказал:

эклипс есть и для линуксов но проще 3 команды набрать в командной строке

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

 

Тут так и вспомнил, как раньше мне приятель говорил, с ms-dos приятно перейти на винду, там все проще, понятнее и удобнее,а вот с винды на ms-dos уже как-то не хочется))))))

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

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


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

26.03.2022 в 10:55, sasamy сказал:

почему просто uboot  не подходит ? у него свой "прелоадер" SPL c конфигуратором внешней памяти. boot0 это от легаси сборок производителя, в майнстримном убуте он не нужен. Судя по статусу легаси убутом нет смысла пользоваться в настоящее время

Наверное вы не очень в курсе функциональности проприетарного boot0. Оно автоматически детектит и настраивает Dram любого типа, разрядности, скорости и объема, в процессе управляет pmic AXP*** чтобы дать правильное напряжение на память.
Это критически важно при массовом производстве потому что паяют не строго определенный тип памяти а от балды любой какой есть на складе в данный момент лишь бы требуемый объем набрать.

Внутри sip (V3s, D1s и т.п.) вам тоже никто не даст гарантию того что всегда будут ставить полностью идентичные чипы dram.

В mainline uboot автодетект типа сделать не могут потому что контроллер ddr sdram не документирован и инициализацию в spl делают путем реверса и дампов с имеющихся устройств.

В качестве примера геморойности второго подхода можно привести NUC970. Там поменяли тип dram внутри sip и для новой ревизии нужна другая инициализация. В результате прошивки для разных ревизий одного и того же процессора получаются разные. На практике юзеры с предыдущими ревизиями процессора остались без апдейтов потому что ПО выпускается только под текущую ревизию в производстве.

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


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

19 минут назад, _3m сказал:

Наверное вы не очень в курсе функциональности проприетарного boot0. Оно автоматически детектит и настраивает Dram любого типа, разрядности, скорости и объема

А у вас откуда такая информация? В былые времена была возможность работать с бутами для камней А10-А20, там все было открыто и исходники инита памяти тоже, причем там инит вполне определенного типа памяти, параметры которой задавались в спец. области данных бута, либо брались "стоковые". Бут1 - это вообще была своего рода миниоперационка, где была возможность подгрузки драйверов. Эти дела я достаточно неплохо изучил. Но в относительно новых процах этот загрузчик решили засекретить видимо, не понятно по каким причинам, наверно гугля со своим ведроидом вмешалась, поэтому и гемор настал(((

27 минут назад, _3m сказал:

В mainline uboot автодетект типа сделать не могут потому что контроллер ddr sdram не документирован и инициализацию в spl делают путем реверса и дампов с имеющихся устройств.

А вот это мне интересно, а зачем? Зачем вообще делать инит памяти, когда он уже сделан в проприентарном буте? 

29 минут назад, _3m сказал:

В качестве примера геморойности второго подхода можно привести NUC970. Там поменяли тип dram

А вот это печально очень, тоже не понятно, там же память на том же кристалле, как и проц, т.е. в одном техпроцессе делается, какой смысл менять тип памяти??

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


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

  

26 минут назад, mantech сказал:

А у вас откуда такая информация?

Из файла mctl_hal.c:

/*****************************************************************************
作用:自动配置DRAM,include type,rank,width,row,col,bank
参数:__dram_para_t *para
返回值:0-表示自动配置失败  , 1-自动配置成功
*****************************************************************************/
#ifdef DRAM_AUTO_SCAN
unsigned int auto_scan_dram_config(__dram_para_t *para)

Функция: автоматическая настройка DRAM, включая тип, ранг, ширину, строку, столбец, банк Параметры: __dram_para_t *para Возвращаемое значение: 0 — указывает, что автоматическая настройка не удалась, 1 — автоматическая настройка прошла успешно.

 

Цитата

А вот это мне интересно, а зачем? Зачем вообще делать инит памяти, когда он уже сделан в проприентарном буте?

Если не использовать проприетарный бут то инит памяти надо делать самостоятельно.

Цитата

А вот это печально очень, тоже не понятно, там же память на том же кристалле, как и проц, т.е. в одном техпроцессе делается, какой смысл менять тип памяти??

Это sip. Dram - отдельный чип который приклеен на процессоре и все это упаковано в один корпус. DRAM в том же техпроцессе что CPU не получается (или наоборот). Пытались делать на том же кристалле но "не взлетело".

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


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

44 минуты назад, _3m сказал:

Функция: автоматическая настройка DRAM, включая тип, ранг, ширину, строку, столбец, банк Параметры: __dram_para_t *para Возвращаемое значение: 0 — указывает, что автоматическая настройка не удалась, 1 — автоматическая настройка прошла успешно.

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

void auto_set_timing_para(__dram_para_t *para)
  {
  unsigned int ctrl_freq;//half speed mode :ctrl_freq=1/2 ddr_fre
  unsigned int type;
  unsigned int reg_val =0;
  unsigned int tdinit0 = 0;
  unsigned int tdinit1 = 0;
  unsigned int tdinit2 = 0;
  unsigned int tdinit3 = 0;
  unsigned char t_rdata_en = 1; //ptimg0
  unsigned char wr_latency = 1; //ptimg0
  unsigned char tcl = 3; //6
  unsigned char tcwl = 3; //6
  unsigned char tmrw = 0; //0
  unsigned char tmrd = 2; //4;
  unsigned char tmod = 6; //12;
  unsigned char tccd = 2; //4;
  unsigned char tcke = 2; //3;
  unsigned char trrd = 3; //6;
  unsigned char trcd = 6; //11;
  unsigned char trc = 20; //39;
  unsigned char tfaw = 16; //32;
  unsigned char tras = 14; //28;
  unsigned char trp = 6; //11;
  unsigned char twtr = 3; //6;
  unsigned char twr = 8; //15;
  unsigned char trtp = 3; //6;
  unsigned char txp = 10; //20;
  unsigned short trefi = 98; //195;
  unsigned short trfc = 128;
  unsigned char twtp = 12; //24; //write to pre_charge
  unsigned char trasmax = 27; //54; //54*1024ck
  unsigned char twr2rd = 8; //16;
  unsigned char trd2wr = 4; //7;
  unsigned char tckesr = 3; //5;
  unsigned char tcksrx = 4; //8;
  unsigned char tcksre = 4; //8;
  ctrl_freq = para->dram_clk/2; //Controller work in half rate mode
  type = para->dram_type;

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


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

1 hour ago, _3m said:

Это критически важно при массовом производстве потому что паяют не строго определенный тип памяти а от балды любой какой есть на складе в данный момент лишь бы требуемый объем набрать.

Угу, возьмут вот и LPDDR2 вместо DDR3L поставят, лишь бы объем набрать.

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


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

27 минут назад, aaarrr сказал:

Угу, возьмут вот и LPDDR2 вместо DDR3L поставят

Так вроде они по цоколевке разные, не?)))))

1 час назад, _3m сказал:

Если не использовать проприетарный бут то инит памяти надо делать самостоятельно.

Так вот и вопрос был, почему б не использовать проприентарный, чтоб потом ничего не инициализировать? Дело принципа или какая-то другая причина?

Я бы вот рад его использовать, только не знаю как...

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

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


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

6 minutes ago, mantech said:

Так вроде они по цоколевке разные, не?)))))

О том и речь. Сарказм.

 

7 minutes ago, mantech said:

Дело принципа или какая-то другая причина?

1. Дело принципа.

2. Своё решение по понятным причинам аккуратнее встраивается

 

Если серьёзно, то проблема есть - и на Alwinner и на RockChip приходилось сталкиваться с "особенностями" реверс-инженерной инициализации.

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


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

6 часов назад, aaarrr сказал:

1. Дело принципа.

2. Своё решение по понятным причинам аккуратнее встраивается

По №1 - ну принцип - есть принцип)))))

По №2 - да х.з.  По мне так решение от производителя более предпочтительно, но как его к своей проге приделать??  Конечно можно выкачать с флешки первые 32Кб, прилинковать к своей проге, но как быть с адресами перехода на мою программу, какие они и где прописываются - х.з.

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


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

1 час назад, mantech сказал:

По №2 - да х.з.  По мне так решение от производителя более предпочтительно, но как его к своей проге приделать??  Конечно можно выкачать с флешки первые 32Кб, прилинковать к своей проге, но как быть с адресами перехода на мою программу, какие они и где прописываются - х.з.

Зачем с флэшки выкачивать ? Достаточно статическую либу прилинковать. Хидеры к либе есть же.

Для D1 на который инициализацию dram еще не расковыряли так и делают. boot0 вместо spl а потом уже православный uboot.

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


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

1 час назад, _3m сказал:

Для D1 на который инициализацию dram еще не расковыряли так и делают

Расковыряли, но так, как не надо)))

 

 

const uint8_t __attribute__((section (".ddr.bin"))) ddr_bin[] = {
    0x37, 0x03, 0x40, 0x00, 0x73, 0x20, 0x03, 0x7c, 0x37, 0x03, 0x03, 0x00,
    0x1b, 0x03, 0x33, 0x01, 0x73, 0x20, 0x23, 0x7c, 0x6f, 0x00, 0x40, 0x08,
    0x18, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xfb, 0x7b, 0x7b, 0x00,
    0x01, 0x00, 0x00, 0x00, 0xd2,.........................куча байт)))

void sys_dram_init(void)
{
    __asm__ __volatile__("li t1, 0x30013");
    __asm__ __volatile__(".word 0x7c232073");
    ((void(*)(void))((void *)0x00030000))();

 

1 час назад, _3m сказал:

Достаточно статическую либу прилинковать. Хидеры к либе есть же.

Для D1 на который инициализацию dram еще не расковыряли так и делают.

А можно немного подробнее? Никогда подобным не занимался.

1) Где лежит либа и ее хидер

2) Эту либу можно прилинковать в безлинуксовом окружении

3) как в таком случае пойдет загрузка(т.е. загрузится первые 32Кб, затем управление передастся следующему блоку или как иначе)

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


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

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

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

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

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

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

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

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

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

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