SD/SDIO 接口

模块功能介绍

MMC是一种可高度配置和可编程的高性能移动存储主控制器。

x1600使用的ap6212芯片。 AP6212是基于BCM4340A1方案的集成wifi和bluetooth的功能模块,它包括用于WiFi的SDIO接口,和用于蓝牙的UART/PCM接口。

GPIO功能描述:

SDIO

NameI/OFuntion
SDIO GPIO-(PB12~PB17) FUNTION0
WL_REG_ON GPIO-PC28
WL_WAKE_HOST GPIO-PB04

SD

NameI/OFuntion
MSC0_CLK GPIO-PD00 FUNTION0
MSC0_CMD GPIO-PD01 FUNTION0
MSC0_DATA GPIO-(PD02~PD05) FUNTION0

EMMC

NameI/OFuntion
MSC0_CLK GPIO-PD00 FUNTION0
MSC0_CMD GPIO-PD01 FUNTION0
MSC0_DATA GPIO-(PD02~PD05) FUNTION0

注:默认不配置为EMMC卡模式,可以自行配置

MSC控制器命名对应关系:

控制器Basebootromkernelpm-spechardware-pcd
控制器0 13450000 msc0 msc0 msc0 msc0
控制器1 13460000 msc1 msc1 sdio sdio

驱动源码位置

驱动源码位于:

module_drivers/drivers/mmc/host/

├──ingenic_sdio.c
├──ingenic_mmc.c

设备树配置

设备树所在位置:

kernel内核(version <= 5.10)dts文件路径:

module_drivers/dts-stage/x1600/x1600.dtsi

kernel内核(version > 5.10)dts文件路径:

module_drivers/dts/x1600/x1600.dtsi

msc0控制器描述:

msc0: msc@0x13450000 { 

 compatible = "ingenic,x1600mmc”;

 reg = <0x13450000 0x10000>;

 status = "okay";

 interrupt-parent = <&core_intc>;

 interrupts = <IRQ_MSC0>;

};

msc1控制器描述:

msc1: msc@0x13460000 {

 compatible = "ingenic,x1600mmc";

 reg = <0x13460000 0x10000>;

 status = "okay";

 interrupt-parent = <&core_intc>;

 interrupts = <IRQ_MSC1>;

};

设备树默认配置

在板级设备树halley6_v10.dts中,默认配置产生msc1设备,描述如下:

SDIO

