Я хочу управлять выходом с пина P8.03. В файле настроек режимов пинов клеммы p8 мы находим соответствующую строчку:
PIN PROC PINCTRL ADDR NAME MODE0 ... MODE7
3 R9 0x018 gpmc_ad6 gpmc_ad6 ... gpio1[6]
Его текущее состояние мультиплексирования получаем следующим образом:
cat /sys/kernel/debug/pinctrl/44e10800.pinmux/pins | pager
Вывод:
pin 6 (44e10818.0) 00000031 pinctrl-single
Значение устанавливается в файле am335x-bone-pinmux-emmc.dtsi :
pinmux_emmc_pins { pinctrl-single,pins = <0x80 0x32 0x84 0x32 0x0 0x31 0x4 0x31 0x8 0x31 0xc 0x31 0x10 0x31 0x14 0x31 0x18 0x31 0x1c 0x31>; linux,phandle = <0x2c>; phandle = <0x2c>;}
Значение 0x8 формируется следующим образом (AM335x Sitara Processors
Technical Reference Manual section 9.3.1.50 table 9-60):
В соответствии с таблицей по умолчанию пин P8_03 выставлен в состояние 0x31 (110001). Это режим 1 (MODE1). Пин может записывать (pullup/down enabled) и может читать (receive enabled), изначально находится в состоянии логической единицы (pullup). Установим пин в значение 0x17 (010111), в котором он способен записывать уровень (pullup/down enabled), по умолчанию установлен в единицу (pullup) и работает в режиме 7 (MODE7 - gpio1[6]). Файл device tree с изменениями:
pinmux_emmc_pins {
pinctrl-single,pins = <0x80 0x32 0x84 0x32 0x0 0x31 0x4 0x31 0x8 0x31 0xc 0x31 0x10 0x31 0x14 0x31 0x18 0x17 0x1c 0x31>;
linux,phandle = <0x2c>;
phandle = <0x2c>;
};
Настроим пин GPIO P8_03. Посмотреть текущие пины GPIO можно так:
ls /sys/class/gpio
Вывод:
export gpiochip0 gpiochip32 gpiochip64 gpiochip96 unexport
Порядковый номер пина, соответствующий gpio1[6], получается примерно следующим образом - GPIO1_6 соответствует (1*32) + 6 = 38. Нужный нам пин gpio38 не присутствует в списке. Для взаимодействия с пином его нужно экспортировать:
cd /sys/class/gpio
echo 38 > export
Теперь список выглядит следующим образом:
export gpio38 gpiochip0 gpiochip32 gpiochip64 gpiochip96 unexport
Настроим пин:
cd gpio38
ls
Вывод:
active_low device direction edge power subsystem uevent value
1. Текущее направление передачи (cat direction):
in
Настроим на вывод значения:
echo out > direction
cat direction
Вывод:
out
2. Текущее значение (cat value):
0
Установим значение логической единицы:
Вывод:
1
Соответствие значения value реальности можно проверить с помощью осциллографа.
PIN PROC PINCTRL ADDR NAME MODE0 ... MODE7
3 R9 0x018 gpmc_ad6 gpmc_ad6 ... gpio1[6]
Его текущее состояние мультиплексирования получаем следующим образом:
Вывод:
pin 6 (44e10818.0) 00000031 pinctrl-single
Значение устанавливается в файле am335x-bone-pinmux-emmc.dtsi :
pinmux_emmc_pins { pinctrl-single,pins = <0x80 0x32 0x84 0x32 0x0 0x31 0x4 0x31 0x8 0x31 0xc 0x31 0x10 0x31 0x14 0x31 0x18 0x31 0x1c 0x31>; linux,phandle = <0x2c>; phandle = <0x2c>;}
Значение 0x8 формируется следующим образом (AM335x Sitara Processors
Technical Reference Manual section 9.3.1.50 table 9-60):
Bit | 1 | 0 |
5 | Receive Enabled | Receive Disabled |
4 | Pullup | Pulldown |
3 | Pullup/down Disabled | Pullup/down Enabled |
2,1,0 | Mode |
В соответствии с таблицей по умолчанию пин P8_03 выставлен в состояние 0x31 (110001). Это режим 1 (MODE1). Пин может записывать (pullup/down enabled) и может читать (receive enabled), изначально находится в состоянии логической единицы (pullup). Установим пин в значение 0x17 (010111), в котором он способен записывать уровень (pullup/down enabled), по умолчанию установлен в единицу (pullup) и работает в режиме 7 (MODE7 - gpio1[6]). Файл device tree с изменениями:
pinmux_emmc_pins {
pinctrl-single,pins = <0x80 0x32 0x84 0x32 0x0 0x31 0x4 0x31 0x8 0x31 0xc 0x31 0x10 0x31 0x14 0x31 0x18 0x17 0x1c 0x31>;
linux,phandle = <0x2c>;
phandle = <0x2c>;
};
Настроим пин GPIO P8_03. Посмотреть текущие пины GPIO можно так:
ls /sys/class/gpio
Вывод:
export gpiochip0 gpiochip32 gpiochip64 gpiochip96 unexport
Порядковый номер пина, соответствующий gpio1[6], получается примерно следующим образом - GPIO1_6 соответствует (1*32) + 6 = 38. Нужный нам пин gpio38 не присутствует в списке. Для взаимодействия с пином его нужно экспортировать:
cd /sys/class/gpio
echo 38 > export
Теперь список выглядит следующим образом:
export gpio38 gpiochip0 gpiochip32 gpiochip64 gpiochip96 unexport
Настроим пин:
cd gpio38
ls
Вывод:
active_low device direction edge power subsystem uevent value
Мы можем настроить параметры пина.
1. Текущее направление передачи (cat direction):
in
Настроим на вывод значения:
echo out > direction
cat direction
Вывод:
out
2. Текущее значение (cat value):
0
Установим значение логической единицы:
echo 1 > value
сat value
Вывод:
1
Соответствие значения value реальности можно проверить с помощью осциллографа.
Источники:
Комментариев нет:
Отправить комментарий