|
|
  |
Драйвер NAND флешки для Linux |
|
|
|
Sep 11 2007, 13:01
|

Их либе дих ...
     
Группа: СуперМодераторы
Сообщений: 2 010
Регистрация: 6-09-04
Из: Russia, Izhevsk
Пользователь №: 609

|
Нужно написать/адаптировать сабжевый драйвер для PXA270. Покопавшись в потрохах драйверов NAND устройств, пришел к выводу что сие естьмногослойная структура ... в простейшем случае (драйвер TOTO) объявляется область чтения записи IO и описываются функции управления пинами CE,ALE,CLE. Моя флешка подключена: 1) шина данных на обшей шине данных 2) WE подключен к глобальному стробу записи 3) RE плдключен к глобальному стробу чтения OE 4) CE, ALE, CLE подключены к IO Взял за основу этот самый TOTO драйвер, объявил для области NAND неиспользуемый блок SRAM (в __init функции модуля): Код ... /* Set address of NAND IO lines */ this->IO_ADDR_R = my_io_base; // переменная, при объявлении присваивается 0х800000 this->IO_ADDR_W = my_io_base; ... Далее подправил функцию управления CE,ALE,CLE. Но при инициализации драйвера ядро говорит: Цитата NAND flash driver init ... Unable to handle kernel paging request at virtual address 00800000 pgd = c0004000 [00800000] *pgd=00000000 Internal error: Oops: 8f5 [#1] Т.е. мне где то надо еще ядру сказать о существовании адреса 0х800000 (где)?
--------------------
Усы, борода и кеды - вот мои документы :)
|
|
|
|
|
Sep 11 2007, 13:57
|
Частый гость
 
Группа: Участник
Сообщений: 167
Регистрация: 15-08-07
Пользователь №: 29 803

|
0х800000 - это физический адрес на шине, для доступа из ядра его нужно преобразовать в так называемый kernel virtual address. Для этого есть функция ioremap() (ioremap_nocache() для отключения кеширования на этот участок памяти). Кстати, не забудьте захватить этот участок памяти [физический] с помощью request_resource(). З.Ы. http://os.inf.tu-dresden.de/l4env/doc/html...__mod__res.html здесь описание этой и нескольких других полезных функций. З.Ы.Ы. Делать это все надо в инициализации драйвера (т.е. вскоре после вывода сообщения "NAND flash driver init ...").
Сообщение отредактировал vshemm - Sep 11 2007, 13:59
|
|
|
|
|
Sep 13 2007, 05:55
|

Их либе дих ...
     
Группа: СуперМодераторы
Сообщений: 2 010
Регистрация: 6-09-04
Из: Russia, Izhevsk
Пользователь №: 609

