|
|
  |
Помогите собрать Wince 4.2 Net для ядра s3c2410, нужна помощь |
|
|
|
Jul 23 2014, 09:10
|
Участник

Группа: Участник
Сообщений: 42
Регистрация: 6-08-13
Пользователь №: 77 820

|
Здравствуйте! Я уже пол года ломаю голову и никак не могу собрать WinCE 4.2 Net и залить на плату ядра s3c2410. Установил Platform Builder 4.2 в нём выбрал платформу для samsung-овского ядра, собрал, получил eboot.nb0, nk.bin и иже с ними, заливаю через H-JTAG. В начальную страницу залил nboot который собрал в CodeWarrior 1.2. После включения копирую блок программы eboot.nb0 в адрес 0x30000000 ReadImageFromNand() ну и передаю туда управление Launch(0x30000000) по дебагеру вижу как туда переходит управление, но... дальше затык. Что-то с преобразованием виртуальных адресов в физические или ещё что-то, программа вываливается в несуществующие адреса и просто шагает по пустышкам типа nop. Скажите, может быть кто нибудь ставил хоть раз свою сборку wince на какой нибудь навигатор или бортовой компьютер или pos-терминал? Как это делается последовательно? Какие настройки должны быть у Platform Builder ? Исходников nboot полно, но я не уверен, что они работают правильно. Помогите пожалуйста разобраться, мои силы и терпение на исходе.  Буду очень благодарен!!!
|
|
|
|
|
Jul 23 2014, 11:36
|

Частый гость
 
Группа: Свой
Сообщений: 167
Регистрация: 25-12-09
Из: Минск
Пользователь №: 54 460

|
Так сложно что то сказать, все завит от реализации, в общем случае процесс загрузки происходит так: 1. CPU подгружает в SRAM загрузчик (nboot) 2. Загрузчик инитит DDR, вычитывает и запускает eboot (размер eboot не всегда позволяет вычитать его в SRAM) 3. Eboot распаковывает nk.bin, причем образ он может найти либо на nor, nand, sd и ethernet в зависимости от сборки и параметров еboot
Для начала рекомендую проверить конфигурацию DDR, Также посмотрите где включается MMU (виртуальные адреса) они могут уже использоваться на стадии работы eboot, (надо смотреть исходники), но обычно MMU инициализирует eboot либо процесс oalexe в ядре. но возможно это нужно сделать в nboot.
|
|
|
|
|
Jul 24 2014, 09:46
|
Участник

Группа: Участник
Сообщений: 42
Регистрация: 6-08-13
Пользователь №: 77 820

|
К сожалению я всё это давно понял, я думал есть примерные решения. Моя плата похожа на большинство устройств, думал может быть кто нибудь имел опыт сборки WinCE, скажем для навигатора.
|
|
|
|
|
Jul 24 2014, 11:08
|

Частый гость
 
Группа: Свой
Сообщений: 167
Регистрация: 25-12-09
Из: Минск
Пользователь №: 54 460

|
Тут нужно искать человека кто работал с подобным BSP, например у меня есть работы с BSP от TI(AM3xxx), Freescale(Imx5x), Samsung (s5pv210) и тд Структура драйверов везде одинакова, а вот реализация oal, может быть разбросана по разным папкам (common platform, xxx_platform и тд), может где-то даже дублироваться, тоже самое для бутлоадера, здесь все зависит BSP. Понятно что суть везде одинаковая, поднять железо, распаковать образ wince...
У вас уарт свободный есть? В eboot обычно он инициализируется, если сообщений нет, можно попробовать следующие. 1. Проинитить уарт в nboot и в eboot плюнуть сообщение( либо дернуть GPIO), тем самым вы поймете, перепрыгивает ли ваш nboot на eboot 2. Дальше после каждой строки кода вставить отправку сообщения в уарт, тем самым можно выщемить место где подвисон... дальше по месту...
Сообщение отредактировал Integro - Jul 24 2014, 11:25
|
|
|
|
|
Jul 24 2014, 12:00
|
Участник

Группа: Участник
Сообщений: 42
Регистрация: 6-08-13
Пользователь №: 77 820

|
Уарт свободный есть, из nboot в eboot программа переходит, успешно плюёт в uart, что-то не так с самим eboot-ом, я подозреваю, что в Platform Builder-е он компилируется с какими-то не верными параметрами, возможно что-то с адресацией. Из ассемблера видно как nboot удачно грузит eboot из nand-flash в озу, затем передаёт ему управление eboot-у. С этим всё хорошо, инициализация происходит в nboot-те, а вот после передачи управления в eboot происходит затык. В одной из инструкций по условию перехода из цикла программа ссылается на странный адрес, в котором нет инструкций, там просто 0 и потом бесконечное шагание по этим нулям. Перепробовал кучу примеров - ни один из них не заработал.  Загрузка должна проходить следующим образом (как я думаю): при включении из блока 0 из nand загружается nboot в озу и запускается, затем из блока 4 с помощью nboot загружается (копируется) eboot в озу по определённому адресу, потом nboot передаёт управлением в озу по этому адресу и дальше в uart плюётся меню, которое появляется при условии нажатия кнопки "пробел" или начинается цикл копирования из nand имиджа wince (nk.bin) а уже потом, после копирования eboot передаёт управление вот этому nk.bin который ещё раз проводит какую-то там инициализацию, драйверы дисплея, usb и ещё там чего-то, а уже потом появляется логотип wince и рабочий стол на графическом дисплее. Есть готовое решение (исходники) с комментариями, с помощью этих комментариев можно разобраться, как изменить те или иные параметры для конкретного железа, но я не знаю где взять это решение эти исходники.
|
|
|
|
|
Jul 25 2014, 05:09
|
Участник

