>одна из моих карточек MMC по прежнему не монтируется после reset - проблемы с инициализацией.
Вы оптимист :) Иногда бывает что наоборот откат надо делать чтобы снова что-то заработало :) Поэтому я обычно не спешу обновлять ядро. С sdhc не грузился - только вручную монтировал - вроде проблем не было, помоему и после reset с кнопки но точней уже не помню. У меня самые лучшие результаты в скорости показала mmc 512 Мб kingston - с ней сейчас и работаю. Помучался с debian и fedora - не понравилось, настолько там все запутано... В новогодние праздники скорей всего займусь портированием своего любимого дистрибутива на arm. Проще и гибче него я еще ничего не встречал :)
а как автоматически монтировать SD-карту? Ну типа - сунул в разъем, обождал 3 сек - и нате: /mnt/mmc. (без mount_mmc/unmount_mmc)
Понимаю, что вопрос т.н. - "из разряда". Но хоть направление одним пальцем ткните, а дальше я уж сам:)
В busybox есть некая упрощенная замена udev - называется mdev. Сам недавно ее взял на заметку. В исходниках busybox есть описание, в том числе как писать для него правила. Вот тут помоему уже с mdev имидж (я немного поменял скрипты). Что это дает:
1 Файлы устройств создаются динамически - в /dev присутствует то что реально есть в системе
2 Умеет загружать firmware по запросу ядра
3 Позволяет выполнять различные команды при определенных событиях в ядре - что мне кажется вам и нужно. Я не уверен можно ли при помощи этого сделать автомонтирование - думаю можно. На большом linux к этому обычно привлекают hal+d-bus и средства DE или ivman. Вообще вопрос интересный, думаю если будет время попробую. Доки к mdev - /исходники_busybox/docs/mdev.txt
Все оказалось действительно просто. Достаточно написать простейшее правило для mdev в его конфиге - /etc/mdev.conf. Я испробовал на usb flash - у меня mci занят mmc на которой root.
Содержимое mount_usb
mdev создает переменную окружения MDEV в которой лежит название устройства попавшего под правило, которую можно использовать в скриптах. После как вставил usbflash она автоматомсмонтровалась в /mnt. Думаю для sd/mmc можно так же легко переделать автроский скрипт и добавить правило в /etc/mdev.conf
Поковырялся с mdev - есть результаты.
Все действительно работает так, как описано. Появляются/удаляются усройства в /dev, ядро вызывает mdev, тот вызывет скрипты, исходя из правил в /etc/mdev.conf. USB-флешка автоматически монтируется. подтвреждаю:)
Но есть и деготь:
1) Автоматическое демонтирование при unplug'е флешки. Казалось было логичным создать две строки в /etc/mdev.conf:
sd[a-z][1-9] 0:0 660 @mount_usb #после появления /dev/sda*
sd[a-z][1-9] 0:0 660 $umount_usb #перед удалением /dev/sda*
Но mdev устроен иначе:
>>The config file parsing stops at the first matching line
это значит, что скрипт демонтирования (вторая строка) вызываться не будет.
Видимо придется писать что-то вроде:
sd[a-z][1-9] 0:0 660 *mount_umount_usb #вызывать в обоих случаях.
А внутри mount_umount_usb уже разбираться - монтировать-ли, демонтировать, что, куда.. причем в скрипт, кроме имени устройства, ничего не передается, что добавит возни с анализом текущей таблицы смонтированных устройств.
чешутся руки поправить busybox :)
2) C MMC все оказалось еще хуже. До mdev дело не дошло, так как обнаружилась неспособность драйвера at91_mci на ходу обрабатывать plug/unplug mmc-карты. Потыкал так и сяк - убедился, что видимо только при загрузке драйвер ENUM'ит состояние разъемов и регистрирует /dev/mmc*
Способ сборки (статически или *.ko) на результат не влияет. В случае *.ko имеется возможность руками его rmmod/insmod.
Пока рою гугл на эту тему, так как работать с mci пока не доводилось, а значит я хрен чего пойму в at91_mci.c
PS поправьте, если ошибаюсь. в linux я новичок, потому допускаю, что могу чего-то недопонимать или не видеть.
В этом нет никакого смысла - демонтирование нужно делать до извлечения устройства. Основной смысл его - сбросить все буферы и кеши - запись на физическое устройство происходит не сразу, операции чтения-записи кешируются системой и самим устройством.
По поводу
скорей всего ничего не исправить - я совсем забыл про глюки с mci...
Сброс буфферов и кешей это часть дела. Демонтировать необходимо еще потому, что при следующем plug'е флешки поямится такой-же /dev/sda* и он второй раз(и третий, и четверный..) будет смонтирован в /dev/mnt. А при попытке прочитать этот каталог валятся ошибки. До тех пор, пока не отмонтируешь "старые" точки.
MCI должен работать. вчера покопался в драйвере и в pdf - все предусмотрено: отдельный gpio на разъем, который шевелится при plug/unplug. драйвер ловит прерывание и перечитывает карты.
Только закомментировано кое что. сегодня продолжу.
Честно говоря не знаю "правильного" метода как поступать если устройство извлекли без предварительного размонтирования. Директория монтирования занята и ничего не помогает - кто знает поделитесь.