|
本帖最后由 RigoLigo 于 2024-9-20 18:06 编辑
这个问题是前几天群友提出来的,具体的环境是新世界Uboot+旧世界LoongOS(当时还没有另一个大佬移植的新世界AIC8800驱动,所以WiFi是用旧世界系统测试的)当时以为SDIO1驱动有问题(Uboot设备树是没初始化SDIO1的),后来发现TF版在进系统后能识别TF卡,证明SDIO这部分并没有问题。
从原理图上可以看到(2K0300_99PAI_V1.1_0531 第8页),WiFi模块的12脚连接到一个叫WLAN_EN的网络,连接到的是2K0300的TIM1_CH1引脚,查阅2K0300手册可知这个脚是GPIO81。由于手头没有万用表,用DSLogic逻辑分析仪探测,这个引脚确实是低电平。在Linux中使用GPIO功能可以激活这个引脚,但重启后会复位到低电平。
由于Linux中似乎并没有给MMC
子系统留有片选IO口的能力,需要自己改一下内核源码。- // 文件:(旧世界内核)drivers/mmc/host/ls2kmci.c
- // 需要添加这个头文件
- #include <linux/of_gpio.h>
- static int ls2k_mci_probe(struct platform_device *pdev)
- {
- // 省略……
- hotpug_host = host;
- local_irq_save(flags);
- if (request_irq(host->irq, ls2k_mci_irq, 0, DRIVER_NAME, host)) {
- dev_err(&pdev->dev, "failed to request mci interrupt.\n");
- ret = -ENOENT;
- goto probe_iounmap;
- }
- // 以下是加入的代码
- host->cs_gpio = of_get_named_gpio(pdev->dev.of_node, "cs-gpios", 0);
- if (gpio_is_valid(host->cs_gpio)) {
- gpio_direction_output(host->cs_gpio, 1);
- printk("%s: Toggled CS GPIO = 1 for %s\n", __func__, mmc_hostname(mmc));
- } else {
- printk("%s: Cannot get CS GPIO for %s\n", __func__, mmc_hostname(mmc));
- }
- // 以上是加入的代码
复制代码 上面这个基本就是让龙芯MMC驱动能读取一个cs-gpios属性来得到一个用于片选的GPIO引脚;当然应该还要判断是否存在这个属性,不过只是测试用途就没有写,欢迎各位继续折腾。
设备树里相应添加一个:
- // 文件:(旧世界内核)arch/loongarch/boot/dts/loongson/loongson_2k0300_pai_99_wifi.dts
- &sdio1{
- status = "okay";
- pinctrl-names = "default";
- pinctrl-0 = <&sdio1_6bit>;
- cs-gpios = <&gpa5 1 GPIO_ACTIVE_HIGH>;
- };
复制代码 重点就是加的cs-gpios那一行,我也没怎么玩过DTS,这个只能说是能用。改完之后编译内核启动应该就能加载WiFi驱动了,WiFi模块下面那个电阻应该能测到高电平。
|
|