The website "dmilvdv.narod.ru." is not registered with uCoz.
If you are absolutely sure your website must be here,
please contact our Support Team.
If you were searching for something on the Internet and ended up here, try again:

About uCoz web-service

Community

Legal information

Linux

Linux

Предыдущая  Содержание  Следующая  V*D*V

Исходники ядра:

http://kernel.org

 

Используем версию 2.6.33.

 

Патч от Atmel для ядра 2.6.31 и

патч от Atmel для ядра 2.6.33 с

http://maxim.org.za/sam9.html

 

Патч для переноса сетевых буферов во внутреннюю память и уменьшения частоты появления сообщения: 44.2.3.1 TX underrun.

 

Патч для отмены регистрации watchdog, если он был ранее запрещён.

Адаптация кода

аrch/arm/mach-at91/board-sam9260-ek.c

Выставить частоту кварца 12 МГц.

Выключить USART-ы, оставить только DBGU.

 

static void __init ek_map_io(void)

{

 /* Initialize processor: 18.432 MHz crystal */

//        at91sam9260_initialize(18432000);

 /* Initialize processor: 12.000 MHz crystal */

 at91sam9260_initialize(12000000);

 

 /* DGBU on ttyS0. (Rx & Tx only) */

 at91_register_uart(0, 0, 0);

#if 0

 /* USART0 on ttyS1. (Rx, Tx, CTS, RTS, DTR, DSR, DCD, RI) */

 at91_register_uart(AT91SAM9260_ID_US0, 1, ATMEL_UART_CTS | ATMEL_UART_RTS

                    | ATMEL_UART_DTR | ATMEL_UART_DSR | ATMEL_UART_DCD

                    | ATMEL_UART_RI);

 

 /* USART1 on ttyS2. (Rx, Tx, RTS, CTS) */

 at91_register_uart(AT91SAM9260_ID_US1, 2, ATMEL_UART_CTS | ATMEL_UART_RTS);

#endif

 /* set serial console to ttyS0 (ie, DBGU) */

 at91_set_serial_console(0);

}

 

Отключить привязку ETH_IRQ:

 

/*

 * MACB Ethernet device

 */

static struct at91_eth_data __initdata ek_macb_data = {

 //.phy_irq_pin        = AT91_PIN_PA7,

 .is_rmii        = 1,

};

 

Выключить светодиоды и кнопки.

 

static void __init ek_board_init(void)

{

 ...

#if 0

 /* LEDs */

 at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds));

 /* Push Buttons */

 ek_add_device_buttons();

#endif

}

 

Проверить подключение MMC карты.

Отключить выключение SPI-устройств при использовании MMC карты и проверить доступ к Dataflash.

 

/*

 * SPI devices.

 */

static struct spi_board_info ek_spi_devices[] = {

#if 0//!defined(CONFIG_MMC_AT91)

 {        /* DataFlash chip */

         .modalias        = "mtd_dataflash",

         .chip_select        = 1,

         .max_speed_hz        = 15 * 1000 * 1000,

         .bus_num        = 0,

 },

#if 0//defined(CONFIG_MTD_AT91_DATAFLASH_CARD)

 {        /* DataFlash card */

         .modalias        = "mtd_dataflash",

         .chip_select        = 0,

         .max_speed_hz        = 15 * 1000 * 1000,

         .bus_num        = 0,

 },

#endif

#endif

...

};

 

Проверить и при необходимости скорректировать параметры доступа к Nandflash. См. Расчёт таймингов Nandflash:

 

static struct sam9_smc_config __initdata ek_nand_smc_config = {

 .ncs_read_setup                = 0,

 .nrd_setup                = 1,

 .ncs_write_setup        = 0,

 .nwe_setup                = 1,

 

 .ncs_read_pulse                = 3,

 .nrd_pulse                = 3,

 .ncs_write_pulse        = 3,

 .nwe_pulse                = 3,

 

 .read_cycle                = 5,

 .write_cycle                = 5,

 

 .mode                        = AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE,

 .tdf_cycles                = 2,

};

 

Задать расположение файловой системы и имена разделов.

 

/*

 * NAND flash

 */

static struct mtd_partition __initdata ek_nand_partition[] = {

 {

         .name        = "Bootstrap",

         .offset        = 0,

