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

 
 
 
Reply to this topicStart new topic
> Помогите собрать Wince 4.2 Net для ядра s3c2410, нужна помощь
TrueCyrix
сообщение Jul 23 2014, 09:10
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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 полно, но я не уверен, что они работают правильно. Помогите пожалуйста разобраться, мои силы и терпение на исходе. wacko.gif Буду очень благодарен!!!
Go to the top of the page
 
+Quote Post
Integro
сообщение Jul 23 2014, 11:36
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
TrueCyrix
сообщение Jul 24 2014, 09:46
Сообщение #3


Участник
*

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



К сожалению я всё это давно понял, я думал есть примерные решения. Моя плата похожа на большинство устройств, думал может быть кто нибудь имел опыт сборки WinCE, скажем для навигатора.
Go to the top of the page
 
+Quote Post
Integro
сообщение Jul 24 2014, 11:08
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
TrueCyrix
сообщение Jul 24 2014, 12:00
Сообщение #5


Участник
*

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





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

Есть готовое решение (исходники) с комментариями, с помощью этих комментариев можно разобраться, как изменить те или иные параметры для конкретного железа, но я не знаю где взять это решение эти исходники. sad.gif
Go to the top of the page
 
+Quote Post
Integro
сообщение Jul 24 2014, 13:48
Сообщение #6


Частый гость
**

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



А сейчас что используете? Я про исходники.

Сообщение отредактировал Integro - Jul 24 2014, 13:51
Go to the top of the page
 
+Quote Post
TrueCyrix
сообщение Jul 25 2014, 05:09
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 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] - для короткого!!!
Go to the top of the page
 
+Quote Post
TrueCyrix
сообщение Jul 25 2014, 09:01
Сообщение #8


Участник
*

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



Пытался загрузить u-boot вместо eboot - безуспешно crying.gif
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 20:26
Рейтинг@Mail.ru


Страница сгенерированна за 0.01431 секунд с 7
ELECTRONIX ©2004-2016