Bootstrap
Загрузчик первого уровня. Его задача: провести начальную инициализацию процессора, настроить управление памятью, скопировать кусок данных из указанного ему места из энергонезависимой памяти в ОЗУ и передать управление на этот адрес, считая, что он скопировал программу. Чаще всего в качестве этой программы используется загрузчик второго уровня U-Boot . Можно также сразу запускать ядро Linux .
Bootstrap также производит необходимую настройку интерфейса процессора:
• шину SPI или параметры доступа к Nandflash;
Используем оригинальный AT91Bootstrap1.14 от Atmel.
Конфигурация RAM
В файле /board/at91sam9260ek/at91sam9260ek.c в функции void hw_init(void) выставить размер шины данных RAM (если используется микросхема памяти с другой организацией, проверить и другие параметры):
/* Configure SDRAM Controller */
AT91C_SDRAMC_TXSR_8, /* Control Register */
(MASTER_CLOCK * 7)/1000000, /* Refresh Timer Register */
AT91C_SDRAMC_MD_SDRAM); /* SDRAM (no low power) */
В функции void sdramc_hw_init(void) проверить инициализацию шины.
writel( 0xFFFF0000 , AT91C_BASE_PIOC + PIO_ASR(0));
writel( 0xFFFF0000 , AT91C_BASE_PIOC + PIO_PDR(0));
writel( 0x00000000 , AT91C_BASE_PIOC + PIO_ASR(0));
writel( 0x00000000 , AT91C_BASE_PIOC + PIO_PDR(0));
Адаптация кода для загрузки из Dataflash
Указать используемую микросхему Dataflash: /driver/dataflash.c , функция df_init .
В файле /board/at91sam9260ek/dataflash/at91sam9260ek.h :
Выставить рабочую частоту и параметры PLL для кварца 12 MHz:
#define MASTER_CLOCK (200000000/2)
#define PLLA_SETTINGS 0x2031BF03
#define PLLB_SETTINGS 0x10073F01
Понизить при необходимости частоту SPI:
#define AT91C_SPI_CLK 4800000
Проверить адресацию микросхемы Dataflash:
#define AT91C_SPI_PCS_DATAFLASH AT91C_SPI_PCS1_DATAFLASH /* Boot on SPI NCS0 */
Проверить параметры копирования и запуска:
#define IMG_ADDRESS 0x8400
#define IMG_SIZE 0x33900
#define JUMP_ADDR 0x23F00000
IMG_ADDRESS: адрес загрузки U-Boot;
IMG_SIZE: размер копируемых данных, должен быть не меньше размера u-boot.bin ;
JUMP_ADDR: адрес старта U-Boot, см. /u-boot/board/at91sam9260ek/config.mk ;
Проверить используемую шину данных для Nandflash в /board/at91sam9260ek/at91sam9260ek.c функция void nandflash_hw_init(void) :
writel((AT91C_SMC_READMODE | AT91C_SMC_WRITEMODE | AT91C_SMC_NWAITM_NWAIT_DISABLE |
Адаптация кода для загрузки из Nandflash
В файле /board/at91sam9260ek/nandflash/ :
Выставить рабочую частоту и параметры PLL для кварца 12 MHz:
#define MASTER_CLOCK (200000000/2)
#define PLLA_SETTINGS 0x2031BF03
#define PLLB_SETTINGS 0x10073F01
Проверить параметры копирования и запуска:
#define IMG_ADDRESS 0x8400
#define IMG_SIZE 0x33900
#define JUMP_ADDR 0x23F00000
IMG_ADDRESS: адрес загрузки U-Boot ;
IMG_SIZE: размер копируемых данных, должен быть не меньше размера u-boot.bin ;
JUMP_ADDR: адрес старта U-Boot , см. /u-boot/board/at91sam9260ek/config.mk ;
Проверить используемую шину данных для Nandflash в /board/at91sam9260ek/at91sam9260ek.c функция void nandflash_hw_init(void) :
writel((AT91C_SMC_READMODE | AT91C_SMC_WRITEMODE | AT91C_SMC_NWAITM_NWAIT_DISABLE |
Выставить параметры используемой микросхемы NandFlash. Эти же параметры надо прописать в ядре Linux. Приведены параметры для k9k8g08u0a :
/* These timings are specific to K9K8G08U0A (samsung) MCK = 100 MHZ */
#define AT91C_SM_NWE_SETUP (1
#define AT91C_SM_NCS_WR_SETUP (0
#define AT91C_SM_NRD_SETUP (1
#define AT91C_SM_NCS_RD_SETUP (0
#define AT91C_SM_NWE_PULSE (2
#define AT91C_SM_NCS_WR_PULSE (3
#define AT91C_SM_NRD_PULSE (2
#define AT91C_SM_NCS_RD_PULSE (2
#define AT91C_SM_NWE_CYCLE (3
#define AT91C_SM_NRD_CYCLE (3
#define AT91C_SM_TDF (2
Сторожевой таймер
По умолчанию Bootstrap его выключает, после чего его уже не включить.
Для запрета его выключения в /board/at91sam9260ek/at91sam9260ek.c в функции void hw_init(void) убрать строчку:
// writel(AT91C_WDTC_WDDIS, AT91C_BASE_WDTC + WDTC_WDMR);
Компилятор
Используется не новее 2007q1-21. Причина: непонятное увеличение размера скомпилированного файла.
Компиляция
Сделать файл следующего содержания, положить его в папку /dataflash или /nandflash и запустить:
Результат сборки: board/at91sam9260ek/dataflash/dataflash_at91sam9260ek.bin .
размер файла не должен превышать 4096 байта.
Адаптация кода для прямого запуска ядра Linux
При этом метода запуска используется компрессированный образ, полученный после компиляции Linux : /
• KERNEL_PARAMS_ADDRESS задаёт адрес таблицы параметров ядра. Обычно это смещение 0x100 от начала физической памяти. Начало памяти отводится для хранения векторов и таблицы страниц.
• JUMP_ADDRESS задаёт адрес, куда будет помещён компрессированный образ Linux ( zImage ). Некомпрессированное ядро не превышает 4 Мб. Для того, чтобы оно могло распаковаться, после zImage должно оставаться минимум 4 Мб свободной памяти. Общепринятым значением является смещение 0x8000 от начала памяти.
Параметры копирования и адреса старта и местонахождения параметров ядра /board/at91sam9260ek/dataflash/at91sam9260ek.h :
#define IMG_ADDRESS 0x42000 /* Image Address in DataFlash */
#define IMG_SIZE 0x210000 /* Image Size in DataFlash */
#define MACH_TYPE 0x44B /* AT91SAM9260-EK */
#define MEM_START 0x20000000 /* RAM base address */
#define MEM_SIZE 0x4000000 /* RAM size 64M */
#define JUMP_ADDR 0x20008000 /* kernel image address in RAM */
#define KERNEL_PARAMS_ADDRESS 0x20000100 /* kernel parameters in RAM */
#define BOOT_ARG «mem=64M console=ttyS0,115200»
#define BOOT_ARG «mem=64M console=ttyS0,115200 ubi.mtd=rootfs»
#define BOOT_ARG «mem=64M console=ttyS0,115200 » \
«rootfstype=ubifs rootflags=bulk_read,chk_data_crc rw»
#define BOOT_ARG «mem=64M console=ttyS0,115200 » \
Добавить в main.c функции инициализации:
/* list of possible tags */
#define ATAG_NONE 0x00000000
#define ATAG_CORE 0x54410001
#define ATAG_MEM 0x54410002
#define ATAG_CMDLINE 0x54410009
/* structures for each atag */
unsigned int size; /* length of tag in words including this header */
unsigned int tag; /* tag type */
unsigned int flags;
unsigned int pagesize;
unsigned int rootdev;
unsigned int start;
struct atag_header hdr;
struct atag_core core;
struct atag_mem mem;
struct atag_cmdline cmdline;
#define tag_next( t ) ((struct atag *)((unsigned int *)( t ) + ( t ) -> hdr.size))
#define tag_size( type ) ((sizeof(struct atag_header) + sizeof(struct type)) >> 2)
static struct atag *params; /* used to point at the current tag */
static void setup_core_tag()
params = (struct atag *)KERNEL_PARAMS_ADDRESS; /* Initialise parameters to start at given address */
params->hdr.tag = ATAG_CORE; /* start with the core tag */
params->hdr.size = tag_size( atag_core ); /* size the tag */
params->u.core.flags = 0; /* optional, ensure read-only */
params->u.core.pagesize = 0; /* optional, systems pagesize (4k) */
params->u.core.rootdev = 0; /* zero root device (typicaly overidden from commandline )*/
params = tag_next( params ); /* move pointer to next tag */
static void setup_mem_tag()
params->hdr.tag = ATAG_MEM; /* Memory tag */
params->hdr.size = tag_size( atag_mem ); /* size tag */
params->u.mem.start = RAM_BASE; /* start of physical memory */
params->u.mem.size = RAM_SIZE; /* memory size */
params = tag_next( params ); /* move pointer to next tag */
static void setup_cmdline_tag()
char* line = BOOT_ARG «\0»; /* place commandline into tag */
for( ; *(line + linelen) != 0; linelen++ ) < params->u.cmdline.cmdline[linelen] = *(line + linelen);>
if( !linelen ) /* do not insert a tag for an empty string */
params->hdr.tag = ATAG_CMDLINE; /* Commandline tag */
params->hdr.size = (sizeof(struct atag_header) + linelen + 1 + 4) >> 2;
params = tag_next(params); /* move pointer to next tag */
static void setup_end_tag()
params->hdr.tag = ATAG_NONE; /* Empty tag ends list */
params->hdr.size = 0; /* zero length */
Добавить в main.c функцию подготовки процессора к старту (запретить прерывания, выключить кэш данных):
static int cleanup_before_linux()
unsigned long i,old,temp;
__asm__ __volatile__(«mrs %0, cpsr\n»
asm («mrc p15, 0, %0, c1, c0, 0″:»=r» (i));
asm («mcr p15, 0, %0, c1, c0, 0″: :»r» (i));
asm («mcr p15, 0, %0, c7, c7, 0″: :»r» (i));
Заменить запуск приложения в main.c на вызовы функций:
setup_core_tag(); /* standard core tag */
setup_cmdline_tag(); /* commandline setting root device */
setup_end_tag(); /* end of tags */
void (*theKernel)(int zero, int arch, unsigned int params);
theKernel = (void (*)(int, int, unsigned int))JUMP_ADDR;
/* Jump to kernel with register set*/
theKernel( 0, MACH_TYPE, KERNEL_PARAMS_ADDRESS ); /* R0=0,R1=MACH_TYPE,R2=KERNEL_PARAMS_ADDRESS */
Bootstrap – Настройка окружающей среды
Попробуйте электронный вариант Bootstrap
Очень легко установить и начать использовать Bootstrap. В этой главе будет рассказано, как загрузить и установить Bootstrap. Мы также обсудим файловую структуру Bootstrap, и продемонстрируем его использование на примере.
Скачивание Bootstrap
Вы можете скачать последнюю версию Bootstrap на сайте http://getbootstrap.com/. При нажатии на эту ссылку, вы можете увидеть экран, как показано ниже:
При нажатии на кнопку DownloadBootstrap, страница перенаправит на другую страницу. Здесь вы можете увидеть три кнопки:
- Download Bootstrap – Щелкнув по этой кнопке, вы можете загрузить скомпилированную и уменьшенную версии Bootstrap CSS, JavaScript и шрифты. Нет документации или оригинальных исходных файлов кода не включены.
- Download Source – При нажатии на нее, вы можете получить последний Bootstrap LESS и исходный код JavaScript непосредственно из GitHub.
- Download Sass – При нажатии, вы можете получить последнюю Bootstrap LESS, Sass для легкого включения в Rails, Compass, или Sass только для проектов.
Если вы работаете с неоткомпилированным исходным кодом Bootstrap, вы должны скомпилировать файлы LESS для создания используемых CSS – файлов. Для компиляции LESS файлов в CSS, Bootstrap официально поддерживает только Recess, CSS Hinter Twitter, основанный на less.js.
Для лучшего понимания и простоты использования, мы будем использовать готовую версию Bootstrap на протяжении всего урока. По мере того как создаются файлы и вам не придется беспокоиться каждый раз об уменьшении, включая отдельные файлы для индивидуальной функциональности. На момент написания этой обучающей программы была загружена последняя версия (Bootstrap 3).
Файловая структура
Скомпилированный Bootstrap
После того, как загрузятся скомпилированные версии Bootstrap, извлеките файл ZIP, и вы увидите следующую структуру файлов/каталогов:
Как вы можете видеть, компилируются CSS и JS (bootstrap. *), а также скомпилированные и уменьшенные CSS и JS (bootstrap.min. *). Шрифты от Glyphicons включены, так как это дополнительная тема Bootstrap.
Исходный код Bootstrap
Если вы загрузили исходный код Bootstrap, то структура файла будет выглядеть следующим образом:
- Файлы less/, js/, и fonts/ являются исходным кодом для Bootstrap CSS, JS, и значки шрифтов (соответственно).
- Папка dist/ включает в себя все перечисленные в разделе загрузки скомпилированного выше.
- docs-assets/, examples/, и все * .html файлы документации Bootstrap.
Шаблон HTML
Базовый шаблон HTML с использованием Bootstrap будет выглядеть следующим образом:
Здесь вы можете увидеть файлы jquery.js , bootstrap.min.js и bootstrap.min.css, которые включены, чтобы сделать нормальный HTM файл шаблона Bootstrapped. Просто убедитесь, чтобы включить библиотеку JQuery, прежде чем включать библиотеку Bootstrap.
Более подробная информация о каждом из элементов фрагмента кода выше будет обсуждаться в главе Bootstrap обзор CSS.
Пример
Теперь давайте попробуем пример использования шаблона выше.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.