이 문서 에서는 세 가지 방법으로 카드 드라이버를 디버깅하는 방법을 소개합니다 .Linux SD
1. SD 카드 소개
SD Card(Secure Digital Memory Card)
: 보안 디지털 카드는 반도체 플래시 메모리를 기반으로 한 차세대 고속 저장 장치입니다.
SD
카드 구성은 다음과 같습니다.
다음은 카드의 외부 핀, 내부 레지스터, 속도 등급, 용량 등급에 대한 간략한 요약입니다 .SD
1. 외부 핀
SD
카드는 모드, 모드 및 모드의 세 가지 전송 모드를 지원합니다.SPI
1bit SD
4bit SD
실제 프로젝트에서는 주로 후자의 두 가지 모드를 디버깅했습니다. 카드에는 총 9개의 핀이 있으며 요약하면 다음과 같습니다.SD
핀 이름 | 핀 설명 | 주목 |
---|---|---|
CLK | 시계 신호 | |
명령 | 명령/응답 핀 | |
DATE0 ~ 3 | 데이터 케이블 | 1bit SD 모드: , : 카드 감지만 사용 합니다 . 모드: :카드 감지/데이터 3DATA0 CD 4bit SD CD/DATA3 |
VDD | 전원 공급 장치 | |
VSS1/2 | 땅 |
2. 내부 레지스터
SD 카드 관련 레지스터는 다음과 같이 구성됩니다.
이름 등록 | 등록 설명 |
---|---|
OCR(동작조건 레지스터) | 동작상태 레지스터 |
CID(카드식별등록부) | 카드 식별 번호 등록, 각 카드에는 고유 식별 번호가 있습니다. |
CSD(카드별 데이터 레지스터) | 데이터 레지스터 설명 |
SCR(SD 카드 구성 레지스터) | SD 카드 구성 레지스터 |
RCA(친척카드 주소) | 카드 주소 등록 |
DSR(드라이버 스테이지 레지스터) | 드라이버 레벨 레지스터 |
3. 속도 수준
데이터 전송 속도에 따라 카드의 속도 등급 표시가 다릅니다.SD
프로토콜 사양 | 소개 |
---|---|
SD1.0 | 다양한 속도 수준을 나타내는 데 사용되며 거의 사용되지 않습니다.X |
SD2.0 | 일반 카드(Class2, Class4, Class6) 및 고속 카드(Class10). |
SD3.0 | UHS 속도 클래스 1과 3을 사용합니다. |
SD4.0 | UHS-II 사용 |
4. 용량 수준
SD
현재 지원되는 카드 용량은 , 및 입니다 .SD
SDHC
SDXC
SD 카드 유형 | 프로토콜 사양 | 용량 | 지원되는 파일 형식 |
---|---|---|---|
SD | SD1.0 | ~2GB | 지방 12,16 |
SDHC(SD 대용량) | SD2.0 | 2GB ~ 32GB | 지방 32 |
SDXC(SD 확장 용량) | SD3.0 | 32GB~2TB | 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>; 시계 이름 = "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>; cap-mmc-고속; cap-sd-고속; 비활성화-WP; sd-uhs-sdr104; vmmc-공급 = <&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: 클록 주파수는 24M, 신호 전압 1.8V를 초과하지 않습니다. sd-uhs-sdr25: 클록 주파수는 50M, 신호 전압 1.8V를 초과하지 않습니다. sd-uhs-sdr50: 클록 주파수는 100M, 신호 전압 1.8을 초과하지 않습니다. V sd-uhs-ddr50: 클록 주파수는 50M를 초과하지 않으며 이중 에지 샘플링을 사용하며 신호 전압 1.8V sd-uhs-sdr104: 클록 주파수는 208M을 초과하지 않으며 신호 전압 1.8V
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, ## 클럭, 전체 라인, 전원 공급 장치 구성, 선택, 타이밍 등 실행_튜닝 = dw_mci_rk3288_execute_tuning, ## 조정 드라이버 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 클럭: 150000000Hz 실제 클럭: 148500000Hz vdd: 21(3.3~3.4V) 버스 모드: 2(푸시-풀) 칩 선택: 0 (상관없음) 전원 모드: 2 (켜짐) 버스 폭: 2 (4비트) 타이밍 사양: 6 (sd uhs SDR104) 신호 전압: 1 (1.80 V) 드라이버 유형: 0 (드라이버 유형 B)
3. SD카드 테스트
카드를 기준으로 다음 테스트가 완료됩니다.SanDisk Ultra 1 32G SD
1. SD 카드 감지
시스템이 시작된 후 카드 시작 로그는 다음과 같습니다.SD
[ 1.225398] dwmmc_rockchip fe2b0000.dwmmc: 위상을 266으로 조정했습니다. [ 1.225420] mmc1: 주소 aaaa의 새로운 초고속 SDR104 SDHC 카드 [ 1.226456] mmcblk1: mmc1:aaaa SD32G 29.7 GiB [ 1.227643] mmc blk1: p1
카드가 정상적으로 초기화되지 않으면 다음과 같은 로그가 나타납니다 .SD
[ 182.501273] mmc_host mmc1: 버스 속도(슬롯 0) = 375000Hz(슬롯 요구 400000Hz, 실제 375000HZ div = 0) [ 182.672282] mmc1: SD 카드 초기화 중 오류 -123 [ 182.686489] mmc_host mmc1: 버스 속도(슬롯 0) = 375000Hz(슬롯 요구 300000Hz, 실제 187500HZ div = 1) [ 182.699318] mmc_host mmc1: 버스 속도(슬롯 0) = 375000Hz(슬롯 요구 375000Hz, 실제 375000HZ div = 0) [ 182.717513] mmc_host mmc 1: 버스 속도(슬롯 0) = 375000Hz(슬롯 요구 200000Hz, 실제 187500HZ div = 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 전원 직렬 uevent csd erase_size 이름 favorite_erase_size ssr 날짜 fwrev ocr rca 하위 시스템 [root@xiaotianbsp:/sys/devices/platform/fe2b0000.dwmmc/mmc_host/mmc1/mmc1:aaaa]# cat cid 03534453443332478554c 496d501636f ## 기타 기록 조회 방법은 다음과 유사합니다.
SD
카드의 다른 매개변수를 보는 방법은 다음과 같습니다.
[root@xiaotianbsp:/sys/devices/platform/fe2b0000.dwmmc/mmc_host/mmc1/mmc1:aaaa]# cat era_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]# 고양이 manfid 0x000003 [root@xiaotianbsp:/sys/devices/platform/fe2b0000.dwmmc/mmc_host/mmc1/mmc1:aaaa]# 고양이 이름 SD32G [root@xiaotianbsp:/sys/devices/ platform/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 파일 시스템에 권장되는 IO 문자 세트가 아니며, 파일 시스템은 대소문자를 구분합니다! [ 244.749331] FAT-fs(mmcblk1p1): 볼륨이 제대로 마운트 해제되지 않았습니다. 일부 데이터가 손상되었을 수 있습니다. fsck를 실행해 보세요. [root@xiaotianbsp:/]# 마운트 ... /tmp 유형 vfat의 /dev/mmcblk1p1(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 GB, 31914983424 바이트, 62333952 섹터 3880 실린더, 255 헤드, 63개 섹터/트랙 단위: 실린더 16065 * 512 = 8225280바이트장치 부팅 시작 CHS EndCHS StartLBA EndLBA 섹터 크기 ID 유형 /dev/mmcblk1p1 0,0,17 1023,254,63 16 62333951 62333936 29.7G c Win95 FAT32( ) 명령어 (m 도움말): d## 2. 파티션 삭제 선택한 파티션 1 명령어 (m 도움말): p 디스크 /dev/mmcblk1: 30GB, 31914983424바이트, 62333952 섹터 3880 실린더, 255 헤드, 63 섹터 /track 단위: 16065 * 512 = 8225280바이트의 실린더Device Boot StartCHS EndCHS StartLBA EndLBA Sectors Size 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 명령 (도움말용 m): p 디스크 /dev/mmcblk1: 30GB, 31914983424바이트, 62333952 섹터 3880 실린더, 255 헤드, 63 섹터/트랙 단위: 16065 * 512 = 8225280 바이트 실린더 장치 부팅 StartCHS EndCHS StartLBA EndLBA 섹터 크기 ID 유형 /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: 30GB, 31914983424바이트, 62333952 섹터 3880개 실린더, 255개 헤드, 63개 섹터/트랙 단위: 16065 * 512 = 8225280바이트 실린더 장치 /dev/mmcblk1p1 0,1,1 1023,254,63 63 31166099 31166037 14.8G 83 리눅스 /dev/mmcblk1p2 1023,254,63 1023,254,63 31166100 62332199 3116 6100 1 4.8G 83 Linux 명령 (도움말은 m) : 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바이트(105MB, 100 MiB) 복사됨, 3.4844초, 30.1MB/s 실제 0m 3.49s 사용자 0m 0.00s sys 0m 0.16s
테스트 카드 읽기 명령:SD
[root@RK356X:/]# time dd iflag=direct,nonblock if=/dev/mmcblk1p1 of=/dev/null bs=1M count=100 100+0 레코드 100+0 레코드 출력 104857600바이트(105MB, 100 MiB) 복사됨, 1.65236초, 63.5MB/s 실제 0m 1.65s 사용자 0m 0.00s sys 0m 0.03s
위 명령에 구성된 및 속성은 파일 시스템을 회피 하고 이를 사용하지 않고 직접 읽고 쓸 수 있습니다 .iflag
oflag
cache
buffer cache
참고: 전재시에는 저자와 출처를 명시해 주시기 바랍니다.
RustDesk는 만연한 사기로 국내 서비스 Taobao(taobao.com)를 중단하고 웹 버전 최적화 작업을 재개했으며 Apple은 M4 칩을 출시했으며 고등학생들은 성인식으로 자신의 오픈 소스 프로그래밍 언어를 만들었습니다. 네티즌들은 다음과 같이 논평했습니다. 변호인인 Yunfeng은 Alibaba에서 사임했으며 향후 Windows 플랫폼의 Visual Studio Code 1.89를 독립 게임 프로그래머를 위한 대상인 Huawei에 의해 공식적으로 발표되었습니다. Yu Chengdong의 직업 조정은 "FFmpeg Pillar of Shame"에 포함되었습니다. ” 15년 전, 오늘 그는 우리에게 감사해야 합니다. Tencent QQ Video가 이전의 수치심을 복수한다고요? 화중과기대학교 오픈소스 미러 스테이션이 외부 네트워크 접속에 공식적으로 개방되었습니다.