历史上的今天
返回首页

历史上的今天

今天是:2024年12月03日(星期二)

正在发生

2021年12月03日 | 购买开发板后在iTOP4412开发板上移植SDIO接口WIFI方法

2021-12-03 来源:eefocus

近期需要把WiFi无线网络功能移植到在iTOP4412 开发平台,查阅了相关资料,经过一段时间的研究、调试,终于成功,将WiFi功能移植到了开发板上面,这里笔者记录移植过程及注意事项,方便以后工作需要。


iTOP4412开发板的WiFi模块与板卡之间的连接采用SDIO接口,WiFi硬件模块使用的是MTK的MT6620芯片,MTK提供了Android4.0及Android4.4的driver, Porting Guid,有了这些就为我们的移植工作做了总体性的指导。

 

但是仅仅有MTK提供的文档还是远远不够的,毕竟硬件接口定义不同,kernel版本也不同,Android层与MTK提供的代码也有差异,这就需要我们在MTK文档的指导下, Step  by Step 进行 Porting 工作.

 

 

移植环境:

    1  iTOP4412 精英版 +  MT6620 WiFi模块

    2  kernel  3.0.15  version

    3  Android4.4.4  

4  Ubuntu12.04  64BIt 开发环境


1.2  硬件相关部分


下图为WiFi模块与开发板连接的引脚定义,通过该接口可以看出WiFi模块与CPU的交互接口.

 

查看WiFi模块的原理图可知,WiFi模块与CPU之间采用SDIO接口进行数据和命令的交互工作,Pin1,2,3,5,6,7 为SDIO接口,另外还需要Pin8,Pin10 UART 串口, 另外Pin18,Pin17用于串口流控,实际是可以不使用流控功能。 MT6620芯片是复合芯片,除了具备WiFi功能以后,还支持蓝牙,FM,GPS功能,他们与CPU之间的通信需要串口,另外MT6620固件补丁的下载也是通过串口进行的,所以说串口是必不可少的硬件接口,即使您只使用该芯片的WiFi功能。

 

除了SDIO接口,UART口以外,还需要与CPU进行交互的接口包括Pin16  PMU_EN ,使能引脚,默认低电平状态,高电平有效。

Pin15  WiFI_RESET引脚,默认低电平状态,高电平有效,用于复位WiFi芯片; 

Pin 13  WiFi INT  WiFI的中断引脚,用于告知CPU有数据来了;

 

以上这些引脚需要在BSP中配置,WiFI的驱动会通过这些引脚与MT6620芯片进行通信;

另外需要强调的是WiFi模块占用CPU的MMC3端口, 也可以说就是SDIO总线,关于MMC,SD,SDIO总线的来历这里不再描述,下图为核心板WiFi相关部分:



在iTOP4412 精英版中 mmc0,mmc1总线用于eMMC,mmc2用于TF卡,mmc3用于SDIO WiFi,关于wifi的其他硬件连接比如串口,使能(GPIO),复位(GPIO),中断(GPIO)这里不再贴出,具体的请查看开发板的原理图。

 

这里重点强调一下 HUB_CONNECT,也就是上图中的L5 引脚,该引脚复用为mmc总线的CD引脚,也就是Card Detect引脚,用于告知MMC3控制器有设备插入,属于中断引脚,我们需要把引脚与CPU的 某GPIO引脚连接:


以上为iTOP4412 底板原理图WiFi接口部分,请注意HUB_CONNECT引脚通过0欧电阻与6060_GPIO2进行了连接,6060_GPIO2为核心板GPIO引脚。

 

这样连接的目的是通过软件输出6060_GPIO2低电平,从而HUB_CONNECT引脚为低电平输入状态,MMC3控制认为有设备插入到了MMC3总线上面,原理同TF卡,SD卡的检测。

 

以上为进行Porting前的准备工作,当然需要万用表,示波器工具进行辅助的检测,查看WiFi模块的工作电压是否正常,GPIO的当前状态,MMC总线上面的时钟及是否有数据从MMC3控制器输出等等.

 

1.3  Kernel

1.3.1 概述

