В этой статье рассказывается, как отлаживать драйверы карт тремя способами.Linux SD
1. Знакомство с SD-картой
SD Card(Secure Digital Memory Card)
: Безопасная цифровая карта — это новое поколение высокоскоростных запоминающих устройств на основе полупроводниковой флэш-памяти.
SD
Структура карты следующая:
Ниже приводится краткая информация о внешних контактах карты, внутренних регистрах, скорости и емкости.SD
1. Внешний контакт
SD
Карта поддерживает три режима передачи: режим, режим и режим.SPI
1bit SD
4bit SD
В реальном проекте я в основном отлаживаю последние два режима. Всего на карте имеется 9 контактов, которые суммируются следующим образом:SD
Имя контакта | Описание контакта | Примечание |
---|---|---|
КЛК | тактовый сигнал | |
КМД | контакт команды/ответа | |
ДАТА0 ~ 3 | кабель для передачи данных | 1bit SD Режим: использовать только , : обнаружение карты. Режим: :Обнаружение карты/Данные 3DATA0 CD 4bit SD CD/DATA3 |
ВДД | источник питания | |
ВСС1/2 | земля |
2. Внутренний реестр
Регистры, связанные с SD-картой, организованы следующим образом:
Зарегистрировать имя | Описание регистрации |
---|---|
OCR (Реестр условий эксплуатации) | регистр рабочего состояния |
CID (регистр идентификации карты) | Регистр идентификационного номера карты, каждая карта имеет уникальный идентификационный номер. |
CSD (регистр данных карты) | Описать регистр данных |
SCR (регистр конфигурации SD-карты) | Регистр конфигурации SD-карты |
RCA (относительный адрес карты) | реестр адресов карт |
DSR (регистр уровня драйвера) | регистр уровня драйвера |
3. Уровень скорости
В зависимости от скорости передачи данных карты имеют разные обозначения скорости.SD
Спецификации протокола | Введение |
---|---|
SD1.0 | Используется для обозначения различных уровней скорости, используется редко.X |
SD2.0 | Обычные карты (Класс2, Класс4, Класс6) и высокоскоростные карты (Класс10). |
SD3.0 | Использует классы скорости UHS 1 и 3. |
SD4.0 | Использование UHS-II |
4. Уровень мощности
SD
Емкость карты в настоящее время поддерживает: , и .SD
SDHC
SDXC
Тип SD-карты | Спецификации протокола | Емкость | Поддерживаемые форматы файлов |
---|---|---|---|
СД | SD1.0 | ~2 ГБ | ЖИР 12,16 |
SDHC (SD высокой емкости) | SD2.0 | 2 ГБ ~ 32 ГБ | ЖИР 32 |
SDXC (расширенная емкость SD) | SD3.0 | 32 ГБ~2 ТБ | exFAT |
2. Отладка SD-карты
1. Принципиальная схема
Чтобы предварительно настроить драйвер, сначала посмотрите на принципиальную схему.
На рисунке ниже показан способ подключения со слотом для карты .RK3568
microSD
2. Конфигурация SD-карты
RK3568 SD
Файл конфигурации карты:
1)arch/arm64/boot/dts/rockchip/rk3568.dtsi
sdmmc0: dwmmc@fe2b0000 { совместимый = "rockchip,rk3568-dw-mshc", "rockchip,rk3288-dw-mshc"; reg = <0x0 0xfe2b0000 0x0 0x4000>; прерывания = <GIC_SPI 98 IRQ_TYPE_LEVEL_HIGH>; максимальная частота = <150000000>; часы = <&cru HCLK_SDMMC0>, <&cru CLK_SDMMC0>, <&cru SCLK_SDMMC0_DRV>, <&cru SCLK_SDMMC0_SAMPLE>; clock-names = "biu", "ciu", "ciu-drive", "ciu-sample"; fifo-глубина = <0x100>; сбрасывает = <&cru SRST_SDMMC0>; сброс-имена = "сброс"; статус = «отключено»; };
2)arch/arm64/boot/dts/rockchip/rk3568-firefly-core.dtsi
&sdmmc0 { максимальная частота = <150000000>; поддерживает-SD; ширина шины = <4>; крышка-MMC-высокая скорость; кэп-сд-высокоскоростной; отключить-WP; сд-ухс-sdr104; vmmc-supply = <&vcc3v3_sd>; vqmmc-supply = <&vccio_sd>; pinctrl-names = «по умолчанию»; pinctrl-0 = <&sdmmc0_bus4 &sdmmc0_clk &sdmmc0_cmd &sdmmc0_det>; статус = «ОК»; };
в:
clocks
: указывает часы контроллера карты и часы.SD
driver
sample
max-frequency
: максимальная рабочая частота карты, настраиваемая в зависимости от разных режимов.SD
supports-sd
: указывает на функцию карты и ее необходимо добавить. В противном случае карту невозможно инициализировать.SD
SD
bus-width
: Карта использует 4-проводной режим. Если не настроено, по умолчанию используется 1-проводной режим.SD
cap-mmc-highspeed/cap-sd-highspeed
:Поддерживаемые карты .highspeed
SD
vmmc-supply、vqmmc-supply
: Домен мощности карты.SD
SD3.0
Скоростной режим:
sd-uhs-sdr12: тактовая частота не превышает 24М, напряжение сигнала 1,8В sd-uhs-sdr25: тактовая частота не превышает 50М, напряжение сигнала 1,8В sd-uhs-sdr50: тактовая частота не превышает 100М, напряжение сигнала 1,8В В sd-uhs-ddr50: тактовая частота не превышает 50М, используется дискретизация по двойному фронту, напряжение сигнала 1,8В sd-uhs-sdr104: тактовая частота не превышает 208М, напряжение сигнала 1,8В
pinctrl-0
: Конфигурация карты .SD
pinmux
3. Драйвер SD-карты
RK3568
Файл драйвера: , в основном сосредоточено на:drivers/mmc/host/dw_mmc-rockchip.c
static const struct dw_mci_drv_data rk3288_drv_data = { .caps = dw_mci_rk3288_dwmmc_caps, .num_caps = ARRAY_SIZE(dw_mci_rk3288_dwmmc_caps), .set_ios = dw_mci_rk3288_set_ios, ## Настройка часов, всего строк, источник питания, выбор микросхемы, синхронизация и т. д . драйвер clk и образец фазы clk .parse_dt = dw_mci_rk3288_parse_dt, .init = dw_mci_rockchip_init, };
RK3568 SD
Использование контроллера , в основном сосредоточено на: и .Synopsys IP
dw_mci_rk3288_set_ios()
dw_mci_rk3288_execute_tuning()
После запуска системы просмотреть свойства карты можно следующей командой (реализация драйвера: ):SD
drivers/mmc/core/debugfs.c
[root@xiaotianbsp:/]# cat /sys/kernel/debug/mmc1/ios тактовая частота: 150000000 Гц фактическая тактовая частота: 148500000 Гц vdd: 21 (3,3 ~ 3,4 В) режим шины: 2 (тяни-толкай) выбор чипа: 0 (не важно) режим питания: 2 (вкл.) ширина шины: 2 (4 бита) характеристики синхронизации: 6 (sd uhs SDR104) напряжение сигнала: 1 (1,80 В) тип драйвера: 0 (тип драйвера B)
3. Тест SD-карты
Следующий тест выполняется на основе карты.SanDisk Ultra 1 32G SD
1. Обнаружение SD-карты
После запуска системы журнал запуска карты выглядит следующим образом:SD
[ 1.225398] dwmmc_rockchip fe2b0000.dwmmc: Успешно настроена фаза на 266 [ 1.225420] mmc1: новая сверхвысокоскоростная карта SDHC SDR104 по адресу aaaa [ 1.226456] mmcblk1: mmc1:aaaa SD32G 29,7 ГиБ [ 1.227643 мм] cblk1: п1
Если карта не инициализируется нормально, появится следующий журнал:SD
[ 182.501273] mmc_host mmc1: скорость шины (слот 0) = 375 000 Гц (требование слота 400 000 Гц, фактическое 375 000 Гц div = 0) [ 182.672282] mmc1: ошибка -123 при инициализации SD-карты [ 182.686489] mmc_host mmc1: скорость шины (слот 0) = 375000Гц (требование слота 300000Гц, фактическое значение 187500Гц div = 1) [ 182.699318] mmc_host mmc1: Скорость шины (слот 0) = 375000Гц (требование слота 375000Гц, фактическое значение 375000Гц div = 0) [ 182.717513] mmc_host 1: Скорость шины (слот 0) = 375 000 Гц (требуется слот 200 000 Гц, фактическая частота 187 500 Гц дел. = 1)
Причина: Неудача. Определение сообщения об ошибке ( ):mmc_sd_init_card()
include/uapi/asm-generic/errno.h
#define ETIMEDOUT 110 /* Тайм-аут соединения */ ... #define ENOMEDIUM 123 /* Среда не найдена */
2. Регистрация SD-карты
С помощью следующей команды вы можете просмотреть значения регистров, связанных с картой.SD
[root@xiaotianbsp:/]# cd /sys/class/mmc_host/mmc1/mmc1:aaaa [root@xiaotianbsp:/sys/devices/platform/fe2b0000.dwmmc/mmc_host/mmc1/mmc1:aaaa]# драйвер блока ls hwrev oemid scr тип cid dsr manfid power серийный номер uevent csd стирание_размера имя предпочтительный_erase_size ssr дата fwrev ocr подсистема rca [root@xiaotianbsp:/sys/devices/platform/fe2b0000.dwmmc/mmc_host/mmc1/mmc1:aaaa]# cat cid 035344534433324785 54c 496d501636f ## Прочее Метод просмотра реестра аналогичен
SD
Способ просмотра других параметров карты следующий:
[root@xiaotianbsp:/sys/devices/platform/fe2b0000.dwmmc/mmc_host/mmc1/mmc1:aaaa]# cat Erase_size 512 [root@xiaotianbsp:/sys/devices/platform/fe2b0000.dwmmc/mmc_host/mmc1/mmc1: aaaa]# cat fwrev 0x5 [root@xiaotianbsp:/sys/devices/platform/fe2b0000.dwmmc/mmc_host/mmc1/mmc1:aaaa]# cat hwrev 0x8 [root@xiaotianbsp:/sys/devices/platform/fe2b0000.dwmmc/ mmc_host/mmc1/mmc1:aaaa]# cat manfid 0x000003 [root@xiaotianbsp:/sys/devices/platform/fe2b0000.dwmmc/mmc_host/mmc1/mmc1:aaaa]# имя кошки SD32G [root@xiaotianbsp:/sys/devices/ платформа/fe2b0000.dwmmc/mmc_host/mmc1/mmc1:aaaa]# cat oemid 0x5344 [root@xiaotianbsp:/sys/devices/platform/fe2b0000.dwmmc/mmc_host/mmc1/mmc1:aaaa]# cat серийный 0x54c496d5 [root@xiaotianbsp :/sys/devices/platform/fe2b0000.dwmmc/mmc_host/mmc1/mmc1:aaaa]# тип кошки SD
3. Монтирование/демонтирование
SD
Команда монтирования раздела карты:
[root@xiaotianbsp:/]# mount -t vfat /dev/mmcblk1p1 /tmp/ [ 244.746983] FAT-fs (mmcblk1p1): utf8 не является рекомендуемой кодировкой ввода-вывода для файловых систем FAT, файловая система будет чувствительна к регистру! [ 244.749331] FAT-fs (mmcblk1p1): Том не был правильно отключен. Некоторые данные могут быть повреждены. Пожалуйста, запустите fsck. [root@xiaotianbsp:/]# mount ... /dev/mmcblk1p1 в /tmp типа vfat (rw,relatime,fmask=0022,dmask=0022,codepage=936,iocharset=utf8,shortname=mixed,errors=remount- ро)
SD
Команда удаления раздела карты:
размонтировать /dev/mmcblk1p1
4. Создайте разделы
Разделы на карте можно воссоздать с помощью команды.fdisk
SD
[root@xiaotianbsp:/]# fdisk /dev/mmcblk1 ... Команда (m для помощи): p ## 1. Просмотр существующего раздела Диск /dev/mmcblk1: 30 ГБ, 31914983424 байт, 62333952 сектора, 3880 цилиндров, 255 головки, 63 сектора/дорожка Единицы измерения: цилиндры 16065 * 512 = 8225280 байт. Загрузка устройства StartCHS EndCHS StartLBA EndLBA Размер секторов Идентификатор Тип /dev/mmcblk1p1 0,0,17 1023,254,63 16 62333951 62333936 29.7G c Win95 FAT32 ( ЛБА) Команда (m для помощи): d## 2. Удалить раздел Выбранный раздел 1 Команда (m для помощи): p Диск /dev/mmcblk1: 30 ГБ, 31914983424 байт, 62333952 сектора 3880 цилиндров, 255 головок, 63 сектора /track Единицы измерения: цилиндры 16065 * 512 = 8225280 байт. Загрузка устройства StartCHS EndCHS StartLBA EndLBA Размер секторов Id TypeCommand ( m для справки): n ## 3. Создайте новый раздел, всего создается 2 раздела. Действие команды e расширенный p основной раздел. (1–4) p Номер раздела (1–4): 1 Первый цилиндр (1–3880, по умолчанию 1): использование значения по умолчанию 1 Последний цилиндр или +size или +sizeM или +sizeK (1–3880, по умолчанию 3880): 1940 Команда (м для помощи): p Диск /dev/mmcblk1: 30 ГБ, 31914983424 байт, 62333952 секторов 3880 цилиндров, 255 головок, 63 сектора/дорожка Единицы измерения: 16065 * 512 = 8225280 байт Device Boot StartCHS EndCHS StartLBA Размер секторов EndLBA Идентификатор Тип /dev/mmcblk1p1 0,1,1 1023,254,63 63 31166099 31166037 14,8G 83 Команда Linux (m для справки): n Действие команды e расширенный p основной раздел (1-4) p Номер раздела (1-4): 2 Первый цилиндр (1941-3880, по умолчанию 1941): использование значения по умолчанию 1941 Последний цилиндр или +size или +sizeM или +sizeK (1941-3880, по умолчанию 3880): использование значения по умолчанию 3880 Команда (m) для справки): p Диск /dev/mmcblk1: 30 ГБ, 31914983424 байт, 62333952 секторов 3880 цилиндров, 255 головок, 63 сектора/дорожка Единицы измерения: цилиндры 16065 * 512 = 8225280 байт Device Boot StartCHS EndCHS StartLBA EndLBA Размер секторов Id Type /dev/mmcblk1p1 0,1,1 1023,254,63 63 31166099 31166037 14.8G 83 Linux /dev/mmcblk1p2 1023,254,63 1023,254,63 31166100 62332199 3116 6100 1 4.8G 83 Команда Linux (м за помощь) :w## 4. Сохраните новый раздел.
5. Тест по чтению и письму.
Команда записи тестовой карты:SD
[root@RK356X:/]# time dd oflag=direct,nonblock if=/dev/zero of=/dev/mmcblk1p1 bs=1M count=100 100+0 записей в 100+0 записей выходит 104857600 байт (105 МБ, 100 MiB) копируется, 3,4844 с, 30,1 МБ/с реальная 0 мин 3,49 с пользователь 0 мин 0,00 с системный 0 мин 0,16 с
Команда чтения тестовой карты:SD
[root@RK356X:/]# time dd iflag=direct,nonblock if=/dev/mmcblk1p1 of=/dev/null bs=1M count=100 100+0 записей в 100+0 записей выходит 104857600 байт (105 МБ, 100) MiB) копируется, 1,65236 с, 63,5 МБ/с реальная 0 мин 1,65 с пользователь 0 мин 0,00 с системный 0 мин 0,03 с
Атрибуты и, настроенные в приведенной выше команде, позволяют избегать файловой системы и выполнять чтение и запись напрямую, без их использования .iflag
oflag
cache
buffer cache
Примечание: При перепечатке просьба указывать автора и источник.
RustDesk приостановил внутренний сервис Taobao (taobao.com) из-за повального мошенничества, возобновил работу по оптимизации веб-версии, Apple выпустила чип M4, старшеклассники создали свой собственный язык программирования с открытым исходным кодом в качестве церемонии совершеннолетия - пользователи сети прокомментировали: Полагаясь на Защита Юньфэн ушла из Alibaba и планирует выпустить в будущем предназначенную для независимых программистов игр Visual Studio Code 1.89, официально объявлено Huawei. Изменение должности Юй Чэндуна было занесено в «Столп позора FFmpeg». 15 лет назад, но сегодня он должен нас поблагодарить — Tencent QQ Video мстит за свой предыдущий позор? Зеркальная станция с открытым исходным кодом Университета науки и технологий Хуачжун официально открыта для доступа к внешней сети.