&msc0 {

 status = "disable"; 

 pinctrl-names ="default","enable", "disable";

 pinctrl-0 = <&msc0_4bit_f0>;

 pinctrl-1 = <&rtc32k_enable>;

 pinctrl-2 = <&rtc32k_disable>;

 cap-sd-highspeed;

 non-removable;

 max-frequency = <50000000>;

 bus-width = <4>;

voltage-ranges = <1800 3300>;

 non-removable; 

 /* special property */

 ingenic,wp-gpios = <0>;

 ingenic,cd-gpios = <0>;

 ingenic,rst-gpios = <0>;

 ingenic,removal-manual; /*removal-dontcare, removal-nonremovable, removal-removable, removal-manual*/

 bcmdhd_wlan: bcmdhd_wlan {

 compatible = "android,bcmdhd_wlan";

 ingenic,sdio-irq = <&gpb 4 IRQ_TYPE_LEVEL_HIGH INGENIC_GPIO_NOBIAS>;

 ingenic,sdio-reset = <&gpc 28 GPIO_ACTIVE_LOW INGENIC_GPIO_NOBIAS>;

};

SD

&msc1 {

 status = "okay";

 pinctrl-names ="default";

 pinctrl-0 = <&msc1_4bit>;

 cap-sd-highspeed;

 cd-inverted;

 max-frequency = <50000000>;

 bus-width = <4>;

 voltage-ranges = <1800 3300>;

 ingenic,sdio_clk = <0>;

 /* special property */

ingenic,wp-gpios = <0>;

 ingenic,cd-gpios = <0>;

 ingenic,rst-gpios = <0>;

 ingenic,removal-manual; /*removal-dontcare, removal-nonremovable, removal-removable, removal-manual*/

};

EMMC

&msc1 {

 status = "disable"; 

 /*mmc-hs200-1_8v;*/

 cap-mmc-highspeed;

 non-removable;

 max-frequency = <50000000>;

 bus-width = <4>;

 non-removable;

 voltage-ranges = <1800 3300>;

 /* special property */

 ingenic,wp-gpios = <0>;

 ingenic,cd-gpios = <0>;

 ingenic,rst-gpios = <0>;

};

注:默认不配置为EMMC卡模式,可以自行配置

设备树自定义配置

SDIO

属性名称说明
cap-sd-highspeed 配置SDIO支持high speed模式
max-frequency 通过配置该参数来指定当前模式下最大频率
bus-width 配置数据总线宽度,支持1bit、4bit、8bit
voltage-ranges 指定电压范围
non-removable 配置属性为不可移动卡
ingenic,sdio_clk 选项用于设置手动调试MSC tx相位
keep-power-in-suspend 休眠保持供电
ingenic,wp-gpios 写保护
ingneic,cd-gpios 卡检查
ingenic,rst-gpios 硬件reset
ingenic,removal-manual removal-dontcare, removal-nonremovable, removal-removable, removal-manual
ingenic,sdio-irq Wifi中断
ingenic,sdio-reset Wifi reset

SD

属性名称说明
cap-sd-highspeed 配置SD支持high speed模式
max-frequency 通过配置该参数来指定当前模式下最大频率
bus-width 配置数据总线宽度,支持1bit、4bit、8bit
voltage-ranges 指定电压范围
ingenic,wp-gpios 配置CD pin用于SD卡检测
ingneic,cd-gpios 卡检查
ingenic,rst-gpios 硬件reset
ingenic,removal-manual removal-dontcare, removal-nonremovable, removal-removable, removal-manual

EMMC

属性名称说明
mmc-hs200-1_8v 配置emmc支持hs200传输模式
cap-mmc-highspeed 配置emmc支持highspeed传输模式
non-removable 配置emmc属性为不可移动卡
max-frequency 通过配置该参数来指定当前模式下最大频率
enable_cpm_rx_tuning 该选项用于设置手动调试MSC rx相位,默认控制器自动tuning
enable_cpm_rx_tuning 选项用于设置手动调试MSC tx相位
bus-width 配置数据总线宽度,支持1bit、4bit、8bit
voltage-ranges 指定电压范围
ingenic,wp-gpios 写保护
ingneic,cd-gpios 卡检查
ingenic,rst-gpios 硬件reset

内核编译配置

内核Block & wireless基础编译配置

Block基础编译配置

Device Drivers --->

 --- MMC/SD/SDIO card support

 <*> HW reset support for eMMC 

 <*> Simple HW reset support for MMC 

 <*> MMC block device driver 

 (16) Number of minors per block device 

 < > SDIO UART/GPS class support 

 < > MMC host test driver 

 *** MMC/SD/SDIO Host Controller Drivers *** 

 [ ] MMC host drivers debugging 

 -*- Secure Digital Host Controller Interface support 

 < > SDHCI platform and OF driver helper 

 < > MMC/SD/SDIO over SPI 

 < > Synopsys DesignWare Memory Card Interface 

 < > Ingenic JZ47xx SD/Multimedia Card Interface support 

 < > VUB300 USB to SDIO/SD/MMC Host Controller support

Wireless基础编译配置

Device Drivers

--- Network device support 

[*] Network core driver support

[*] Wireless LAN --->

EMMC/SD/SDIO控制器驱动配置

首先配置INGENIC_MMC

Symbol: INGENIC_MMC [=y] 

Type : tristate 

Prompt: Ingenic(XBurst) MMC/SD Card Controller(MSC) support

 Location: 

 -> Ingenic device-drivers Configurations 

 -> [MSC] (eMMC/SD/SDIO) and Device Drivers

使用Emmc/SD驱动,配置INGENIC_MMC_MMC0

Symbol: INGENIC_MMC_MMC0[=y] 

Type : boolean 

Prompt: INGENIC_MMC MMC0 

 Location: 

 -> Ingenic device-drivers Configurations 

 -> [MSC] (eMMC/SD/SDIO) and Device Drivers 

 -> Ingenic(XBurst) MMC/SD Card Controller(MSC) support (INGENIC_MMC [=y])

使用sdio驱动,配置INGENIC_MMC_MMC1

Symbol: INGENIC_MMC_MMC1[=y] 

Type : boolean 

Prompt: INGENIC_MMC MMC1 

 Location: 

 -> Ingenic device-drivers Configurations 

 -> [MSC] (eMMC/SD/SDIO) and Device Drivers 

 -> Ingenic(XBurst) MMC/SD Card Controller(MSC) support (INGENIC_MMC [=y])

wifi驱动配置

 Symbol: BCMDHD [=y] 

 Type : tristate 

 Prompt: Broadcom FullMAC wireless cards support 

 Location: 

 -> Ingenic device-drivers Configurations 

 -> SDIO-WIFI drivers 

 Defined at module_drivers/drivers/net/wireless/bcmdhd/Kconfig \

内核自定义编译配置

内核配置名称说明
MMC_BLOCK_MINORS 每个块设备的最大分区数
BCMDHD_FW_PATH 配置wifi模块固件路径
BCMDHD_NVRAM_PATH 配置wifi模块固件路径

内核版本差异

无

设备节点生成

SDIO

驱动加载成功:

[ 1.124644] Dongle Host Driver, version 1.363.59.144.11 (r)

[ 1.125120] Register interface [wlan0] MAC: 70:4a:0e:69:5e:ba 

[ 1.125195] ]dhd_module_init: Exit err=0

