连载-iMX6ULL 软件定制应用笔记 -4个使用案例

本文以飞凌OKMX6ULL-S开发板为基础讲解,系统为Linux,一共总结了14个iMX6ULL小知识点,分三期完成,此为第三期

i.MX6ULL应用笔记目录
1.1 管脚复用的参数配置方法(PINMUX)
1.2 Windows下转换开机LOGO图片格式
1.3 8189es SDIO WIFI使用及测试
1.4 USB转串口芯片的支持(PL2303)
1.5 增加串口
1.6 串口配置DMA
1.7 LCD转LVDS模块
1.8 LCD转VGA模块
1.9 硬浮点运算
1.10 OTG修改模式
1.11 使用EC20模块实现4G-AP功能
1.12 SPI转CAN接口
1.13 ADC接口
1.14 LCD的屏幕参数调整


正文开始

1.11 使用EC20模块实现4G-AP功能

1. EC20 4G模块拨号成功并分配IP,可连接外网。设置转发规则:

root@freescale /$ ./quectel-CM & /*拨号,如果文件系统中无此应用程序,请参考应用笔记中源码,交叉编译之后,拷贝到文件系统中*/echo 1 > /proc/sys/net/ipv4/ip_forward /* 打开 IP 转发 */iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE /*eth2为4G 模块识别出的网卡,设置转发规则 */

2.设置WiFi的模式与IP确保模块8723bu已经加载。

ifconfig wlan0 up /*打开WiFi*/ifconfig wlan0 192.168.0.10 netmask 255.255.255.0 /*设置IP与子网掩码*/ ifconfig wlan0 promisc /*设置 wlan0 为混杂模式 */

3.开启AP

udhcpd /etc/udhcpd.conf & /*WiFi 地址、网关等配置信息*/ /home/hostapd -d /etc/hostapd.conf & /*加密方式、用户名、密码等设置,此时用户名为FORLINX,密码为12345678 */

4. 手机等移动终端可以通过WiFi连接到FCU1101的AP热点,访问外网。

5. 如果使用的华为的ME-909s模块,按软件手册中先进行拨号,再配置iptables转发规则,即可实现通过4G模块实现热点功能。

1.12  SPI转CAN接口

1.其中SPI部分驱动参考“SPI接口”部分。

2.首先搜索一下iMX6ULL-S是否自带mcp2515驱动。

neo@ubuntu:~$ cd drivers neo@ubuntu: ~/drivers $ find -name "mcp25*" ./net/can/spi/mcp251x.c neo@ubuntu: ~/drivers $ vi ./net/can/Makefile

在Makefile中添加相应配置:

obj-$(CONFIG_CAN_MCP251X) += mcp251x.o

3.在配置文件arch/arm/config/imx6ull_defconfig中设置CONFIG_CAN_MCP251X=y.

4.同时需要配置设备树。

配置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:按软件手册编译内核和设备树。注意查看编译完内核之后,是否在drivers/spi/下生成spi-imx.o,是否在drivers/net/can/下生成mcp251x.o,如果没生成,查看配置是否出错?生成*.o文件说明已经编译进内核。

步骤2 :替换烧写工具中的设备树和内核,重新烧写。开机选择刚替换的设备树。

步骤3 :此ecspi2驱动加载成功之后,cat /sys/bus/spi/devices/spi1.0/modalias会出现spi:mcp2515。

步骤4 :查看打印信息是否生成can0节点。

1.13  ADC接口

以将电阻触摸的4路触摸用作ADC为例。

1. 查看IMX6ULLRM.pdf手册中Chapter 13.2有:

采用GPIO1_IO01、GPIO1_IO02、GPIO1_IO03、GPIO1_IO04作为四路ADC。

2. 怎么查找用哪个驱动,采用config中的哪个进行配置呢?

3. 查找ADC的驱动和配置选项。

设备树文件arch/arm/boot/dts/imx6ull-14x14-evk.dts中有

#include <dt-bindings/input/input.h>#include "imx6ull.dtsi"

打开imx6ul.dtsi文件,此文件为通用设备树配置文件

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路径下查找相关文件,如下:

neo@ubuntu:~$ grep "fsl,vf610-adc" -nrBinary file built-in.o matchesBinary file iio/built-in.o matchesBinary file iio/adc/built-in.o matchesBinary file iio/adc/vf610_adc.o matchesiio/adc/vf610_adc.c:596:        { .compatible = "fsl,vf610-adc", },

