本次源碼適配項目是基于NXP i.MX6ULL EVK評估板的Linux內核源碼(特定版本Linux-imx_4.1.15)展開的。核心目標是調整功能接口及引腳配置,以確保其與ELF 1開發板兼容,接下來將以六軸傳感器的適配作為具體示例,深入解析整個適配的流程。
一、 準備工作
NXP源碼路徑:ELF1開發板資料包\07-NXP 原廠資料\07-1 NXP官方源碼\linux-imx-imx_4.1.15_2.0.0_ga.tar.bz2
1、將NXP源碼拷貝到開發環境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、添加默認配置文件
將arch/arm/configs路徑下的imx_v7_mfg_defconfig復制一份,命名為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設備樹
將arch/arm/boot/dts路徑下的imx6ull-14x14-evk.dts復制一份,命名為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
添加以下內容,保存退出:
#!/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 *
給予腳本權限:
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ chmod 777 build.sh
二、適配六軸傳感器
SPI是串行外設接口(Serial Peripheral Interface)的縮寫,是一種高速的,全雙工,同步的通信總線。SPI的通信以主從方式工作,一般需要4根線,MISO(主設備數據輸入)、MOSI(主設備數據輸出)、SCLK(時鐘)、CS(片選)。i.MX6ULL有4路SPI接口,ELF 1開發板使用了SPI1連接到六軸傳感器icm20607上。
1、硬件原理
從原理圖中可以看到,六軸傳感器相連的引腳分別為:時鐘SPI1_SCLK、片選SPI1_SS0、輸出SPI1_MOSI、輸入SPI1_MISO、中斷ICM-20607_INT,分別對應的PAD NAME為LCD_DATA20、LCD_DATA21、LCD_DATA22、LCD_DATA23(六軸傳感器的中斷引腳沒有用到,所以此處不進行配置)。由于ELF 1開發板的LCD采用的是RGB565,空出來的8位數據線可以用作其他功能。
2、IOMUX配置
在arch/arm/boot/dts/imx6ul-pinfunc.h中找到相關宏:
MX6UL_PAD_LCD_DATA20__ECSPI1_SCLK MX6UL_PAD_LCD_DATA21__GPIO3_IO26 MX6UL_PAD_LCD_DATA22__ECSPI1_MOSI MX6UL_PAD_LCD_DATA23__ECSPI1_MISO
在設備樹文件arch/arm/boot/dts/imx6ull-elf1-emmc.dts的IOMUX節點下添加子節點(暫時先不添加中斷引腳,目前沒有用到中斷):
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之后,需要檢查設備樹是否有其它地方復用了LCD_DATA20,LCD_DATA21,LCD_DATA22,LCD_DATA23。
打開arch/arm/boot/dts/imx6ull-elf1-emmc.dts文件,搜索引腳PAD NAME,在&iomux的子節點pinctrl_lcdif_dat節點下搜索到以下幾個引腳的復用,將其注釋掉:
/* 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、設備節點配置
在arch/arm/boot/dts/imx6ull.dtsi中已經存在了spi接口的相關節點ecspi1-ecspi4,只需要在arch/arm/boot/dts/imx6ull-elf1-emmc.dts文件中引用相關節點,并在該節點下添加子節點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驅動
(1)將ELF1開發板資料包\02-Linux 源代碼\02-1 驅動源碼\01_icm20607\icm20607.c拷貝到內核源碼的drivers/misc/路徑下。
(2)將ELF1開發板資料包\02-Linux 源代碼\02-1 驅動源碼\01_icm20607\icm20607.h拷貝到內核源碼的include/linux路徑下。
(3)修改Kconfig
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ vi drivers/misc/Kconfig
添加以下內容:
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
添加以下內容:
obj-$(CONFIG_ICM20607) += icm20607.o
效果如下:
(5)將icm20607驅動編譯進內核使用make menuconfig打開圖形化配置界面:
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ make menuconfig
找到以下位置,選擇Y編譯進內核:
Device Drivers -> Misc devices
(6)替換配置文件通過make menuconfig修改的內容寫入到了.config文件,當使用make imx6ull_elf1_defconfig配置內核源碼時,.config文件會被覆蓋,因此,需要替換原有的imx6ull_elf1_defconfig。
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ cp .config arch/arm/configs/imx6ul\l_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開發板的/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/
保存并重啟開發板:
root@ELF1~# sync root@ELF1~# reboot
三、六軸傳感器測試
1、查看/dev下是否生成了設備節點,若生成則表示驅動適配成功
2、使用以下測試程序測試六軸傳感器是否可以正確讀到數據。
root@ELF1:~# elf1_cmd_icm20607
可以看到,六軸傳感器能夠成功讀取原始數據并將其轉換為有效的實際值。所有傳感器的讀數均在合理范圍內,表明設備功能正常。
至此,就完成了基于NXP源碼對ELF 1開發板六軸傳感器的適配工作。希望這份詳盡指南能夠為各位小伙伴提供實際的幫助,在探索嵌入式技術的旅程中,讓我們一同開啟無限可能。
-
單片機
+關注
關注
6037文章
44558瀏覽量
635229 -
嵌入式
+關注
關注
5082文章
19123瀏覽量
305151 -
NXP
+關注
關注
60文章
1278瀏覽量
184224 -
開發板
+關注
關注
25文章
5050瀏覽量
97456
發布評論請先 登錄
相關推薦
評論