ADC(Analog-to-Digital Converter),顧名思義就是模數(shù)轉(zhuǎn)換器。i.MX6ULL有兩組12位ADC,ADC1和ADC2,每一組ADC有10路輸入引腳(ADC1和ADC2共同復(fù)用這10路,所以實際一共10路ADC)。ELF?1只用了一個ADC1引腳連接到可變電阻上,用來演示ADC功能。
硬件原理
使用的是ADC1_IN5,對應(yīng)的PAD NAME是GPIO1_IO05。
IOMUX配置
在iomuxc節(jié)點下添加子節(jié)點:
pinctrl_adc1: adc1grp { ????????????????????????fsl,pins = < ????????????????????????????????MX6UL_PAD_GPIO1_IO05__GPIO1_IO05 0x00b0 ????????????????????????>; ????????????????}; |
添加設(shè)備節(jié)點
在arch/arm/boot/dts/imx6ull.dtsi文件中已經(jīng)存在adc1節(jié)點:
在compatible屬性中有兩個驅(qū)動匹配項,"fsl,imx6ul-adc","fsl,vf610-adc",實際上在我們的內(nèi)核源碼中沒有"fsl,imx6ul-adc"對應(yīng)驅(qū)動,所以我們使用的是"fsl,vf610-adc"驅(qū)動。
reg是ADC1對應(yīng)的一些寄存器的起始地址和這些寄存器所占用的長度;
interrupts = <GIC_SPI 100 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clks IMX6UL_CLK_ADC1>:開啟時鐘
num-channels = <2>:開啟ADC的通道,這里默認設(shè)置的是開啟ADC1_IN0和ADC1_IN1。
clock-names = "adc":時鐘名稱。
status = disable:默認是關(guān)閉狀態(tài)。
我們需要在arch/arm/boot/dts/imx6ull-elf1-emmc.dts中,增加和修改adc1節(jié)點配置:
&adc1 { ????????pinctrl-names = "default"; ????????pinctrl-0 = <&pinctrl_adc1>; ????????num-channels = <6>; ????????vref-supply = <®_adc1_vref>; ????????status = "okay"; }; |
num-channels = <6>:因為我們使用的是ADC1_IN5,所以,需要開啟6路ADC通道。
vref-supply = <®_adc1_vref>;adc的參考電壓,引用了reg_adc1_vref節(jié)點,我們還需要在regulators節(jié)點下添加reg_adc1_vref子節(jié)點:
?reg_adc1_vref: regulator@2 { ????????????????compatible = "regulator-fixed"; ????????????????regulator-name = "vref-3v3"; ????????????????regulator-min-microvolt = <3300000>; ????????????????regulator-max-microvolt = <3300000>; ????????????????}; |
添加驅(qū)動
使用make menuconfig打開圖形化配置界面:
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$?make menuconfig |
在Device Drivers菜單下添加:
Device Drivers -> Industrial I/O support -> Analog to digital converters |
路徑下添加vf610驅(qū)動:
替換配置文件
通過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 |
編譯測試
編譯內(nèi)核和設(shè)備樹并拷貝到開發(fā)板:
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$?./build.sh 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/ |
進行sync操作后重啟開發(fā)板:
在/sys/bus/iio/devices/iio:device0下發(fā)現(xiàn)in_voltage5_raw:
root@ELF1:~#?ls /sys/bus/iio/devices/iio:device0 |
使用cat in_voltage5_raw查看ADC1_IN5的值:
root@ELF1:~#?cat?/sys/bus/iio/devices/iio:device0/in_voltage5_raw 950 |
調(diào)節(jié)可變電阻,可觀察該值的變化,因為ADC為12位精度,所以該值的范圍為0~4095。