Группа: Участник
Сообщений: 42
Регистрация: 6-08-13
Пользователь №: 77 820

|
Цитата(Integro @ Jul 24 2014, 17:48)  А сейчас что используете? Я про исходники. CODE // // Copyright © Microsoft Corporation. All rights reserved. // // // Use of this source code is subject to the terms of the Microsoft end-user // license agreement (EULA) under which you licensed this SOFTWARE PRODUCT. // If you did not accept the terms of the EULA, you are not authorized to use // this source code. For a copy of the EULA, please see the LICENSE.RTF on your // install media. // /*++ THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. --*/ /************************************************ * NAME : 2410loader.C * * DESC : * * History : 2002.02.25 ver 0.0 * ************************************************/
#include <stdlib.h> #include <string.h> #include "option.h" #include "def.h" #include "2410addr.h" #include "2410lib.h" #include "2410slib.h" #include "2410addr.h" #include "nand.h" #include "loader.h"
#define SIGN_ON "\nWinCE NAND Boot v1.00\n" __DATE__ " " __TIME__ "\n"
// HMSEO : Please check UUID memory location from inc\drv_glob.h file. unsigned char * pbUUID = ((unsigned char *) (0x30030000 + 0x4608));
// // Globals // DWORD JumpAddr;
TOC toc; // made global because it's too big for our tiny stack
DWORD ReadEbootFromNand() { DWORD dwSectorsNeeded; DWORD dwSector, dwLength; // Start Sector & Length DWORD dwRAM, i;
////////////////////////////////////////////////// //Init Toc toc.id[0].dwVersion = (EBOOT_VERSION_MAJOR << 16) | EBOOT_VERSION_MINOR; toc.id[0].dwSignature = IMAGE_EBOOT_SIG; // memcpy(toc.id[0].ucString, "eboot.nb0", sizeof("eboot.nb0")+1); // NUll terminate toc.id[0].dwImageType = IMAGE_TYPE_RAMIMAGE; toc.id[0].dwLoadAddress = EBOOT_RAM_IMAGE_BASE; toc.id[0].dwJumpAddress = EBOOT_RAM_IMAGE_BASE; toc.id[0].dwTtlSectors = FILE_TO_SECTOR_SIZE(EBOOT_RAM_IMAGE_SIZE); // 1 contigious segment toc.id[0].sgList[0].dwSector = BLOCK_TO_SECTOR(EBOOT_BLOCK); toc.id[0].sgList[0].dwLength = toc.id[0].dwTtlSectors;
dwSectorsNeeded = toc.id[0].dwTtlSectors; //////////////////////////////////////////////// dwRAM = VIRTUAL_TO_PHYSICAL(toc.id[0].dwLoadAddress);
JumpAddr = toc.id[0].dwJumpAddress ? VIRTUAL_TO_PHYSICAL(toc.id[0].dwJumpAddress) : VIRTUAL_TO_PHYSICAL(toc.id[0].dwLoadAddress); i = 0; while (dwSectorsNeeded && i < MAX_SG_SECTORS) { dwSector = toc.id[0].sgList[i].dwSector; dwLength = toc.id[0].sgList[i].dwLength;
// read each sg segment while (dwLength) { if ( !FMD_ReadSector(dwSector, (LPBYTE)dwRAM, NULL, 1) ) { Uart_SendString("ERR_DISK_OP_FAIL2: "); Uart_SendDWORD(dwSector, TRUE); } dwSector++; dwLength--; dwRAM += SECTOR_SIZE; }
dwSectorsNeeded -= toc.id[0].sgList[i].dwLength; i++; } return ERR_SUCCESS; }
void Main(void) { DWORD err; MMU_EnableICache();
Uart_Init(); Uart_SendString(SIGN_ON);
NF_Init();
ReadEbootFromNand(); Launch(JumpAddr);
Uart_SendString("\nBoot ERROR:"); Uart_SendDWORD(err, TRUE); while (1); }
Это nboot - должен загрузить eboot в ОЗУ и передать ему управление, в принципе он это делает. Исходник eboot есть в Platform Builder-е но там вобще мрак, так куча настроек, описание, преобразование физ.адресов в виртуальные, какая-то загрузка-перезагрузка из одной области ОЗУ в другую область этой же ОЗУ, короче разобраться до конца с eboot-ом я так и не смог.
Сообщение отредактировал IgorKossak - Jul 25 2014, 08:26
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|