iTOP4412开发板采用的是Linux 3.0.15 版本,MTK官方给的移植Porting没有说明针对具体的 kernel版本,由于是Android4.4,所以kernel应该是3.0以后的版本或者更高支持;

 

首先按照PoringGuid的指导说明,把New和Modify文件夹下面关于kernel部分的修改放到我们的kernel代码里面,MT6620的驱动分两个部分, 一部分放在driver/misc/目录下面,文件夹名称 mediatek,里面存放的是WMT,既wireless manage tools, 里面提供了与MT6620  download  firmware patch ,enable /disable WIFi芯片,power on, power off操作的相关驱动部分, 及SDIO总线设备接口驱动Host Interface drivers,这些驱动工作正常后才开始加载WiFi 网络相关驱动。

 

我们以驱动库 .ko 的形式编译驱动模块,driver/misc/mediatek/ 库文件与WiFi网络库文件 列表如下::

 

mtk_hif_sdio.ko ----mmc总线相关接口,mmc总线发现SDIO设备,分配总线地址后,会与该驱动进行适配.适配成功后该驱动会调用WiFi网络驱动;

mtk_stp_uart.ko-----串口相关驱动,通过串口下载固件补丁,设置芯片参数;

mtk_stp_wmt.ko-----core 部分,提供WiFi上电,断电等等相关操作;

mtk_wmt_wifi.ko ----字符设备驱动,创建设备节点用于与用户空间交互; 

wlan_mt6620.ko -- -- WiFi网络相关驱动,不需要我们进行修改;

 

另外这里附一张MMC驱动框架图:

 

因为我们的MT6620模块挂载到了MMC总线上面,属于MMC子系统的工作实例,我们非常有必要熟悉一下mmc驱动架构,是我们移植工作的非常重要的一部分,关于MMC子系统的详细介绍这里不再说明.

 

 1.3.2 代码修改

 

1  根据硬件连接情况配置必要的平台资源

 

 修改文件:  kernel/iTop4412_Kernel_3.0/arch/arm/mach-exynos/mach-itop4412.c

 

 关键函数1: 该函数配置WiFi相关的GPIO引脚为初始化输出状态,或者配置为中断状态

            WIFI驱动会改变这些引脚的状态,这里仅仅是初始化.

 

   static void __init mtk_combo_init(void)

    {

 

        //MT66XX PMUEN

        if(gpio_request(EXYNOS4_GPC1(0), "GPC1_0"))

        {

                printk(KERN_ERR "failed to request GPC1_0 for MT6620  PMUEN controln");

        }

        //MT66XX SYSRST

        if(gpio_request(EXYNOS4_GPC1(1), "GPC1_1"))

        {

       printk(KERN_ERR "failed to request GPC1_1 for MT6620  SYSRST controln");

 

        }

        s3c_gpio_cfgpin(EXYNOS4_GPC1(0), S3C_GPIO_OUTPUT);

        s3c_gpio_cfgpin(EXYNOS4_GPC1(1), S3C_GPIO_OUTPUT);

 

        gpio_direction_output(EXYNOS4_GPC1(0), 0);

        gpio_direction_output(EXYNOS4_GPC1(1), 0);

 

 

        gpio_free(EXYNOS4_GPC1(0));

        gpio_free(EXYNOS4_GPC1(1));

 

        mdelay(5);

 

        //need config eint models for Wifi & BGA Interupt

        if (gpio_request(EXYNOS4_GPX2(5), "WiFi INT"))

                printk(KERN_WARNING "MT6620 WiFi INT(GPX2.5) Port request error!!!n");

        else    {

                s3c_gpio_setpull(EXYNOS4_GPX2(5), S3C_GPIO_PULL_NONE);

                s3c_gpio_cfgpin(EXYNOS4_GPX2(5), S3C_GPIO_SFN(0xF));

                gpio_free(EXYNOS4_GPX2(5));

        }

 

        if (gpio_request(EXYNOS4_GPX2(4), "BGF INT"))

                printk(KERN_WARNING "MT6620 BGA INT(GPX2.4) Port request error!!!n");

        else    {

                s3c_gpio_setpull(EXYNOS4_GPX2(4), S3C_GPIO_PULL_NONE);

                s3c_gpio_cfgpin(EXYNOS4_GPX2(4), S3C_GPIO_SFN(0xF));

                gpio_free(EXYNOS4_GPX2(4));

        }

 

        //normal it is high level

        if (gpio_request(EXYNOS4_GPX3(2),  "6260_GPIO2")!=0) {

             printk("[mt6620] ERROR:Cannot request 6260_GPIO2n");

         } else {

             gpio_direction_output(EXYNOS4_GPX3(2), 1);/* WLAN_CHIP_PWD */

             gpio_set_value(EXYNOS4_GPX3(2), 1);

             mdelay(100);

             gpio_free(EXYNOS4_GPX3(2));

}

 

    return; }


