加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權(quán)保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

ElfBoard技術(shù)貼|如何在NXP源碼基礎(chǔ)上適配ELF 1開發(fā)板的六軸傳感器

10/30 21:53
1650
閱讀需 16 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

本次源碼適配項目是基于NXP i.MX6ULL EVK評估板Linux內(nèi)核源碼(特定版本Linux-imx_4.1.15)展開的。核心目標(biāo)是調(diào)整功能接口及引腳配置,以確保其與ELF 1開發(fā)板兼容,接下來將以六軸傳感器的適配作為具體示例,深入解析整個適配的流程。

一、 準(zhǔn)備工作

NXP源碼路徑:ELF1開發(fā)板資料包7-NXP 原廠資料7-1 NXP官方源碼linux-imx-imx_4.1.15_2.0.0_ga.tar.bz2

1、將NXP源碼拷貝到開發(fā)環(huán)境home/root/work目錄下解壓

elf@ubuntu:~/work$ tar jvxf linux-imx-imx_4.1.15_2.0.0_ga.tar.bz2
elf@ubuntu:~/work$ cd linux-imx-imx_4.1.15_2.0.0_ga/
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ ls

?

2、添加默認(rèn)配置文件

將arch/arm/configs路徑下的imx_v7_mfg_defconfig復(fù)制一份,命名為imx6ull_elf1_defconfig:

elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ cp arch/arm/configs/imx_v7_mfg_defconfig arch/arm/configs/imx6ull_elf1_defconfig

?

3、添加ELF 1設(shè)備樹

將arch/arm/boot/dts路徑下的imx6ull-14x14-evk.dts復(fù)制一份,命名為imx6ull-elf1-emmc.dts:

elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ cp arch/arm/boot/dts/imx6ull-14x14-evk.dts arch/arm/boot/dts/imx6ull-elf1-emmc.dts

?

打開arch/arm/boot/dts/Makefile,找到CONFIG_SOC_IMX6ULL,將imx6ull-elf1-emmc.dts添加到Makefile中:

elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ vi arch/arm/boot/dts/Makefile

?

4、建立交叉編譯腳本

建立一個編譯腳本build.sh

elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ vim build.sh

?

添加以下內(nèi)容,保存退出:
#!/bin/bash
export CPUS=`grep -c processor /proc/cpuinfo` 
source /opt/fsl-imx-x11/4.1.15-2.0.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi
make distclean
make imx6ull_elf1_defconfig
make -j${CPUS}
rm -rf ./.tmp
make modules_install INSTALL_MOD_PATH=./.tmp/rootfs/
cd .tmp/rootfs/
tar -jcvf modules.tar.bz2 *

?

給予腳本權(quán)限:
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ chmod 777 build.sh

?

二、適配六軸傳感器

SPI是串行外設(shè)接口(Serial Peripheral Interface)的縮寫,是一種高速的,全雙工,同步的通信總線。SPI的通信以主從方式工作,一般需要4根線,MISO(主設(shè)備數(shù)據(jù)輸入)、MOSI(主設(shè)備數(shù)據(jù)輸出)、SCLK(時鐘)、CS(片選)。i.MX6ULL有4路SPI接口,ELF 1開發(fā)板使用了SPI1連接到六軸傳感器icm20607上。

1、硬件原理

原理圖中可以看到,六軸傳感器相連的引腳分別為:時鐘SPI1_SCLK、片選SPI1_SS0、輸出SPI1_MOSI、輸入SPI1_MISO、中斷ICM-20607_INT,分別對應(yīng)的PAD NAME為LCD_DATA20、LCD_DATA21、LCD_DATA22、LCD_DATA23(六軸傳感器的中斷引腳沒有用到,所以此處不進行配置)。由于ELF 1開發(fā)板的LCD采用的是RGB565,空出來的8位數(shù)據(jù)線可以用作其他功能。

2、IOMUX配置

在arch/arm/boot/dts/imx6ul-pinfunc.h中找到相關(guān)宏:

MX6UL_PAD_LCD_DATA20__ECSPI1_SCLK
MX6UL_PAD_LCD_DATA21__GPIO3_IO26
MX6UL_PAD_LCD_DATA22__ECSPI1_MOSI
MX6UL_PAD_LCD_DATA23__ECSPI1_MISO

?

在設(shè)備樹文件arch/arm/boot/dts/imx6ull-elf1-emmc.dts的IOMUX節(jié)點下添加子節(jié)點(暫時先不添加中斷引腳,目前沒有用到中斷):
pinctrl_ecspi1: ecspi1grp {
                      fsl,pins = <
                      MX6UL_PAD_LCD_DATA20__ECSPI1_SCLK       0x10b0
                      MX6UL_PAD_LCD_DATA21__GPIO3_IO26         0x10b0
                      MX6UL_PAD_LCD_DATA22__ECSPI1_MOSI       0x10b0
                      MX6UL_PAD_LCD_DATA23__ECSPI1_MISO       0x10b0
                        >;
                };

