реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Драйвер NAND флешки для Linux
3.14
сообщение Sep 11 2007, 13:01
Сообщение #1


Их либе дих ...
******

Группа: СуперМодераторы
Сообщений: 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 (где)?


--------------------
Усы, борода и кеды - вот мои документы :)
Go to the top of the page
 
+Quote Post
vshemm
сообщение Sep 11 2007, 13:57
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
3.14
сообщение Sep 13 2007, 05:55
Сообщение #3


Их либе дих ...
******

Группа: СуперМодераторы
Сообщений: 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 партиции, а как добавить теперь четвертую не ломая старые?


--------------------
Усы, борода и кеды - вот мои документы :)
Go to the top of the page
 
+Quote Post
vshemm
сообщение Sep 13 2007, 13:49
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 167
Регистрация: 15-08-07
Пользователь №: 29 803



Вызовы add_mtd_partitions() с другим мастером (первый параметр) не разрушают ранее созданные партиции, ибо партиция - это и есть мтд устройство. Так что проблемы особой не вижу.
А нумерация партиций будет сквозная, т.е. /dev/mtd0-2 - первые три партиции на NOR, начиная с /dev/mtd3 будут идти партиции нанда.
К слову, мтд устройств может быть не более 16.
Go to the top of the page
 
+Quote Post
3.14
сообщение Sep 20 2007, 06:16
Сообщение #5


Их либе дих ...
******

Группа: СуперМодераторы
Сообщений: 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, то имеются области, которые всегда содержат "осмысленный" код, а есть обоасти с "плавающим" мусором.


--------------------
Усы, борода и кеды - вот мои документы :)
Go to the top of the page
 
+Quote Post
vshemm
сообщение Sep 20 2007, 09:19
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 167
Регистрация: 15-08-07
Пользователь №: 29 803



BBT действительно использует "запасную" область страницы, ее же использует и ECC. Только они разделяют эту область без проблем (см. в начале файла nand_base.c кучу структур nand_ecclayout, в которых указаны занятые под ECC байты).

По вопросу о сбойных блоках - сложно сказать, попробуйте полностью стереть нанд (вместе с "запасными" блоками) с помощью спец утилиты (ftp://ftp.infradead.org/pub/mtd-utils/mtd-utils-1.0.0.tar.gz). И вообще, лучше экспериментировасть с этими утилитами, а не с dd, т.к. mtd - это символьные устройства и имеют некоторые особенности smile.gif
Go to the top of the page
 
+Quote Post
3.14
сообщение Sep 20 2007, 10:26
Сообщение #7


Их либе дих ...
******

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



Утилиты сейчас попробую ...
Еще интересный факт откопал, на этапе записи в устройство (посредством dd) команда стирания блоков флешки не вызывается. Команда sync то же не влияет.

Собрать эти тулзы не могу smile.gif
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, ругается на структуры в либе ...


--------------------
Усы, борода и кеды - вот мои документы :)
Go to the top of the page
 
+Quote Post
vshemm
сообщение Sep 20 2007, 10:36
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 167
Регистрация: 15-08-07
Пользователь №: 29 803



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

Конечно, там стирание идет через ioctl а не write, поэтому dd и не работает как надо smile.gif
Go to the top of the page
 
+Quote Post
3.14
сообщение Sep 20 2007, 13:00
Сообщение #9


Их либе дих ...
******

Группа: СуперМодераторы
Сообщений: 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) их надо в ядро включать?


--------------------
Усы, борода и кеды - вот мои документы :)
Go to the top of the page
 
+Quote Post
vshemm
сообщение Sep 20 2007, 13:31
Сообщение #10


Частый гость
**

Группа: Участник
Сообщений: 167
Регистрация: 15-08-07
Пользователь №: 29 803



MTD_BLOCK и MTD_BLKDEVS нужно определить в конфиге (для сборки ядра), чтобы появились блочные аналоги символьным устройствам. И потом уж монтировать. Для jffs2 тоже нужны эти опции.

Под армы я не собирал эти утилиты, но, похоже, не хватает библиотеки libz (входит в состав zlib, который нужно внедрить в Вашу rootfs).

Сообщение отредактировал vshemm - Sep 20 2007, 13:40
Go to the top of the page
 
+Quote Post
KirillS
сообщение Sep 26 2007, 22:27
Сообщение #11


Участник
*

Группа: Новичок
Сообщений: 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.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd August 2025 - 05:40
Рейтинг@Mail.ru


Страница сгенерированна за 0.01468 секунд с 7
ELECTRONIX ©2004-2016