查看drives/spi/Makefile文件。此文件将adc路径下的驱动文件和配置文件中具体哪个配置联系起来。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。

至此驱动配置完成。

4. 修改设备树文件arch/arm/boot/dts/imx6ull-14x14-evk.dts,添加adc1.

&adc1 {    pinctrl-names = "default";pinctrl-0 = <&pinctrl_adc1>;vref-supply = <&reg_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中添加所用到的具体引脚。此处关于上下拉电阻配置部分,参考“PINMUX说明”部分进行设置。如图:

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                    >;        };

并将其他复用GPIO1_IO01、GPIO1_IO02、GPIO1_IO03、GPIO1_IO04的地方注释掉或者disabled。

5. 编译生成dtb zImage,编译内核,查看drivers/iio/adc/是否生成vf610_adc.o,如果生成,已编译进内核。如果未生成,查看是否配置出错?

6. 替换dtb zImage,并烧写,启动。

7. 查看开发板/dev下有节点iio:device0,则驱动加载成功。

或者进入cd /sys/bus/iio/devices/iio\:device0/路径查看。

1.14  LCD的屏幕参数调整

以修改4.3吋为3.5吋屏为例。

1.修改内核设备树。

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.修改设备树中

其中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吋屏。重启。发现uboot显示不正常,内核显示正常。

5.如果发现屏幕闪烁,根据分频设置,适当调整频率。

clock-frequency = <6410256>;

或未在中心位置。微调下面6个参数。

hfront-porch = <20>;hback-porch = <38>;hsync-len = <30>;vback-porch = <15>;vfront-porch = <4>;vsync-len = <3>;

6. 修改文件系统目录下/etc/rc.d/qt_env.sh,根据实际需求调整QWS_SIZE的大小。

(0)

相关推荐

  • RoboMaster TT 无人机microPython编程.3

    只是积木的功能少而已,事实上,代码编写是少不了的. 这里我们用vscode来编写 设备快速连接(串口.网络.USB) 支持基于 MicroPython 的代码智能补全与语法检查 支持 MicroPyt ...

  • F1C100S添加SPI LCD液晶驱动

    https://www.cnblogs.com/listenscience/p/13619930.html在使用F1C100S的时候常常会使用小尺寸的液晶屏,比如市场上比较常见的1.14寸液晶屏,下面 ...

  • /spidev@0x00: buggy DT: spidev listed directly in DT

    https://blog.csdn.net/wxxgoodjob/article/details/76572346 一.spidev介绍 如果在内核中配置spidev,会在/dev目录下产生设备节点, ...

  • ESP32芯片IO解读

    我们使用一个开发板最重要得就是知道引脚得定义.所以我们有必要查到精确的资料,这篇文章很有用.也是我日后要查找得文章. 首先我们要明确一点,其实板子那么大,有用的就是这个核心的芯片这个芯片上面的引脚引出 ...

  • 【Linux笔记】Pinctrl子系统与GPIO子系统

    前言 之前我们已经通过几篇笔记来学习点灯了: [Linux笔记]LED驱动程序 [Linux笔记]LED驱动实验(总线设备驱动模型) [Linux笔记]设备树实例分析 但之前的点灯实验我们都得去跟一些 ...

  • iMX8MQ如何在SPI总线上添加设备-飞凌嵌入式干货分享

    SPI接口设备是一款使用率较高的设备,在用户使用OKMX8MQ-C时可能需要添加新的SPI设备,或者将现有的SPI设备从当前的总线上更换到别的总线上,或更换片选. 对于SPI驱动不熟悉的人可能不是很了 ...

  • spidev测试方法 /how to test spidev

    在设备树中配置spidev https://elixir.bootlin.com/linux/v5.2.2/source/Documentation/spi/spidev 首先需要在设备树配置好spi ...

  • GPIO 软件框架

    GPIO 八种工作模式详解 接着上一篇的讲,我们上一篇研究了 GPIO 的硬件结构,其来源于 STM32 官方手册,研究了 GPIO 的八种工作模式和推挽输出及开漏输出原理,接下来我们研究 GPIO ...

  • 【Linux笔记】LED驱动程序

    前言 学STM32我们从点灯开始,学Linux驱动我们自然也要点个灯来玩玩,尽量在从这些基础例程中榨取知识,细抠.细抠,为之后更复杂的知识打好基础. 与硬件无关的LED驱动 回顾hello驱动程序,我 ...

  • STM32F1系列之常用外设说明

    STM32F1系列之常用外设说明