4.5.4 Пример драйвера связи для NOR Flash

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

Давайте рассмотрим пример платы на основе MIPS с двумя микросхемами флеш-памяти, имеющими адреса, показанные на Рисунке 4.6.

 

Рисунок 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");

 

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