SD/SDIO 接口
模块功能介绍
MMC是一种可高度配置和可编程的高性能移动存储主控制器。
x1600使用的ap6212芯片。 AP6212是基于BCM4340A1方案的集成wifi和bluetooth的功能模块,它包括用于WiFi的SDIO接口,和用于蓝牙的UART/PCM接口。
GPIO功能描述:
SDIO
| Name | I/O | Funtion |
| SDIO | GPIO-(PB12~PB17) | FUNTION0 |
| WL_REG_ON | GPIO-PC28 | |
| WL_WAKE_HOST | GPIO-PB04 |
SD
| Name | I/O | Funtion |
| MSC0_CLK | GPIO-PD00 | FUNTION0 |
| MSC0_CMD | GPIO-PD01 | FUNTION0 |
| MSC0_DATA | GPIO-(PD02~PD05) | FUNTION0 |
EMMC
| Name | I/O | Funtion |
| MSC0_CLK | GPIO-PD00 | FUNTION0 |
| MSC0_CMD | GPIO-PD01 | FUNTION0 |
| MSC0_DATA | GPIO-(PD02~PD05) | FUNTION0 |
注:默认不配置为EMMC卡模式,可以自行配置
MSC控制器命名对应关系:
| 控制器 | Base | bootrom | kernel | pm-spec | hardware-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测试方法
配置网络方法
/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
}执行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
执行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设备提供的局域网发现和局域网通讯的技术。
AirKissdemo配网
注:以下操作必须在WIFI(外网)环境下配置
执行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
执行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模式使用方法
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
进入AP模式
/# wifi_ap_mode_start.sh 脚本路径为 /usr/bin/wifi_ap_mode_start.sh 注意: 使用wifi_ap_mode_start.sh脚本前需要修改,如下图所示: 0 wlan0: interface state UNINITIALIZED->ENABLED wlan0: AP-ENABLED
执行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)
使用手机(或电脑)连接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
连接成功,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