环球电气之家-午夜精彩视频-中国专业电气电子产品行业服务网站!

產品分類

當前位置: 首頁 > 工業電子產品 > 其他電子產品 > 開發板,套件,編程器 > 開發板

類型分類:
科普知識
數據分類:
開發板

為Freescale i.MX6處理器移植ART

發布日期:2022-10-14 點擊率:82

i.MX6是Freescale推出的ARM架構高端多媒體處理器,與常規的ARM處理器不同的是,i.MX6具有非常實用的PCI Express接口,這對于從事WiFi行業的人士來說具有非常大的吸引力。通常的基于WLAN SoC進行無線產品設計,很難具備高性能多媒體處理能力;通常的基于ARM處理器進行多媒體處理器平臺設計,又很難實現高性能無線傳輸。i.MX6的出現使得高性能無線多媒體平臺的設計大大簡化。其實此前也使用過TI AM3894進行無線媒體服務器的設計,但是其過大的發熱量極大地限制了其應用,Mindspeed公司也具有PCI-e接口的ARM處理器,但畢竟不是主流廠商,所以i.MX6深深地贏得了廣大工程師的喜愛,包括我本人。

說了這么多,開始進入本文的主題。做過Qualcomm Atheros平臺的讀者一定知道,WiFi產品出廠前需要在產線通過復雜的產測環節,主要包括射頻校準,測試,參數寫入等步驟,未寫入射頻參數的WiFi產品是無法正常使用的。如果是基于Qualcomm Atheros WLAN SoC做的無線產品,官方會有移植完成的ark.ko內核模塊,nart.out應用程序及各種所需的庫文件,Freescale i.MX6不在官方支持的范圍內。因此,如果想順利產測,就必須自行移植驅動程序及測試程序。

鄭重聲明:本文關于驅動移植部分寫得很不專業,并且是以流水賬的方式記錄,主要是想幫助面臨同樣問題的讀者,所以還請讀者海涵。

1 此前調試i.MX6驅動程序時已經搭建好i.MX6的開發環境,因此本文不進行搭建過程的描述,讀者可以訪問https://www.witimes.com/imx6-build-environment/了解大致過程。

2 首先編譯art.ko 模塊。將ART2 2.28源代碼解壓在ltib/rpm/BUILD目錄下 ,進入driver/linux目錄,更改makefile.artmod文件,指定Linux內核路徑及工具鏈的路徑,如下:

KDIR:=/home/tom/ltib/rpm/BUILD/linux-3.0.35
PWD:=$(shell pwd)
ROOTDIR:=$(PWD)/modules
ifeq($(ARM),1)
ARC:=arm
CROSS_CC:=/opt/freescale/usr/local/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro
toolchain/bin/arm-none-linux-gnueabi-
DEBUG:=0
endif

其中,將DEBUG改為1可以開啟調試模式。

3 使用make –f makefile.artmod命令即可開始編譯,但是會遇到很多的問題。

3.1. error: 'phys_t' undeclared (first use in this function),含義是phys_t數據類型未定義,查看Atheros SDK中關于phys_t數據類型的定義,將phys_t的定義復制到/modules/include/ dk_flash.h中,此錯誤不再出現。

3.2. modules/dk_func.c:468:2: error: unknown field 'ioctl' specified in initializer,這是由于2.6.36內核之后 去掉了原來的ioctl,添加兩個新的成員,所以會出錯:

long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
long (*compat_ioctl) (struct file *, unsigned int, unsigned long);

修改modules/ dk_func.c中的ioctl為compat_ioctl,編譯通過。

3.3 modules/dk_event.c:21:26: error: 'SPIN_LOCK_UNLOCKED' undeclared here (not in a function),含義是SPIN_LOCK_UNLOCKED未聲明,修改modules/dk_event.c中的

spinlock_t driver_lock = SPIN_LOCK_UNLOCKED;

static DEFINE_SPINLOCK(driver_lock);

編譯通過,得到art.ko。

