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.

 

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