SD

驱动加载成功:

[ 1.575803] mmc0: new SDHC card at address e624

[ 1.593001] mmcblk0: mmc0:e624 SU04G 3.69 GiB 

[ 1.601920] Alternate GPT is invalid, using primary GPT.

[ 1.607432] mmcblk0: p1 p2 p3 p4 p5 p6 p7

产生设备节点:

/dev/mmcblk0p1~p7 /*对应sd的分区*/

应用程序使用说明

EMMC/SD测试方法

写测试

/# dd if=/dev/zero of=/dev/mmcblk0 bs=1M count=100 conv=fsync

读测试

/# sync; echo 3 > proc/sys/vm/drop_caches 

/# time dd if=/dev/mmcblk0 of=/dev/null bs=1M count=100

SDIO测试方法

配置网络方法

  1. /etc/wpa_supplicant

/# cat /etc/wpa_supplicant.conf

ctrl_interface=/var/run/wpa_supplicant

update_config=1

country=GB"

network={

ssid="Guest" /*连接WiFi账户*/

psk="ingenic*123" /*连接Wifi密码*/

bssid=

priority=1

}
  1. 执行wifi_up.sh

/# ifconfig wlan0 up

/# wifi_up.sh 

[ 13.285811] dhd_open: Enter 843c4800

[ 13.290329] dhd_conf_read_config: Ignore config file /firmware/config.txt

[ 13.297356] Final fw_path=/firmware/fw_bcm43456c5_ag.bin

[ 13.302873] Final nv_path=/firmware/nvram_ap6256.txt

[ 13.308002] Final clm_path=/firmware/clm_bcmdhd.blob

[ 13.313152] Final conf_path=/firmware/config.txt

[ 13.317926] dhd_set_bus_params: set use_rxchain 0

[ 13.322804] dhd_set_bus_params: set txglomsize 36

[ 13.328047] dhd_os_open_image: /firmware/fw_bcm43456c5_ag.bin (579388 bytes) open success

[ 13.409630] dhd_os_open_image: /firmware/nvram_ap6256.txt (2440 bytes) open success

[ 13.516230] bcmsdh_oob_intr_register: HW_OOB enabled

[ 13.521376] bcmsdh_oob_intr_register OOB irq=72 flags=0x4

[ 13.556873] Firmware up: op_mode=0x0005, MAC=c0:84:7d:31:c8:c8

