4.5.4 Пример драйвера связи для NOR Flash |
Предыдущая Содержание Следующая |
Давайте рассмотрим пример платы на основе MIPS с двумя микросхемами флеш-памяти, имеющими адреса, показанные на Рисунке 4.6.
Рисунок 4.6 Карта флеш-памяти.
Ниже приведены сведения об использовании этих микросхем флеш-памяти.
▪Первая микросхема флеш-памяти привязана к адресу 0xBFC00000 и имеет размер 4 Мб. Первая микросхема является загрузочной памятью и имеет два региона стирания. Первый регион стирания имеет восемь секторов, каждый из которых имеет размер 8 Кб; эта 64 Кб область используется для хранения загрузчика и параметров конфигурации загрузки. Вторая область стирания имеет секторы размером 64 Кб и полностью используется для хранения файловой системы JFFS2. ▪Вторая микросхема флеш-памяти привязана к адресу 0xBF000000 и тоже имеет размер 4 Мб. Вторая микросхема содержит только один регион стирания, а все сектора имеют размер 64 Кб. Эта флеш-память полностью используется для хранения файловой системы JFFS2.
Требованием к нашему драйверу связи с флеш-памятью является разделение первой флеш-памяти, стартующей с адреса 0xBFC00000, на две части. Первый раздел размером 64 Кб будет загрузочным разделом. Второй раздел будет объединён с флеш-памятью, стартующей с адреса 0xBF000000, для хранения файловой системы JFFS2.
Давайте начнём с заголовочных файлов и определений.
/* mtd-bsp.c */ #include <linux/config.h> #include <linux/module.h> #include <linux/types.h> #include <linux/kernel.h> #include <asm/io.h> #include <linux/mtd/mtd.h> #include <linux/mtd/map.h> #include <linux/mtd/cfi.h> #include <linux/mtd/partitions.h> #include <linux/mtd/concat.h>
#define WINDOW_ADDR_0 0xBFC00000 #define WINDOW_SIZE_0 0x00400000 #define WINDOW_ADDR_1 0xBF000000 #define WINDOW_SIZE_1 0x00400000
map_info содержит информацию о начальном адресе (физическом) каждой микросхемы, объёме памяти и размере шины. Они используются процедурами проверки подключения микросхемы.
static struct map_info dummy_mips_map[2] = { { .name = "DUMMY boot flash", .phys = WINDOW_ADDR_0, .size = WINDOW_SIZE_0, .bankwidth = 4, }, { .name = "Dummy non boot flash", .phys = WINDOW_ADDR_1, .size = WINDOW_SIZE_1, .bankwidth = 4, } };
Следующая структура используется для создания разделов на загрузочной флеш-памяти.
static struct mtd_partition boot_flash_partitions [] = { { .name = "BOOT", .offset = 0, .size = 0x00010000, }, { .name = "JFFS2", .offset = 0x00010000, .size = 0x003f0000, }, };
/* * Следующая структура содержит указатели mtd_info для * разделов, которые будут объединены */ static struct mtd_info *concat_partitions[2];
/* * Следующая структура содержит указатели на структуры mtd_info для * каждого из устройств флеш-памяти */ static struct mtd_info * mymtd[2], *concat_mtd;
Основной функцией является функция init_dummy_mips_mtd_bsp(). Её реализацию можно увидеть в Распечатке 4.6. Функция делает следующее:
▪Проверяет наличие флеш-памяти по адресу 0xBFC00000 и заполняет структуру MTD для этой флеш-памяти в mymtd[0] ▪Проверяет наличие флеш-памяти по адресу 0xBF000000 и заполняет структуру MTD для этой флеш-памяти в mymtd[1] ▪Создаёт два раздела на флеш-памяти с начальным адресом 0xBFC00000 ▪Объединяет второй раздел с флеш-памятью, которая стартует с адреса 0xBF000000, а затем создаёт новое устройство с помощью вызова функции add_mtd_device()
Завершает всё функция очистки:
static void __exit cleanup_dummy_mips_mtd_bsp(void) { mtd_concat_destroy(concat_mtd); del_mtd_partitions(mymtd[0]); map_destroy(mymtd[0]); map_destroy(mymtd[1]); }
module_init (init_dummy_mips_mtd_bsp); module_exit (cleanup_dummy_mips_mtd_bsp); MODULE_LICENSE ("GPL"); MODULE_AUTHOR ("Embedded Linux book"); MODULE_DESCRIPTION ("Sample Mapping driver");
|
Предыдущая Содержание Следующая |