?

效果如下:

?

在添加IOMUX之后,需要檢查設(shè)備樹是否有其它地方復(fù)用了LCD_DATA20,LCD_DATA21,LCD_DATA22,LCD_DATA23。

打開arch/arm/boot/dts/imx6ull-elf1-emmc.dts文件,搜索引腳PAD NAME,在&iomux的子節(jié)點pinctrl_lcdif_dat節(jié)點下搜索到以下幾個引腳的復(fù)用,將其注釋掉:

/*     MX6UL_PAD_LCD_DATA20__LCDIF_DATA20  0x79
      MX6UL_PAD_LCD_DATA21__LCDIF_DATA21  0x79
MX6UL_PAD_LCD_DATA22__LCDIF_DATA22  0x79
MX6UL_PAD_LCD_DATA23__LCDIF_DATA23  0x79     */
效果如下:

?

3、設(shè)備節(jié)點配置

在arch/arm/boot/dts/imx6ull.dtsi中已經(jīng)存在了spi接口的相關(guān)節(jié)點ecspi1-ecspi4,只需要在arch/arm/boot/dts/imx6ull-elf1-emmc.dts文件中引用相關(guān)節(jié)點,并在該節(jié)點下添加子節(jié)點spidev0:
&ecspi1 {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_ecspi1>;
        fsl,spi-num-chipselects = <1>;
        cs-gpios = <&gpio3 26 GPIO_ACTIVE_LOW>;
        status = "okay";
        
        spidevicm: icm20607@0{
                compatible = "elf,icm20607";
                spi-max-frequency = <8000000>;
                reg = <0>;
         };
};

?

效果如下:

?

4、添加icm20607驅(qū)動

(1)將ELF1開發(fā)板資料包2-Linux 源代碼2-1 驅(qū)動源碼1_icm20607icm20607.c拷貝到內(nèi)核源碼的drivers/misc/路徑下。

?

(2)將ELF1開發(fā)板資料包2-Linux 源代碼2-1 驅(qū)動源碼1_icm20607icm20607.h拷貝到內(nèi)核源碼的include/linux路徑下。

?

(3)修改Kconfig

elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ vi drivers/misc/Kconfig

?

添加以下內(nèi)容:

config ICM20607
        tristate "SPI device ICM20607"
        depends on SPI && SYSFS
        help
          If you say yes here,you get support for the icm20607
效果如下:

?

(4)修改Makefile

elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ vi drivers/misc/Makefile

?

添加以下內(nèi)容:

obj-$(CONFIG_ICM20607)          += icm20607.o

?

效果如下:

(5)將icm20607驅(qū)動編譯進內(nèi)核
使用make menuconfig打開圖形化配置界面:
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ make menuconfig
找到以下位置,選擇Y編譯進內(nèi)核:
Device Drivers 
-> Misc devices

(6)替換配置文件
通過make menuconfig修改的內(nèi)容寫入到了.config文件,當(dāng)使用make imx6ull_elf1_defconfig配置內(nèi)核源碼時,.config文件會被覆蓋,因此,需要替換原有的imx6ull_elf1_defconfig。
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ cp .config arch/arm/configs/imx6ull_elf1_defconfig

?

5、編譯

elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ ./build.sh

將編譯生成的zImage和imx6ull-elf-emmc.dtb拷貝到ELF 1開發(fā)板的/run/media/mmcblk1p1 路徑下:

elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ scp arch/arm/boot/zImage   root@172.16.0.175:/run/media/mmcblk1p1/
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ scp arch/arm/boot/dts/imx6ull-elf1-emmc.dtb root@172.16.0.175:/run/media/mmcblk1p1/
保存并重啟開發(fā)板:
root@ELF1~# sync
root@ELF1~# reboot

?

三、六軸傳感器測試

1、查看/dev下是否生成了設(shè)備節(jié)點,若生成則表示驅(qū)動適配成功

2、使用以下測試程序測試六軸傳感器是否可以正確讀到數(shù)據(jù)。

root@ELF1:~# elf1_cmd_icm20607

可以看到,六軸傳感器能夠成功讀取原始數(shù)據(jù)并將其轉(zhuǎn)換為有效的實際值。所有傳感器的讀數(shù)均在合理范圍內(nèi),表明設(shè)備功能正常。
至此,就完成了基于NXP源碼對ELF 1開發(fā)板六軸傳感器的適配工作。希望這份詳盡指南能夠為各位小伙伴提供實際的幫助,在探索嵌入式技術(shù)的旅程中,讓我們一同開啟無限可能。

相關(guān)推薦

電子產(chǎn)業(yè)圖譜