[ 13.640263] dhd_txglom_enable: enable 1

[ 13.748733] dhd_open: Exit ret=0

/# udhcpc: started, v1.26.2

Successfully initialized wpa_supplicant

[ 16.320669] Connecting with 8c:0c:90:98:47:cd ssid "wifi ssid", len (5) channel=153

[ 16.367807] wl_bss_connect_done succeeded with 8c:0c:90:98:47:cd

[ 16.401524] wl_bss_connect_done succeeded with 8c:0c:90:98:47:cd

udhcpc: sending select for 10.4.30.146

adding dns 219.141.136.10

adding dns 202.106.0.20
  1. 执行ping命令连网

/# ping www.baidu.com

PING www.baidu.com (220.181.38.150): 56 data bytes

64 bytes from 220.181.38.150: seq=0 ttl=53 time=14.347 ms

64 bytes from 220.181.38.150: seq=1 ttl=53 time=9.873 ms

64 bytes from 220.181.38.150: seq=2 ttl=53 time=12.889 ms

airkiss配网测试

AirKissdemo是为Wi-Fi设备提供的局域网发现和局域网通讯的技术。

  1. AirKissdemo配网

注:以下操作必须在WIFI(外网)环境下配置

  1. 执行airkiss命令

/# airkiss

[ 113.669340] dhd_open: Enter 842f1000

[ 113.677706] Dongle Host Driver, version 1.579.77.41.26 (r-20200429-2)

[ 113.695902] ======== PULL WL_REG_ON(-1) HIGH! ========

[ 114.122604] F1 signature read @0x18000000=0x15294345

[ 114.130573] F1 signature OK, socitype:0x1 chip:0x4345 rev:0x9 pkg:0x2

[ 114.137706] DHD: dongle ram size is set to 819200(orig 819200) at 0x198000

[ 114.153611] [dhd] dhd_conf_read_config : Ignore config file /firmware/config.txt

[ 114.161413] [dhd] dhd_conf_set_path_params : Final fw_path=/firmware/fw_bcm43456c5_ag.bin

[ 114.169851] [dhd] dhd_conf_set_path_params : Final nv_path=/firmware/nvram_ap6256.txt

[ 114.177960] [dhd] dhd_conf_set_path_params : Final clm_path=/firmware/clm_bcm43456c5_ag.blob

[ 114.186695] [dhd] dhd_conf_set_path_params : Final conf_path=/firmware/config.txt

[ 114.194942] dhd_os_open_image: /firmware/fw_bcm43456c5_ag.bin (579388 bytes) open success

[ 114.266737] dhd_os_open_image: /firmware/nvram_ap6256.txt (2440 bytes) open success

[ 114.283245] dhdsdio_write_vars: Download, Upload and compare of NVRAM succeeded.

[ 114.580570] [dhd-wlan0] wl_android_wifi_on : Success

Easy setup target library v4.0.0

state: 0 --> 1

state: 1 --> 3

state: 3 --> 5

ssid: JZ_SW /*微信端配置的网络账号*/

password: jz_sw%#!135 /*微信端配置的网络密码*/

/etc/wpa_supplicant.conf create successfully!

random: 0xc1

time elapsed: 0s

/# udhcpc: started, v1.31.1

Successfully initialized wpa_supplicant

[ 118.985525] [dhd-wlan0] wl_run_escan : LEGACY_SCAN sync ID: 0, bssidx: 0

wlan0: Trying to associate with c4:01:7c:78:c3:dd (SSID='JZ_SW' freq=5765 MHz)

[ 121.338272] [dhd-wlan0] wl_cfg80211_connect : Connecting with c4:01:7c:78:c3:dd ssid "JZ_SW", len (5), sec=wpa2psk/mfpn/tkipaes, channel=153

[ 121.402046] [dhd-wlan0] wl_ext_iapsta_event : [S] Link UP with c4:01:7c:78:c3:dd

[ 121.409697] [dhd-wlan0] wl_notify_connect_status : wl_bss_connect_done succeeded with c4:01:7c:78:c3:dd 

