SD-карта ядра Linux

В этой статье рассказывается, как отлаживать драйверы карт тремя способами.Linux SD

1. Знакомство с SD-картой

SD Card(Secure Digital Memory Card): Безопасная цифровая карта — это новое поколение высокоскоростных запоминающих устройств на основе полупроводниковой флэш-памяти.

SDСтруктура карты следующая:

Ниже приводится краткая информация о внешних контактах карты, внутренних регистрах, скорости и емкости.SD

1. Внешний контакт

SDКарта поддерживает три режима передачи: режим, режим и режим.SPI1bit SD4bit SD

В реальном проекте я в основном отлаживаю последние два режима. Всего на карте имеется 9 контактов, которые суммируются следующим образом:SD

Имя контакта Описание контакта Примечание
КЛК тактовый сигнал  
КМД контакт команды/ответа  
ДАТА0 ~ 3 кабель для передачи данных 1bit SDРежим: использовать только , : обнаружение карты. Режим: :Обнаружение карты/Данные 3DATA0CD4bit SDCD/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Емкость карты в настоящее время поддерживает: , и .SDSDHCSDXC

Тип SD-карты Спецификации протокола Емкость Поддерживаемые форматы файлов
СД SD1.0 ~2 ГБ ЖИР 12,16
SDHC (SD высокой емкости) SD2.0 2 ГБ ~ 32 ГБ ЖИР 32
SDXC (расширенная емкость SD) SD3.0 32 ГБ~2 ТБ exFAT

 

2. Отладка SD-карты

1. Принципиальная схема

Чтобы предварительно настроить драйвер, сначала посмотрите на принципиальную схему.

На рисунке ниже показан способ подключения со слотом для карты .RK3568microSD

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: указывает часы контроллера карты и часы.SDdriversample

max-frequency: максимальная рабочая частота карты, настраиваемая в зависимости от разных режимов.SD

supports-sd: указывает на функцию карты и ее необходимо добавить. В противном случае карту невозможно инициализировать.SDSD

bus-width: Карта использует 4-проводной режим. Если не настроено, по умолчанию используется 1-проводной режим.SD

cap-mmc-highspeed/cap-sd-highspeed:Поддерживаемые карты .highspeedSD

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: Конфигурация карты .SDpinmux

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 IPdw_mci_rk3288_set_ios()dw_mci_rk3288_execute_tuning()

После запуска системы просмотреть свойства карты можно следующей командой (реализация драйвера: ):SDdrivers/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. Создайте разделы

Разделы на карте можно воссоздать с помощью команды.fdiskSD

[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 с

Атрибуты и, настроенные в приведенной выше команде, позволяют избегать файловой системы и выполнять чтение и запись напрямую, без их использования .iflagoflagcachebuffer cache

Примечание: При перепечатке просьба указывать автора и источник.

RustDesk приостановил внутренний сервис Taobao (taobao.com) из-за повального мошенничества, возобновил работу по оптимизации веб-версии, Apple выпустила чип M4, старшеклассники создали свой собственный язык программирования с открытым исходным кодом в качестве церемонии совершеннолетия - пользователи сети прокомментировали: Полагаясь на Защита Юньфэн ушла из Alibaba и планирует выпустить в будущем предназначенную для независимых программистов игр Visual Studio Code 1.89, официально объявлено Huawei. Изменение должности Юй Чэндуна было занесено в «Столп позора FFmpeg». 15 лет назад, но сегодня он должен нас поблагодарить — Tencent QQ Video мстит за свой предыдущий позор? Зеркальная станция с открытым исходным кодом Университета науки и технологий Хуачжун официально открыта для доступа к внешней сети.
{{o.name}}
{{m.name}}

рекомендация

отmy.oschina.net/u/4702401/blog/5566478