         .size        = SZ_4M,

 },

 {

         .name        = "rootfs",

         .offset        = MTDPART_OFS_NXTBLK,

         .size        = MTDPART_SIZ_FULL,

 },

};

 

Arch/arm/mach-at91/at91sam9260_devices.c

Так как в описании платы устройства на шине SPI не описаны (структура spi_board_info), чтобы отдельно не включать контроллеры, включаем принудительную инициализацию spi0 и spi1:

 

void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices)

short enable_spi0 = 1;

short enable_spi1 = 1;

 

drivers/spi/atmel_spi.c

 

Увеличить количество SPI устройств:

 

static int __init atmel_spi_probe(struct platform_device *pdev)

master->num_chipselect = 16;

Добавление видеодрайвера с поддержкой кадрового буфера

Скопировать файлы драйвера дисплея в /linux-2.6.xx/drivers/video/.

Добавить в файл /linux-2.6.xx/drivers/video/Makefile компиляцию драйвера после  строки # Hardware specific drivers go first:

 

obj-$(CONFIG_FB_MYDISPLAY) += mydisplay.o

 

Отредактировать файл /linux-2.6.xx/drivers/video/Kconfig, добавив свой драйвер, например, после config FB_ATMEL:

 

config FB_MYDISPLAY

 tristate "my display Framebuffer support"

 depends on FB && ARCH_AT91SAM9260

 select FB_SYS_FILLRECT

 select FB_SYS_COPYAREA

 select FB_SYS_IMAGEBLIT

 default y

 help

   This is a framebuffer device for my display.

 

Вместо FB_SYS_XXX могут быть выбраны FB_CFB_XXX, в зависимости от функций, используемых кодом драйвера.

 

Патч для добавления драйвера mydisplay в Makefile и Kconfig.

Логотип при загрузке

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

При старте он появляется на экране примерно на 7-ой секунде.

 

Изображение должно быть в редко используемом формате pbm (для чёрно-белых изображений) или ppm (для цветных изображений).

Размер изображения должен быть равен 80 x 80.

Как подключить изображение другого размера - неизвестно.

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

 

Понадобятся утилиты для конвертации формата изображений netpbm.

Для Linux: http://netpbm.sourceforge.net/

Для Windows: http://gnuwin32.sourceforge.net/packages/netpbm.htm

Конвертация:

 

bmptopnm mylogo.bmp > mylogo.pnm

pnmtopnm -plain mylogo.pnm > mylogo.pbm

 

Если при компиляции ядро даёт ошибку "too many colors", можно попробовать сделать так:

 

bmptopnm mylogo.bmp > mylogo.pn

ppmquant -fs 223 mylogo.pnm > mylogo.pnm

pnmtopnm -plain mylogo.pnm > mylogo.pbm

 

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

 

Замена существующего:

Для чёрно-белого заменить на своё изображение файл /linux-2.6.xx/drivers/video/logo/logo_linux_mono.pbm.

Для цветного заменить на своё изображение файл /linux-2.6.xx/drivers/video/logo/logo_linux_clut224.ppm.

 

Добавление своего:

Добавить в файл /linux-2.6.xx/drivers/video/logo/Kconfig:

 

config LOGO_MYLOGO

 bool "My logo"

 default y

 

Добавить в файл /linux-2.6.xx/drivers/video/logo/logo.c переменную:

 

extern const struct linux_logo my_logo;

 

в секцию с выбором верного числа цветов:

 

#ifdef CONFIG_LOGO_MYLOGO

         /* My logo */

         logo = &my_logo;

#endif

 

Добавить в /linux-2.6.xx/drivers/video/logo/Makefile:

 

obj-$(CONFIG_MYLOGO) += my_logo.o

 

Настройка

Используем готовый кофигурационный файл. В конфиге указан путь к папке для initramfs, выключить, или скорректировать при необходимости.

 

Для настройки конфигурации сделать файл следующего содержания:

 

#!/bin/sh

 

make ARCH=arm oldconfig

make ARCH=arm menuconfig

 

 

При первой настройке строка запуска:

 

make ARCH=arm menuconfig

 

Особенности настройки:

Включить поддержку EABI.