关键函数2: setup_mt6620_wlan_power_for_onoff

 

该函数为导出函数,WIFi驱动会调用该函数,该函数关键地方是让MMC控制器驱动扫描MMC总线上面的设备,MMC扫描到了WiFI模块才会加载相应的WiFi驱动,这里是主动让MMC扫描,我们的SD卡是采用中断触发的方式扫描,他们本质上都是扫描MMC总线上面的新设备,然后加载对应的设备驱动,具体的可以看一下MMC子系统相关内容.

 

函数所属文件: kernel/iTop4412_Kernel_3.0/arch/arm/mach-exynos/mach-itop4412.c

 

void setup_mt6620_wlan_power_for_onoff(int on)

{

    int chip_pwd_low_val;

    int outValue;

 

    printk("[mt6620] +++ %s : wlan power %sn",__func__, on?"on":"off");

 

#if 1

    if (on) {

         outValue = 0;

    } else {

        outValue = 1;

    }

 

   if (gpio_request(EXYNOS4_GPX3(2),  "6260_GPIO2")!=0) {

        printk("[mt6620] ERROR:Cannot request 6260_GPIO2n");

    } else {

        gpio_direction_output(EXYNOS4_GPX3(2), 1);/* WLAN_CHIP_PWD */

        gpio_set_value(EXYNOS4_GPX3(2), outValue);

        mdelay(100);

        gpio_free(EXYNOS4_GPX3(2));

   }

 

    if(on)

    {

     //need reset on mt6620 ? need test......

    }

#endif

 

    extern void sdhci_s3c_sdio_card_detect(struct platform_device *pdev);

 

   // mdelay(200);

 

   //need sdhc controler check wifi catd states......

   sdhci_s3c_sdio_card_detect(&s3c_device_hsmmc3);

 

   printk("[mt6620] --- %sn",__func__);

推荐阅读

史海拾趣

锋鸣电子(Fengming)公司的发展小趣事

随着新能源和储能市场的快速发展,福斯特公司也积极拓展相关业务领域。公司不仅关注光伏材料的研发和生产,还将目光投向了动力电池及储能领域。例如,公司推出的铝塑复合膜产品已完成一期2000万平米扩产项目,并计划未来进一步拓展至动力电池及储能领域。这一举措不仅丰富了公司的产品线,还为公司带来了新的增长点和发展机遇。同时,福斯特还加强与新能源产业链上下游企业的合作,共同推动新能源和储能产业的发展。

DIOTECH公司的发展小趣事

为了进一步提升市场份额和品牌影响力,DIOTECH公司开始加大市场拓展力度。通过参加国际电子展会、举办新品发布会等活动,公司成功吸引了全球范围内的客户和合作伙伴的关注。同时,公司还加强了品牌建设,通过一系列营销活动提升了品牌知名度和美誉度。这些努力使得DIOTECH逐渐成为了电子行业内的知名品牌。

Aten International公司的发展小趣事

在电子设备的日益增多的背景下,用户对于高效、便捷的设备管理需求愈发强烈。Aten International凭借其对连接技术的深入理解,成功研发出KVM切换器,该产品能够实现对多台计算机的控制,大大提高了工作效率。随着技术的不断进步,Aten International的KVM切换器不断更新迭代,从最初的简单切换功能,发展到现在的智能管理、远程操控等高级功能,成为了电子行业的一大亮点。

DAICO公司的发展小趣事

随着业务的不断发展,DAICO公司开始拓展全球市场。公司在全球范围内设立了多个办事处和生产基地,以便更好地服务客户。同时,DAICO还积极寻求与全球合作伙伴的合作共赢,共同推动电子行业的发展。通过与合作伙伴的紧密合作,DAICO在技术研发、市场开拓等方面取得了更加显著的成果。

ETA Electric Industry Co Ltd公司的发展小趣事

近年来,ETA Electric Industry Co Ltd积极响应全球环保倡议,致力于实现可持续发展。他们优化了生产流程,减少了废弃物和污染物的排放。同时,公司还加大了对环保型电子元器件的研发力度,推出了一系列节能、环保的新产品。这些举措不仅提升了公司的社会形象,也为其在激烈的市场竞争中增添了新的优势。

上述五个故事,讲述了ETA Electric Industry Co Ltd在电子行业的发展历程。从起步之初的艰难,到技术创新的突破,再到市场拓展和质量管理的成功,最后到对环保和可持续发展的追求,每一步都体现了公司的成长和进步。

Agilent Technologies公司的发展小趣事

在二十世纪末,ETA Electric Industry Co Ltd还只是一个小型的电子设备制造商,专注于生产简单的电子元器件。当时,公司的创始人李先生看到了电子行业快速发展的潜力,并决定投身于这一行业。最初,公司面临着资金紧张、技术落后、市场竞争加剧等诸多挑战。然而,李先生凭借其敏锐的市场洞察力和不懈的努力,逐渐打开了市场局面。他们通过与小型科技企业合作,为其提供定制化的电子元器件,逐渐在市场上站稳了脚跟。

问答坊 | AI 解惑

寻无线防丢器方案或兼职开发

315M到2.4G频率范围,双向带搜寻功能,有效距离在100米以内,一拖五到十. 请联系 陆先生 138 2355 1141…

查看全部问答>

转速传感器

转速传感器 [ 本帖最后由 xhe332523 于 2008-12-10 15:24 编辑 ]…

查看全部问答>

大家看看FPGA PCB调试通的

这个是我调试通的 EP2c8Q208 的FPGA 设计图哈…

查看全部问答>

FPGA设计思想与经验

FPGA设计思想与经验…

查看全部问答>

BSP函数注销不了。

最近在条MPC860系列的CPU的BSP文件,生成vxworks,下载到板上,总是死掉了。发现死在usrInit()里了,usrInit()里又有不少子函数,不知道死在哪个子函数里了。于是采用排查方式。但是一开始就有问题了。如下: void usrInit (int startType)&nb ...…

查看全部问答>

如何选择传感器

    我想买个采集脉搏信号的的传感器,与电源电路和放大滤波电路相连。大家帮我推荐几款便宜的吧?…

查看全部问答>

100分求put_Owner()出错问题!

这是我的源代码: void CNewAviTestDlg::OnButton1()      {    // TODO: Add your control notification handler code here    IGraphBuilder   *m_pGraph;       ...…

查看全部问答>

nandflash分区问题

现在的情况如下:我用的AT91sam9261的ARM+三星1G的Nandflash,现在是分为了一个32MB的作为内核的区,剩下的作为WINCE下使用,我现在是想把WINCE下面的这部分分成两块来分别使用,一块拿来存注册表,一块拿来存一些数据。请问有没有人做过类似的,或 ...…

查看全部问答>

在51上用C写一个计时的程序,碰到一个问题,哪里不对呢?

#include #define uchar unsigned char #define uint unsigned int sbit dula=P2^6; sbit wela=P2^7; uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; uchar code weitable ...…

查看全部问答>

一个不知道是CE还是ARM的问题?

现在有这样一个情况,有两个系统,A是votex86,B是ARM 7,A上跑CE 6,B上裸奔,A向B通过串口发送数据,串口采用115200bps,1停止位,1偶校验位. 现象是: A向B发送一个字节,B立刻向A回复两字节,如果在B上不做延时(大概进行1500次加法),A就不能保证收到B发送 ...…

查看全部问答>