Linux |
Предыдущая Содержание Следующая |
|
Исходники ядра:
Используем версию 2.6.33.
Патч от Atmel для ядра 2.6.31 и патч от Atmel для ядра 2.6.33 с
Патч для переноса сетевых буферов во внутреннюю память и уменьшения частоты появления сообщения: 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 в быструю память, если используется этот патч. •Проверить строку запуска в 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>; •Если используется 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Мб.
| ||
Предыдущая Содержание Следующая |