4 將編譯得到的art.ko模塊下載到目標板中,insmod art.ko命令插入模塊,出現一條錯誤信息“Could not find flash device!”,這是flash_init()函數報出的錯誤??紤]到PCIe網卡的驅動程序不應該初始化Flash設備,因為PCIe網卡的校準信息保存在EEPROM或者OTP中,推測必定有配置錯誤導致了這條錯誤信息。

5 仔細閱讀makfile.artmod文件,發現意一條重要的注釋信息“Making generic AP art module build. This build target is used for 3rd party AP processor”,即“編譯用于第三方處理器的目標文件”,對應的編譯命令為

make ARCH=$(ARC) PB42=1 DEBUG=$(DEBUG) CROSS_COMPILE=$(CROSS_CC) -C $(KDIR) M=$(PWD)/modules modules

很明顯,問題就出在這里。再次編譯,得到了可以正確加載的內核模塊。

6 接下來就是nart的移植。遇到了諸多的問題。

6.1 /home/tom/ltib/rpm/BUILD/art2_ver_2_20ap_src/art/../wlan/hal/nartlinux/ah_osdep.h:93:15: error: conflicting types for 'va_list',

/opt/freescale/usr/local/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin/../arm-fsl-linux-gnueabi/multi-libs/usr/include/stdio.h:80:20: note: previous declaration of 'va_list' was here,含義為va_list數據類型定義沖突。既然工具鏈中已經定義了va_list,那么最簡單的辦法自然是屏蔽nart中對于va_list的定義,更改wlan/hal/nartlinux/ah_osdep.h文件

#ifndef __LINUX_POWERPC_ARCH__
//typedef void *va_list;
#endif

再次編譯,問題不再出現。

6.2 uint32_t數據類型未聲明的錯誤,我的解決辦法是將uint32_t類型重命名為uint32_imx,并修改nart源碼中所有涉及到uint32_t的部分。

6.3 經過6.1,6.2的調整,編譯過程可以完成大部分,但在最后的link環節,出現了大堆的關于readl,writel的錯誤。折騰了大概1天的時間,此問題一直沒有解決。

7 由于本人水平十分有限,所以不得不放棄在ART2 2.28版本上的嘗試,開始使用ART2 4.6版本,好在這個版本未在link環節,現了關于readl,writel的錯誤,順利地得到nart.out及各種庫文件。

8 將第7步得到的art.ko ,nart.out及各種庫文件下載到目標板中,nart.out可以正常運行。然而悲劇的是,更大的問題來了。每當我嘗試使用artgui load dut時,總會出現“Error: get version ioctl failed !”,這個問題大概困擾了我3-4天的時間。期間非常仔細地閱讀了源代碼得知這條打印信息出現在get_version_info()函數中:

    if ((status=get_version_info(hDevice, pDrvVer)) != A_OK) {
                close(hDevice);
        A_FREE(pdevInfo->pdkInfo);
        A_FREE(pdevInfo);
        return status;
}

說明,如果get_version_info()返回的不是OK,則關閉設備,這部分代碼出現在common/linux_hw.c中。get_version_info()在get_device_client_info()中被調用,get_device_client_info()在deviceInit()中被調用看字面意思就是初始化設備,deviceInit()在setupDevice()函數中被調用。跟蹤調試get_version_info(),發現其通過以下語句獲得version的值

if (ioctl(hDevice,DK_IOCTL_GET_VERSION,&version) < 0)

那么問題應該就是出在ioctl函數這里。

9 是時候了解一下ioctl函數了(做驅動開發的讀者可不要見笑,哈哈)。ioctl是設備驅動程序中對設備的I/O通道進行管理的函數。所謂對I/O通道進行管理,就是對設備的一些特性進行控制,例如串口的傳輸波特率、馬達的轉速等等。它的調用方式如下:

int ioctl(int fd, ind cmd, …);

其中fd是用戶程序打開設備時使用open函數返回的文件標示符,cmd是用戶程序對設備的控制命令,至于后面的省略號,那是一些補充參數,一般最多一個,這個參數的有無和cmd的意義相關。