|
Ок, это уже позади ... Сейчас не могу понять порядок создания MTD партиций ... У всех драйверов /drivers/mtd/nand/* , таблицы партиций прописываются в драйвере NAND флешки и там же активируются (add_mtd_partitions()). В моем случае, имеется еще NOR флешка, которая тоже разбита на 3 MTD партиции, все объявления, инициализация, активация, сканирование, происходят в /drivers/mtd/nand/maps/colibri.c . Т.е. на момент запуска драйвера NAND я уже имею три MTD партиции, а как добавить теперь четвертую не ломая старые?
--------------------
Усы, борода и кеды - вот мои документы :)
|
|
|
|
|
Sep 20 2007, 06:16
|

Их либе дих ...
     
Группа: СуперМодераторы
Сообщений: 2 010
Регистрация: 6-09-04
Из: Russia, Izhevsk
Пользователь №: 609

|
Уперся ... Итак, у меня K9K8G08U0A (1Gx8). Глюки начались на этапе идентификации ее драйвером более высокого уровня, пока не добавил команду сброса устройства. Сейчас драйвер правильно определяет, и вроде как "лично знает" этот чип, выводя сообщение: Цитата NAND device: Manufacturer ID: 0xec, Chip ID: 0xd3 (Samsung NAND 1GiB 3,3V 8-bit) Размер страницы, размер "запасной" зоны, размер блока и объем всего устройства определяются драйвером правильно. Но, далее на этапе сканирования сбойных блоков, выводится сообщение о найденых ~70 сбойных блоков. Причем их количество первоначально было меньше, пока я не поэкспериментировал с записью нулей во все устройство (dd if=/dev/zero of=/dev/mtd3 bs=2048 count=524288). Не понятно, сбойный блок маркируется первым не 0хFF байтом в "запасной" области страницы, хотя в то же время она используется ECC ... ??? Далее, я попробовал, перед сканированием сбойных блоков, стереть все блоки устройства, как ни сранно, меньше сбойных блоков не стало. Еще хуже то что запись в устройство иногда завершается ошибкой, читается то же с глюками. Например если читать dd if=/dev/ьев3 of=/tmp/data.hex bs=2048 count=30, то имеются области, которые всегда содержат "осмысленный" код, а есть обоасти с "плавающим" мусором.
--------------------
Усы, борода и кеды - вот мои документы :)
|
|
|
|
|
Sep 20 2007, 10:26
|

Их либе дих ...
     
Группа: СуперМодераторы
Сообщений: 2 010
Регистрация: 6-09-04
Из: Russia, Izhevsk
Пользователь №: 609

|
Утилиты сейчас попробую ... Еще интересный факт откопал, на этапе записи в устройство (посредством dd) команда стирания блоков флешки не вызывается. Команда sync то же не влияет. Собрать эти тулзы не могу  glib у меня лежит в /usr/local/arm-linux/arm-linux/lib ядро лежит в /home/pi/linux/linux-2.6.12.4-col2 Подправил makefile: Цитата SBINDIR=/usr/sbin MANDIR=/usr/man INCLUDEDIR=/usr/local/arm-linux/arm-linux/include #здесь поправил CROSS=arm-linux- LDFLAGS := -L/usr/local/arm-linux/arm-linux/lib #это добавил CC := $(CROSS)gcc #CFLAGS := -I./include -O2 -Wall #это заменил следующей строчкой CFLAGS := -I/home/pi/src/linux-2.6.12.4-col2/include -O2 -Wall ... С таким makefile не собирается, если оставить как было, то не находила заголовочник zlib.h (хотя чать утилит собирает, flash_erase и flash_eraseall), если его тупо скопировать из заголовочников ядра или glib, ругается на структуры в либе ...
--------------------
Усы, борода и кеды - вот мои документы :)
|
|
|
|
|
Sep 20 2007, 10:36
|
Частый гость
 
Группа: Участник
Сообщений: 167
Регистрация: 15-08-07
Пользователь №: 29 803

|
Цитата(3.14 @ Sep 20 2007, 14:26)  Утилиты сейчас попробую ... Еще интересный факт откопал, на этапе записи в устройство (посредством dd) команда стирания блоков флешки не вызывается. Команда sync то же не влияет. Конечно, там стирание идет через ioctl а не write, поэтому dd и не работает как надо
|
|
|
|
|
Sep 20 2007, 13:00
|

Их либе дих ...
     
Группа: СуперМодераторы
Сообщений: 2 010
Регистрация: 6-09-04
Из: Russia, Izhevsk
Пользователь №: 609

|
Ошибка возникала при компиляции compr_zlib.c файла, в частности на строки: Цитата strm.zalloc = (void *)0; strm.zfree = (void *)0; Объявления zalloc и zfree в структуре заголовочника отсутствуют, я их просто закоментарил, теперь имею следующую ошибку сборки: Цитата arm-linux-gcc -L/usr/local/arm-linux/arm-linux/lib -o mkfs.jffs2 crc32.o compr_rtime.o mkfs.jffs2.o compr_zlib.o compr.o -lz /usr/local/arm-linux/lib/gcc-lib/arm-linux/3.3.2/../../../../arm-linux/bin/ld: cannot find -lz collect2: ld returned 1 exit status make: *** [mkfs.jffs2] Ошибка 1 [pi@linuxServer mtd-utils-1.0.0]$ ??? Еще вопрос общкго характера, а как тогда монтировать MTD устройства, если они символьшые? В опциях ядра есть "фичи" MTD emulation using block device и MTD using block device (rewrite) их надо в ядро включать?
--------------------
Усы, борода и кеды - вот мои документы :)
|
|
|
|
|
Sep 26 2007, 22:27
|
Участник

Группа: Новичок
Сообщений: 44
Регистрация: 10-10-06
Пользователь №: 21 161

|
Цитата(vshemm @ Sep 20 2007, 15:31)  MTD_BLOCK и MTD_BLKDEVS нужно определить в конфиге (для сборки ядра), чтобы появились блочные аналоги символьным устройствам. И потом уж монтировать. Для jffs2 тоже нужны эти опции.
Под армы я не собирал эти утилиты, но, похоже, не хватает библиотеки libz (входит в состав zlib, который нужно внедрить в Вашу rootfs). zlib, которая строит ibz.a берётся вот отсюда Она успешно строится и для MicroBlaze, значит для ARM и подавно.
--------------------
Some days you eat the bear. Some days the bear eats you.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|