wlan0: Associated with c4:01:7c:78:c3:dd

wlan0: CTRL-EVENT-SUBNET-STATUS-UPDATE status=0

wlan0: WPA: Key negotiation completed with c4:01:7c:78:c3:dd [PTK=CCMP GTK=TKIP]

wlan0: CTRL-EV[ 121.451231] [dhd-wlan0] wl_notify_connect_status : wl_bss_connect_done succeeded with c4:01:7c:78:c3:dd vndr_oui: 00-90-4C 00-13-92 

ENT-CONNECTED - Connection to c4:01:7c:78:c3:dd completed [id=0 id_str=]

udhcpc: sending select for 10.10.30.203

udhcpc: lease of 10.10.30.203 obtained, lease time 86400

adding dns 192.168.1.2
  1. 执行ping命令连接网络

/# ping www.baidu.com

PING www.baidu.com (220.181.38.150): 56 data bytes

64 bytes from 220.181.38.150: seq=0 ttl=53 time=14.347 ms

64 bytes from 220.181.38.150: seq=1 ttl=53 time=9.873 ms

AP模式使用方法

  1. AP模式下的配置文件(/etc/hostapd.conf)

interface=wlan0

driver=nl80211

ssid=ingenic

channel=1

hw_mode=g

macaddr_acl=0

auth_algs=1

ignore_broadcast_ssid=0

\#wpa=2

\#wpa_passphrase=12345678

\#wpa_key_mgmt=WPA-PSK

\#wpa_pairwise=TKIP

\#rsn_pairwise=CCMP
  1. 进入AP模式

/# wifi_ap_mode_start.sh

脚本路径为

/usr/bin/wifi_ap_mode_start.sh

注意: 使用wifi_ap_mode_start.sh脚本前需要修改,如下图所示:

0![Screenshot from 2021-09-03 10-14-17](assets/eMMC_SD_SDIO_接口.0.png)

wlan0: interface state UNINITIALIZED->ENABLED

wlan0: AP-ENABLED
  1. 执行ifconfig,查看连接信息

/# ifconfig 

lo Link encap:Local Loopback 

inet addr:127.0.0.1 Mask:255.0.0.0

UP LOOPBACK RUNNING MTU:65536 Metric:1

RX packets:0 errors:0 dropped:0 overruns:0 frame:0

TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1 

RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

wlan0 Link encap:Ethernet HWaddr C0:84:7D:6A:F1:CD 

inet addr:192.168.1.1 Bcast:192.168.1.255 Mask:255.255.255.0

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

RX packets:46 errors:0 dropped:21 overruns:0 frame:0

TX packets:3 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000 

RX bytes:6509 (6.3 KiB) TX bytes:744 (744.0 B)
  1. 使用手机(或电脑)连接wifi

连接SSID为“ingenic”对应配置文件ssid=ingenic,密码可以使用wpa_passphrase = 12345678指定(本测试未设置密码)

连接成功会打印如下信息:

[ 515.831824] [dhd-wlan0] wl_ext_iapsta_event : [A] connected device 00:26:c6:58:50:54

[ 515.839828] [dhd-wlan0] wl_notify_connect_status_ap : connected device 00:26:c6:58:50:54

[ 515.851919] [dhd] CFG80211-ERROR) wl_cfg80211_change_station : WLC_SCB_AUTHORIZE sta_flags_mask not set 

udhcpd: sending OFFER to 192.168.1.2

udhcpd: sending ACK to 192.168.1.2
  1. 连接成功,Ping网络测试

/# ping 192.168.1.2

PING 192.168.1.2 (192.168.1.2): 56 data bytes

64 bytes from 192.168.1.2: seq=0 ttl=64 time=8.148 ms

64 bytes from 192.168.1.2: seq=1 ttl=64 time=15.411 ms

64 bytes from 192.168.1.2: seq=2 ttl=64 time=12.505 ms

64 bytes from 192.168.1.2: seq=3 ttl=64 time=7.654 ms

64 bytes from 192.168.1.2: seq=4 ttl=64 time=7.505 ms