eMMC/SD/SDIO 接口

模块功能介绍

DWC_MSHC是一种可高度配置和可编程的高性能移动存储主控制器。DWC_MSHC其数据传输的总接口为AXI。EMMC 是英文 Embedded Multi-Media Card(嵌入式多媒体卡)的缩写,X2000支持EMMC协议Electrical Standard(5.1)。

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

GPIO功能描述:

EMMC

NameI/OFuntion
MSC0_CLK GPIO-PD17 FUNTION0
MSC0_CMD GPIO-PD18 FUNTION0
MSC0_DATA GPIO-(PD19~PD26) FUNTION0

SDIO

NameI/OFuntion
SDIO GPIO-(PD08~PD13) FUNTION0
WL_REG_ON GPIO-PD0
WL_WAKE_HOST GPIO-PD1

SD

NameI/OFuntion
MSC0_CLK GPIO-PE00 FUNTION0
MSC0_CMD GPIO-PE01 FUNTION0
MSC0_DATA GPIO-(PE02~PE05) FUNTION0

MSC控制器命名对应关系:

控制器Basebootromkernelpm-spechardware-pcd
控制器0 13450000 msc0 msc0 msc0 msc0
控制器1 13460000 msc1 msc1 sdio sdio
控制器2 13490000 Msc2 msc2 msc1 msc1

驱动源码位置

驱动源码位于:

module_drivers/drivers/mmc/host/

├──sdhci.c
├──sdhci-ingenic.c
├──ingenic_sdio.c

设备树配置

设备树所在位置:

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

module_driver/dts-stage/x2000/x2000.dtsi

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

module_driver/dts/x2000/x2000.dtsi

msc0控制器描述:

msc0: msc@0x13450000 {

 compatible = "ingenic,sdhci";

 reg = <0x13450000 0x10000>;

 status = "disabled";

 interrupt-parent = <&core_intc>;

 interrupts = <IRQ_MSC0>;

};

msc1控制器描述:

msc1: msc@0x13460000 {

 compatible = "ingenic,sdhci";

 reg = <0x13460000 0x10000>;

 status = "disabled";

 interrupt-parent = <&core_intc>;

 interrupts = <IRQ_MSC1>;

};

msc2控制器描述:

msc2: msc@0x13490000 {

 compatible = "ingenic,sdhci";

 reg = <0x13490000 0x10000>;

 status = "disabled";

 interrupt-parent = <&core_intc>;

 interrupts = <IRQ_MSC2>;

};

设备树默认配置

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

EMMC

&msc0 {

 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 */

 wp-gpios = <0>;

 cd-gpios = <0>;

 ingenic,rst-gpios = <0>;

};

SDIO

&msc1 {

 status = "okay";

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

 pinctrl-0 = <&msc1_4bit>;

 pinctrl-1 = <&rtc32k_enable>;

 pinctrl-2 = <&rtc32k_disable>;

 sd-uhs-sdr104;

 max-frequency = <100000000>;

 bus-width = <4>;

 voltage-ranges = <1800 3300>;

 non-removable;

 ingenic,sdio_clk = <1>;

 keep-power-in-suspend;

 /* special property */

 ingenic,sdr-gpios = <0>;

 wp-gpios = <0>;

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

 bcmdhd_wlan: bcmdhd_wlan {

 compatible = "android,bcmdhd_wlan";

 ingenic,sdio-irq = <&gpd 0 IRQ_TYPE_LEVEL_HIGH INGENIC_GPIO_NOBIAS>;

 ingenic,sdio-reset = <&gpd 1 GPIO_ACTIVE_LOW INGENIC_GPIO_NOBIAS>;

 };

};

SD

&msc2 {

 status = "okay";

 pinctrl-names ="default";

 pinctrl-0 = <&msc2_4bit>;

 sd-uhs-sdr104;

 max-frequency = <200000000>;

 /*cd-inverted;*/

 bus-width = <4>;

 voltage-ranges = <1800 3300>;

 cd-gpios = <&gpc 12 GPIO_ACTIVE_LOW INGENIC_GPIO_NOBIAS>;

 /* special property */

 ingenic,sdr-gpios = <&gpc 0 GPIO_ACTIVE_HIGH INGENIC_GPIO_NOBIAS>;

 ingenic,rst-gpios = <0>;

};

设备树自定义配置

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 指定电压范围
wp-gpios 写保护
cd-gpios 卡检查
ingenic,rst-gpios 硬件reset

SDIO

属性名称说明
sd-uhs-sdr104 sdr104模式
max-frequency 通过配置该参数来指定当前模式下最大频率
bus-width 配置数据总线宽度,支持1bit、4bit、8bit
voltage-ranges 指定电压范围
ingenic,sdio_clk 选项用于设置手动调试MSC tx相位
keep-power-in-suspend 休眠保持供电
wp-gpios 写保护
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

属性名称说明
sd-uhs-sdr104 sdr104模式
max-frequency 通过配置该参数来指定当前模式下最大频率
cd-inverted 配置支持SD卡热插拔
bus-width 配置数据总线宽度,支持1bit、4bit、8bit
voltage-ranges 指定电压范围
ingenic,sdr-gpios 通过GPIO配置SD卡外部电路3.3V到1.8V电压切换
wp-gpios 配置CD pin用于SD卡检测
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控制器驱动配置

 Symbol: MMC_SDHCI_INGENIC [=y]

 Type : tristate

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

 Location:

 -> Ingenic device-drivers Configurations

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

 Depends on: MMC [=y]

 Selects: MMC_SDHCI [=y]

wifi驱动配置

Ingenic device-drivers Configurations

 SDIO-WIFI drivers

 <*> Broadcom FullMAC wireless cards support

 (/firmware/fw_bcm43456c5_ag.bin) Firmware path

 (/firmware/nvram_ap6256.txt) NVRAM path

 Enable Chip Interface (SDIO bus interface support) --->

 Interrupt type (Out-of-Band Interrupt) --->

内核自定义编译配置

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

内核版本差异

无

设备节点生成

EMMC

驱动加载成功:

[ 1.575803] mmc1: new ultra high speed SDR104 SDHC card at address aaaa

[ 1.593001] mmcblk0: mmc1:aaaa SC16G 14.8 GiB

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

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

产生设备节点:

/dev/mmcblk0 /dev/mmcblk0p1~p7 /*对应emmc的分区*/

SDIO

驱动加载成功:

[ 1.124644] Dongle Host Driver, version 1.363.59.144.11 (r) [ 1.124644] Compiled from [ 1.125120] Register interface [wlan0] MAC: 00:90:4c:11:22:33 [ 1.125120] [ 1.125195] dhd_module_init: Exit err=0

SD

驱动加载成功:

[ 1.575803] mmc1: new ultra high speed SDR104 SDHC card at address aaaa

[ 1.593001] mmcblk0: mmc1:aaaa SC16G 14.8 GiB

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

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

产生设备节点:

/dev/mmcblk0/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

}

2. 执行wifi_up.sh

# 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

3. 执行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配网测试

AirKiss是微信硬件平台为Wi-Fi设备提供的微信配网、局域网发现和局域网通讯的技术。

1. 配网

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

使用AirkissDubugger软件(手机端下载)配置wifi

2. 执行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

3. 执行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

2. 进入AP模式

# wifi_ap_mode_start.sh

wlan0: interface state UNINITIALIZED->ENABLED

wlan0: AP-ENABLED

3. 执行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)

4. 使用手机(或电脑)连接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

5. 连接成功,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