Включить опцию переноса буферов Ethernet в быструю память, если используется этот патч.
Device drivers -> Network device support -> Ethernet (10 or 100Mbit) -> Atmel MACB support -> Use internal SRAM for EMAC (Ethernet) transmit buffers;

Проверить строку запуска в Boot options (тип файловой системы, объём памяти);

Проверить наличие включённой поддержки необходимых файловых систем;

Выключить поддержку Dataflash Card;

Включить поддержку Device Drivers -> Input device support -> Event interface для поддержки ввода с помощью rotary encoder;

Включить поддержку Device Drivers -> Graphics support -> Support for frame buffer devices для поддержки вывода графики на встроенный дисплей через кадровый буфер;

Включить поддержку Device Drivers -> Graphics support -> Console display driver support -> Framebuffer Console support, там же включить Select compiled-in fonts и выбрать шрифт, если на дисплей необходим консольный вывод, например, при загрузке ядра;

Включить поддержку Device Drivers -> Misc devices -> Device driver for Atmel SSC periferal для поддержки интерфейса SSC;

Включить поддержку Device Drivers -> Sound card support -> Advanced Linux Sound Architecture для поддержки вывода звука через интерфейс ALSA;

Включить поддержку Device Drivers -> Sound card support -> Advanced Linux Sound Architecture -> OSS PCM (digital audio) API чтобы при сборке модуля звуковой карты были доступны функции из заголовка <sound/pcm.h>;
судя по всему, в конфигураторе ядра имеется ошибка, потому что при отключенной опции эмуляции OSS одновременно отключаются опции CONFIG_SND_TIMER и CONFIG_SND_PCM, необходимые для сборки модулей ALSA.

Если используется initramfs, после указания пути включить компрессию;

Опция Preemptive kernel позволяет вытеснение процесса, делающего системный вызов, что переводит ядро в режим мягкого реального времени. Включить, если есть такая необходимость.

Компиляция

Используем кросс-компилятор, собранный Buildroot.

Для того, чтобы обернуть исполняемый файл в понятный для U-Boot формат, необходимо после сборки обработать результат утилитой mkimage.

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

 

Перед компиляцией необходимо скопировать файл mkimage из u-boot/tools/mkimage в каталог компилятора Buildroot.

Для Buildroot-2009.08:

buildroot-2009.08/build_arm/staging_dir/usr/bin/.

Для Buildroot-2010.05:

buildroot-2010.05/output/staging/usr/bin/.

 

Скрипт для компиляции ядра (зипуем сами, чтобы уменьшить размер):

 

#!/bin/sh

 

#export PATH=/<path>/buildroot-2009.08/build_arm/staging_dir/usr/bin:${PATH}

export PATH=/<path>/buildroot-2010.05/output/staging/usr/bin:${PATH}

#export PATH=/<path>/buildroot-2011.05/output/host/usr/bin:${PATH}

 

make ARCH=arm clean

#make ARCH=arm CROSS_COMPILE=arm-linux-uclibcgnueabi-

make ARCH=arm CROSS_COMPILE=arm-unknown-linux-uclibcgnueabi-

 

echo == Compiled ==

 

rm zLinux.bin

rm linux.bin

rm zlinux_2.6.bin

 

#arm-linux-uclibcgnueabi-objcopy -O binary -R .note -R .comment -R .note.gnu.build-id -S vmlinux linux.bin

arm-unknown-linux-uclibcgnueabi-objcopy -O binary -R .note -R .comment -R .note.gnu.build-id -S vmlinux linux.bin

gzip -c -9 linux.bin > zLinux.bin

mkimage -A arm -O linux -T kernel -C gzip -a 0x20008000 -e 0x20008000 -n "Linux Kernel Image" -d zLinux.bin zlinux_2.6.bin 

 

Результат сборки в формате для U-Boot: zLinux_2.x.bin ~1.3 Мб, время сборки ~5 мин.

Ядро Linux: /<путь к Linux>/arch/arm/boot/zImage ~1.5 - 2Мб.

 

Внимание!

размер файла не должен превышать параметр, указанный в U-Boot для команды cp.b (0x210000=2.162.688):

CONFIG_BOOTCOMMAND        "cp.b 0xD0042000 0x22000000 0x210000; bootm"

 

или, если используется запуск ядра из Bootstap, размер, заданный IMG_SIZE.

 

Предыдущая  Содержание  Следующая