連載-iMX6ULL 軟件定制應(yīng)用筆記 -4個實用案例操作指南
接上篇:連載-iMX6ULL 軟件定制應(yīng)用筆記 -9個知識點講解 點擊了解
本文以飛凌OKMX6ULL-S開發(fā)板為基礎(chǔ)講解,系統(tǒng)為Linux,一共總結(jié)了14個iMX6ULL小知識點,分三期完成,此為第三期
i.MX6ULL應(yīng)用筆記目錄
1.1 管腳復(fù)用的參數(shù)配置方法(PINMUX)
1.2 Windows下轉(zhuǎn)換開機LOGO圖片格式
1.3 8189es SDIO WIFI使用及測試
1.4 USB轉(zhuǎn)串口芯片的支持(PL2303)
1.5 增加串口
1.6 串口配置DMA
1.7 LCD轉(zhuǎn)LVDS模塊
1.8 LCD轉(zhuǎn)VGA模塊
1.9 硬浮點運算
1.10 OTG修改模式
1.11 使用EC20模塊實現(xiàn)4G-AP功能
1.12 SPI轉(zhuǎn)CAN接口
1.13 ADC接口
1.14 LCD的屏幕參數(shù)調(diào)整
正文開始
1.11 使用EC20模塊實現(xiàn)4G-AP功能
1. EC20 4G模塊撥號成功并分配IP,可連接外網(wǎng)。設(shè)置轉(zhuǎn)發(fā)規(guī)則:
root@freescale /$ ./quectel-CM & /*撥號,如果文件系統(tǒng)中無此應(yīng)用程序,請參考應(yīng)用筆記中源碼,交叉編譯之后,拷貝到文件系統(tǒng)中*/ echo 1 > /proc/sys/net/ipv4/ip_forward /* 打開 IP 轉(zhuǎn)發(fā) */ iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE /*eth2為4G 模塊識別出的網(wǎng)卡,設(shè)置轉(zhuǎn)發(fā)規(guī)則 */
2.設(shè)置WiFi的模式與IP確保模塊8723bu已經(jīng)加載。
ifconfig wlan0 up /*打開WiFi*/ ifconfig wlan0 192.168.0.10 netmask 255.255.255.0 /*設(shè)置IP與子網(wǎng)掩碼*/ ifconfig wlan0 promisc /*設(shè)置 wlan0 為混雜模式 */
3.開啟AP
udhcpd /etc/udhcpd.conf & /*WiFi 地址、網(wǎng)關(guān)等配置信息*/ /home/hostapd -d /etc/hostapd.conf & /*加密方式、用戶名、密碼等設(shè)置,此時用戶名為FORLINX,密碼為12345678 */
4. 手機等移動終端可以通過WiFi連接到FCU1101的AP熱點,訪問外網(wǎng)。
5. 如果使用的華為的ME-909s模塊,按軟件手冊中先進行撥號,再配置iptables轉(zhuǎn)發(fā)規(guī)則,即可實現(xiàn)通過4G模塊實現(xiàn)熱點功能。
1.12 SPI轉(zhuǎn)CAN接口
1.其中SPI部分驅(qū)動參考“SPI接口”部分。
2.首先搜索一下iMX6ULL-S是否自帶mcp2515驅(qū)動。
neo@ubuntu:~$ cd drivers neo@ubuntu: ~/drivers $ find -name "mcp25*" ./net/can/spi/mcp251x.c neo@ubuntu: ~/drivers $ vi ./net/can/Makefile
在Makefile中添加相應(yīng)配置:
obj-$(CONFIG_CAN_MCP251X) += mcp251x.o
3.在配置文件arch/arm/config/imx6ull_defconfig中設(shè)置CONFIG_CAN_MCP251X=y.
4.同時需要配置設(shè)備樹。
配置clock時鐘:
clocks{ mcp251x_clock : mcp251x_clock{ compatible = “fixed-clock”; #clock-cells = <0>; clock-frequency = <8000000>; }; };
配置參考電壓
reg_can_3v3: regulator@0 { compatible = "regulator-fixed"; reg = <0>; regulator-name = "can-3v3"; regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>; gpios = <&gpio_spi 3 GPIO_ACTIVE_LOW>; startup-active-us = <20000>; enable-active-high; };
配置PIN MUX:
pinctrl_ecspi2: ecspi2grp { fsl,pins = < MX6UL_PAD_CSI_DATA03__ECSPI2_MISO 0x100b1 MX6UL_PAD_CSI_DATA02__ECSPI2_MOSI 0x100b1 MX6UL_PAD_CSI_DATA00__ECSPI2_SCLK 0x100b1 >; }; pinctrl_ecspi2_cs: ecspi2_csgrp { fsl, pins = < MX6UL_PAD_CSI_DATA01__GPIO4_IO22 0x80000000 >; }; pinctrl_can: can { fsl, pins = < MX6UL_PAD_ CSI_DATA07__ GPIO4_IO28 0x100b1 >; };
配置ecspi2的配置項:
&ecspi2{ compatible = "fsl,imx51-ecspi"; fsl,spi-num-chipselects = <1>; cs-gpios = <gpio4 22 0>; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_ecspi2>,<&pinctrl_ecspi2_cs>; status = "okay"; can0: mcp2515@0 { pinctrl-names = "default"; compatible = "microchip,mcp2515"; pinctrl-0 = <&pinctrl_can>; cs-gpios = <&gpio4 22 0>; reg = <0>; status = "okay"; spi-max-frequency = <10000000>; clocks = <&mcp251x_clock>; interrupt-parent = <&gpio4>; interrupts = <28 0x2>; vdd-supply = <reg_can_3v3>; xceiver-supply = <reg_can_3v3>; }; }
5. 驗證
步驟1:按軟件手冊編譯內(nèi)核和設(shè)備樹。注意查看編譯完內(nèi)核之后,是否在drivers/spi/下生成spi-imx.o,是否在drivers/net/can/下生成mcp251x.o,如果沒生成,查看配置是否出錯?生成*.o文件說明已經(jīng)編譯進內(nèi)核。
步驟2 :替換燒寫工具中的設(shè)備樹和內(nèi)核,重新燒寫。開機選擇剛替換的設(shè)備樹。
步驟3 :此ecspi2驅(qū)動加載成功之后,cat /sys/bus/spi/devices/spi1.0/modalias會出現(xiàn)spi:mcp2515。
步驟4 :查看打印信息是否生成can0節(jié)點。
1.13 ADC接口
以將電阻觸摸的4路觸摸用作ADC為例。
1. 查看IMX6ULLRM.pdf手冊中Chapter 13.2有:
采用GPIO1_IO01、GPIO1_IO02、GPIO1_IO03、GPIO1_IO04作為四路ADC。
2. 怎么查找用哪個驅(qū)動,采用config中的哪個進行配置呢?
3. 查找ADC的驅(qū)動和配置選項。
設(shè)備樹文件arch/arm/boot/dts/imx6ull-14x14-evk.dts中有
#include <dt-bindings/input/input.h> #include "imx6ull.dtsi"
打開imx6ul.dtsi文件,此文件為通用設(shè)備樹配置文件
adc1: adc@02198000 { compatible = "fsl,imx6ul-adc", "fsl,vf610-adc"; reg = <0x02198000 0x4000>; interrupts = <GIC_SPI 100 IRQ_TYPE_LEVEL_HIGH>; clocks = <&clks IMX6UL_CLK_ADC1>; num-channels = <9>; clock-names = "adc"; status = "disabled"; };
在drviers路徑下查找相關(guān)文件,如下:
neo@ubuntu:~$ grep "fsl,vf610-adc" -nr Binary file built-in.o matches Binary file iio/built-in.o matches Binary file iio/adc/built-in.o matches Binary file iio/adc/vf610_adc.o matches iio/adc/vf610_adc.c:596: { .compatible = "fsl,vf610-adc", },
查看drives/spi/Makefile文件。此文件將adc路徑下的驅(qū)動文件和配置文件中具體哪個配置聯(lián)系起來。vf610_adc.c文件編譯之后為vf610_adc.o文件。
obj-$(CONFIG_VF610_ADC) += vf610_adc.o
查看6ULL-S的配置文件arch/arm/config/imx6ull_defconfig中CONFIG_VF610_ADC=y。
查看drivers/iio/Makefile中,要編譯ADC下的文件,需要有:
obj-y += adc/
查看`,要編譯iio下的文件,需要有:
obj-$(CONFIG_IIO) += iio/
查看6ul emmc的配置文件arch/arm/config/imx6ull_defconfig中CONFIG_IIO=y。
至此驅(qū)動配置完成。
4. 修改設(shè)備樹文件arch/arm/boot/dts/imx6ull-14x14-evk.dts,添加adc1.
&adc1 { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_adc1>; vref-supply = <®_vref_3v3>; status = "okay"; };
需要用到參考電壓,添加reg_vref_3v3,如圖:
reg_vref_3v3: regulator@3 { compatible = "regulator-fixed"; regulator-name = "vref-3v3"; regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>; reg = <3>; };
在&iomuxc中添加所用到的具體引腳。此處關(guān)于上下拉電阻配置部分,參考“PINMUX說明”部分進行設(shè)置。如圖:
pinctrl_adc1: adc1grp { fsl,pins = < MX6UL_PAD_GPIO1_IO01__GPIO1_IO01 0xb0 MX6UL_PAD_GPIO1_IO02__GPIO1_IO02 0xb0 MX6UL_PAD_GPIO1_IO03__GPIO1_IO03 0xb0 MX6UL_PAD_GPIO1_IO04__GPIO1_IO04 0xb0 >; };
并將其他復(fù)用GPIO1_IO01、GPIO1_IO02、GPIO1_IO03、GPIO1_IO04的地方注釋掉或者disabled。
5. 編譯生成dtb zImage,編譯內(nèi)核,查看drivers/iio/adc/是否生成vf610_adc.o,如果生成,已編譯進內(nèi)核。如果未生成,查看是否配置出錯?
6. 替換dtb zImage,并燒寫,啟動。
7. 查看開發(fā)板/dev下有節(jié)點iio:device0,則驅(qū)動加載成功。
或者進入cd /sys/bus/iio/devices/iio\:device0/路徑查看。
1.14 LCD的屏幕參數(shù)調(diào)整
以修改4.3吋為3.5吋屏為例。
1.修改內(nèi)核設(shè)備樹。
arch/arm/boot/dts/imx6ull-S-emmc-480x272r4dot3.dts找到&lcdif。
&lcdif { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_lcdif_dat &pinctrl_lcdif_ctrl>; display = <&display0>; status = "okay"; display0: display { bits-per-pixel = <24>; bus-width = <24>; display-timings { native-mode = <&timing0>; timing0: timing0 { clock-frequency = <9000000>; hactive = <480>; vactive = <272>; hfront-porch = <2>; hback-porch = <2>; hsync-len = <41>; vback-porch = <2>; vfront-porch = <2>; vsync-len = <10>; hsync-active = <0>; vsync-active = <0>; de-active = <1>; pixelclk-active = <0>; }; }; }; };
2.參考屏體手冊中有:
3.修改設(shè)備樹中
其中clock-frequency= fframe*(hfront+hback+hsync+xres)*(vfront+vback+vsync+yres)其中fframe=60
&lcdif { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_lcdif_dat &pinctrl_lcdif_ctrl>; display = <&display0>; status = "okay"; display0: display { bits-per-pixel = <24>; bus-width = <24>; display-timings { native-mode = <&timing0>; timing0: timing0 { clock-frequency = <6410256>; hactive = <320>; vactive = <240>; hfront-porch = <20>; hback-porch = <38>; hsync-len = <30>; vback-porch = <15>; vfront-porch = <4>; vsync-len = <3>; hsync-active = <0>; vsync-active = <0>; de-active = <1>; pixelclk-active = <1>; }; }; }; };
4.編譯dtb文件。
neo@ubuntu:~$ make dtbs
生成arch/arm/boot/dts/imx6ull-S-emmc-320x240r3dot5.dts替換燒寫工具中的dtb中文件。燒寫。在uboot選擇5-4.3吋屏。重啟。發(fā)現(xiàn)uboot顯示不正常,內(nèi)核顯示正常。
5.如果發(fā)現(xiàn)屏幕閃爍,根據(jù)分頻設(shè)置,適當調(diào)整頻率。
clock-frequency = <6410256>;
或未在中心位置。微調(diào)下面6個參數(shù)。
hfront-porch = <20>; hback-porch = <38>; hsync-len = <30>; vback-porch = <15>; vfront-porch = <4>; vsync-len = <3>;
6. 修改文件系統(tǒng)目錄下/etc/rc.d/qt_env.sh,根據(jù)實際需求調(diào)整QWS_SIZE的大小。
相關(guān)產(chǎn)品 >
-
OKMX6ULL-S開發(fā)板
iMX6ULL是飛凌新近推出的一款開發(fā)板,iMX6ULL與iMX6UL開發(fā)板相比,功能無區(qū)別完全兼容,配置升級,性能高,價格低。根據(jù)介紹可看出i.MX6ULL參數(shù)豐富 ,采用NXP i.MX6ULL處理器芯片,郵票孔封裝,支持Linux系統(tǒng),i.MX6ULL開發(fā)板資料豐富,方便二次開發(fā)設(shè)計。
了解詳情 -
FETMX6ULL-S核心板
飛凌新出的一款采用NXP高性能、高效、低成本處理器的核心板—FETMX6ULL-S核心板,i.MX6ULL核心板采用郵票孔連接方式,ARM Cortex-A7內(nèi)核,原生兩路網(wǎng)口,兩路Can和八路串口,可以和多種設(shè)備同時通訊。i.MX6ULL核心板支持工業(yè)級和擴展商業(yè)級兩種配置,并且經(jīng)過了高低溫測試的檢驗,iMX6ULL核心板采用Linux4.1.15+Qt5.6操作系統(tǒng),方便開發(fā)自己的應(yīng)用程序。 了解詳情 -
FETMX6ULL-C核心板
FETMX6ULL-C核心板采用NXP i.MX6ULL處理器開發(fā)設(shè)計,是一款高性能Linux核心板,采用低功耗的ARM Cortex-A7架構(gòu),運行速度高達800MHz。iMX6ULL核心板29*40mm ,iMX6ULL這款處理器功能接口資源豐富,供貨周期長。
了解詳情 -
OKMX6ULL-C開發(fā)板
40*29mm,雙網(wǎng)雙CAN,8路串口| i.MX6ULL開發(fā)板是基于NXP i.MX6ULL設(shè)計開發(fā)的的一款Linux開發(fā)板 ,主頻800MHz,體積小,其核心板僅40*29mm,采用板對板連接器,適應(yīng)場景豐富。 了解詳情