![]() |
|
|
#1 |
|
Senior Member
Регистрация: 17.02.2013
Адрес: Харьков
Сообщений: 235
Вес репутации: 690 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Может возникнуть потребность отключения UART, для того чтобы можно было использовать TX и RX в качестве GPIO.
Дело в том, что на процессорах AR71xx/AR913x/AR724X/AR933X - UART по умолчанию заблокирован и использует внутренние ресурсы (буфер, прерывание) для взаимодействия с драйвером. Так вот, есть возможность отключить внутренний UART простым скриптом, без необходимости патчить/перекомпилировать прошивку ![]() Устанавливаем io: Код:
opkg update && opkg install io Код:
touch /usr/sbin/uart_gpio Код:
#!/bin/sh
# Bitwise operations: & = And, | = Or, ^ = xOr, << = Left Shift
detect_addr="0x18060090"
rev_id_maj_msk="0xfff0"
func_addr="0x18040028"
bit1="1<<1" # using bit1 for AR724x/AR933x
bit8="1<<8" # using bit8 for AR71xx/AR913x
detect_value=0x`io -4 $detect_addr | cut -f3 -d' '`
detected_result=$(printf "0x%4.4x" $(($detect_value & $rev_id_maj_msk)))
func_value=0x`io -4 $func_addr | cut -f3 -d' '`
# depending on the detected rev_id of CPU -
# it will be use specific bit# as case_bit variable, or exit
case "$detected_result" in
# AR7240/AR7241/AR7242/AR9330/AR9331
0x00c0 | \
0x0100 | \
0x1100 | \
0x0110 | \
0x1110 )
case_bit=$bit1
;;
# AR71xx/AR913x
0x00a0 | \
0x00b0 )
case_bit=$bit8
;;
# AR9341/AR9342/AR9344
0x0120 | \
0x1120 | \
0x2120 )
echo -e "No need to disable UART on AR934x processors,\n \
just use sysfs to reprogram GPIOs."
break
exit 0
;;
* )
echo "Can't detect your CPU, must be Atheros!"
break
exit 1
;;
esac
# we using Bitwise xOr operation to switching bit# state (0 or 1)
io -4 $func_addr $(printf "0x%8.8x" $(($func_value ^ $case_bit)))
# read bit# state and depending on the state - print some info
if [ $(($func_value & $case_bit)) = $(($case_bit)) ]; then
echo "Hardware UART is turned OFF"
# You can use this line for automatic configuring GPIOs via sysfs
# or you can load other modules that use these GPIOs
else
echo "Hardware UART is turned ON"
fi
Код:
chmod +x /usr/sbin/uart_gpio Конечно оно отключает UART до следующей перезагрузки устройства, т.е. необходимо автоматизировать процесс, например забив команду в /etc/rc.local. После чего нужно и можно конфигурировать сами GPIO с помощью /sys/class/gpio/export ... ну я думаю не стоит вдаваться в детали, т.к. кому нужно отключить UART для каких-то целей - тот разберется. Напомню, для AR724x/AR933x: Код:
UART_IN | UART_OUT GPIO9 | GPIO10 (ОБНОВЛЕНО: обрезан скрипт - Не нужно выгружать uart-драйвер!) Последний раз редактировалось Dioptimizer; 06.01.2014 в 23:48. |
|
|
|
| Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
|
|