ioctl函數是文件結構中的一個屬性分量,就是說如果你的驅動程序提供了對ioctl的支持,用戶就可以在用戶程序中使用ioctl函數來控制設備的I/O通道。

分析一下nart代碼,的確符合這樣的調用過程,下圖(不知道原作者是哪位,如有侵權,請聯系無線時代)很好地展示了這一過程。

ioctl

那么,根據本人的粗淺理解,用戶空間的ioctl調用通過內核向驅動程序傳遞了fd,cmd兩個重要參數,其余的參數是可選的。那么ioctl(hDevice,DK_IOCTL_GET_VERSION,&version)主要就是將hDevice及DK_IOCTL_GET_VERSION命令傳遞給驅動程序,其中DK_IOCTL_GET_VERSION定義在driver/linux/modules/include/dk_ioctl.h中。查看驅動程序中對于cmd的處理

                switch (cmd) {
                        case DK_IOCTL_GET_VERSION:
#ifdef DK_DEBUG
                                printk("DK:: DK_IOCTL_GET_VERISION n");
#endif
                                data = (DRV_MAJOR_VERSION << 16) | (DRV_MINOR_VERSION);
                                ret = put_user(data, (INT32 *)arg);
                                break;
                        case DK_IOCTL_GET_CLIENT_INFO:
#ifdef DK_DEBUG
                                printk("DK:: DK_IOCTL_GET_CLIENT_INFO n");
#endif

在驅動程序的編譯過程中已經開啟了DEBUG功能,那么應該打印出“DK:: DK_IOCTL_GET_VERISION”這條信息,然而實際的log中并不存在——ioctl沒有將參數傳遞至驅動程序!

10 回想3.2中的改動,一定引起了內核與驅動程序不匹配,才導致fd及cmd無法正確傳遞,看來2.3中的改動無法根本解決問題,需要對驅動程序進行大幅度調整才行。可是想想自己的軟件水平,實在是對自己沒有信心。

然而,我承諾的事情一定兌現,絕不能輕易放棄。

萬般無奈之下,我想到了Qualcomm Atheros的IPQ8064也是ARM架構,如果Qualcomm想在自己的Demo板上運行ART,就必須經歷同樣的過程!于是托朋友弄到了最新版本的nart及驅動程序源代碼,此處不便透露版本信息,需要做的主要工作就是仿照AP148的config文件及makefile文件編寫Freescale i.MX6的config文件及makefile文件,問題終于解決!

11 以下是nart正常運行dut上的打印信息。

NART-DUT

以下是artgui的截圖。

ARTGUI

使用artgui讀取EEPROM,發現其內容完全正確,其中MAC地址為“7C:C3:A1:B7:F2:5B”。

正常加載ath9k驅動程序,MAC地址同樣為“7C:C3:A1:B7:F2:5B”,至此,為Freescale i.MX6處理器移植ART驅動程序已全部完成。

下一篇: PLC、DCS、FCS三大控

上一篇: Qualcomm Atheros QCA

推薦產品

更多
主站蜘蛛池模板: 深圳激光打标机_激光打标机_激光焊接机_激光切割机_同体激光打标机-深圳市创想激光科技有限公司 深圳快餐店设计-餐饮设计公司-餐饮空间品牌全案设计-深圳市勤蜂装饰工程 | 植筋胶-粘钢胶-碳纤维布-碳纤维板-环氧砂浆-加固材料生产厂家-上海巧力建筑科技有限公司 | TTCMS自助建站_网站建设_自助建站_免费网站_免费建站_天天向上旗下品牌 | 玉米加工设备,玉米深加工机械,玉米糁加工设备.玉米脱皮制糁机 华豫万通粮机 | 智能电表|预付费ic卡水电表|nb智能无线远传载波电表-福建百悦信息科技有限公司 | 光泽度计_测量显微镜_苏州压力仪_苏州扭力板手维修-苏州日升精密仪器有限公司 | 柴油发电机组_柴油发电机_发电机组价格-江苏凯晨电力设备有限公司 | 油冷式_微型_TDY电动滚筒_外装_外置式电动滚筒厂家-淄博秉泓机械有限公司 | 升降机-高空作业车租赁-蜘蛛车-曲臂式伸缩臂剪叉式液压升降平台-脚手架-【普雷斯特公司厂家】 | 专业深孔加工_东莞深孔钻加工_东莞深孔钻_东莞深孔加工_模具深孔钻加工厂-东莞市超耀实业有限公司 | 壹车网 | 第一时间提供新车_资讯_报价_图片_排行! | 中国品牌门窗网_中国十大门窗品牌_著名门窗品牌 | 博医通医疗器械互联网供应链服务平台_博医通 | 探伤仪,漆膜厚度测试仪,轮胎花纹深度尺厂家-淄博创宇电子 | 不锈钢管件(不锈钢弯头,不锈钢三通,不锈钢大小头),不锈钢法兰「厂家」-浙江志通管阀 | 烽火安全网_加密软件、神盾软件官网 | 气动隔膜泵-电动隔膜泵-循环热水泵-液下排污/螺杆/管道/化工泵「厂家」浙江绿邦 | 联系我们老街华纳娱乐公司官网19989979996(客服) | 澳门精准正版免费大全,2025新澳门全年免费,新澳天天开奖免费资料大全最新,新澳2025今晚开奖资料,新澳马今天最快最新图库 | 浙江宝泉阀门有限公司| 金属雕花板_厂家直销_价格低-山东慧诚建筑材料有限公司 | 一体化隔油提升设备-餐饮油水分离器-餐厨垃圾处理设备-隔油池-盐城金球环保产业发展有限公司 | 餐饮加盟网_特色餐饮加盟店_餐饮连锁店加盟 | 北京印刷厂_北京印刷_北京印刷公司_北京印刷厂家_北京东爵盛世印刷有限公司 | 耐驰泵阀管件制造-耐驰泵阀科技(天津)有限公司 | 合肥汽车充电桩_安徽充电桩_电动交流充电桩厂家_安徽科帝新能源科技有限公司 | 山东螺杆空压机,烟台空压机,烟台开山空压机-烟台开山机电设备有限公司 | 刺绳_刀片刺网_刺丝滚笼_不锈钢刺绳生产厂家_安平县浩荣金属丝网制品有限公司-安平县浩荣金属丝网制品有限公司 | ET3000双钳形接地电阻测试仪_ZSR10A直流_SXJS-IV智能_SX-9000全自动油介质损耗测试仪-上海康登 | 西安微信朋友圈广告投放_微信朋友圈推广_西安度娘网络科技有限公司 | 透平油真空滤油机-变压器油板框滤油机-滤油车-华之源过滤设备 | 皮带输送机-大倾角皮带输送机-皮带输送机厂家-河南坤威机械 | BAUER减速机|ROSSI-MERSEN熔断器-APTECH调压阀-上海爱泽工业设备有限公司 | 沈阳缠绕膜价格_沈阳拉伸膜厂家_沈阳缠绕膜厂家直销 | 光谱仪_积分球_分布光度计_灯具检测生产厂家_杭州松朗光电【官网】 | 浙江富广阀门有限公司| 专注提供国外机电设备及配件-工业控制领域一站式服务商-深圳市华联欧国际贸易有限公司 | EDLC超级法拉电容器_LIC锂离子超级电容_超级电容模组_软包单体电容电池_轴向薄膜电力电容器_深圳佳名兴电容有限公司_JMX专注中高端品牌电容生产厂家 | 钢衬四氟管道_钢衬四氟直管_聚四氟乙烯衬里管件_聚四氟乙烯衬里管道-沧州汇霖管道科技有限公司 | 章丘丰源机械有限公司 - 三叶罗茨风机,罗茨鼓风机,罗茨风机 | 碳纤维复合材料制品生产定制工厂订制厂家-凯夫拉凯芙拉碳纤维手机壳套-碳纤维雪茄盒外壳套-深圳市润大世纪新材料科技有限公司 |