user LED control on i.MX93 FRDM board

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

user LED control on i.MX93 FRDM board

244件の閲覧回数
ilya_chepurin
Contributor I

Hi all,
I started to play with i.MX93 FRDM board and when I wrote a simple script to control RGB LEDs on the board, I've managed to control only Green and Blue LEDs. Red LED stays ON whatever I tried.
Based on the schematics, all leds are connected in a similar manner, so they operate Active High.
Here is my script:

---------------------------

#!/bin/sh

PERIOD=1000000

set_pwm() {
CHIP=$1
CHANNEL=$2
DUTY=$3
PWM_PATH="/sys/class/pwm/pwmchip${CHIP}/pwm${CHANNEL}"

if [ ! -d "$PWM_PATH" ]; then
echo "$CHANNEL" > "/sys/class/pwm/pwmchip${CHIP}/export" 2>/dev/null
fi

# Reset duty cycle to 0 first to satisfy TPM driver constraints
echo 0 > "${PWM_PATH}/duty_cycle" 2>/dev/null
echo "$PERIOD" > "${PWM_PATH}/period"
echo "$DUTY" > "${PWM_PATH}/duty_cycle"
echo 1 > "${PWM_PATH}/enable" 2>/dev/null
}

# Red is Active-Low: Default OFF = 1000000 (3.3V / High)
RED_DUTY=${1:-0}

# Green and Blue are Active-High: Default OFF = 0 (0V / Low)
GREEN_DUTY=${2:-0}
BLUE_DUTY=${3:-0}

# Red -> pwmchip4, Channel 3
set_pwm 4 3 "$RED_DUTY"

# Green -> pwmchip0, Channel 0
set_pwm 0 0 "$GREEN_DUTY"

# Blue -> pwmchip0, Channel 2
set_pwm 0 2 "$BLUE_DUTY"
-------------------------------------------

I've checked that red LED (GPIO_IO13) is allocated to the ledsgrp2:
pin 17 (IMX93_IOMUXC_GPIO_IO13): 424f0000.pwm (GPIO UNCLAIMED) function pinctrl group ledsgrp2

as far as I can see with debugfs commands, the pin GPIO_IO13 is configured for ALT1 mode, which is a TPM2 channel 3 (PWM).

when I run the script, I can successfully control Blue and Green LEDS but Red LED stays ON.

Is there something that I miss?

0 件の賞賛
返信
1 返信

187件の閲覧回数
Zhiming_Liu
NXP TechSupport
NXP TechSupport

Hi @ilya_chepurin 

The RED LED is channel 2, please use below script to test(verified on L6.18.20)

#!/bin/sh
# RGB LED PWM cycle test for i.MX93 EVK/FRDM.
# Sequence per cycle: RED on 1s -> all off 1s -> GREEN on 1s -> all off 1s -> BLUE on 1s -> all off 1s
# Usage: ./run.sh [LOOPS]        LOOPS: number of full cycles, 0 = infinite, default 3
# Timing overridable via env:    ON_TIME=2 REST_TIME=1 ./run.sh

PERIOD=1000000                 # 1 kHz period in ns
ON_TIME=${ON_TIME:-1}          # seconds a color stays ON
REST_TIME=${REST_TIME:-1}      # seconds all OFF between colors
LOOPS=${1:-3}
RETRIES=50

# Channel mapping and polarity (verified on this board, all ACTIVE-HIGH):
#   Red   -> 424f0000.pwm = pwmchip1 ch2  ON=duty PERIOD  OFF=duty 0
#   Green -> 424e0000.pwm = pwmchip0 ch0  ON=duty PERIOD  OFF=duty 0
#   Blue  -> 424e0000.pwm = pwmchip0 ch2  ON=duty PERIOD  OFF=duty 0
RED_CHIP=1;  RED_CH=2
GRN_CHIP=0;  GRN_CH=0
BLU_CHIP=0;  BLU_CH=2

# write_retry FILE VALUE : write VALUE to FILE, retry on transient TPM busy/-ETIME,
# and confirm the value took effect. Returns 0 on success.
write_retry() {
    t=0
    while [ "$t" -lt "$RETRIES" ]; do
        echo "$2" > "$1" 2>/dev/null
        [ "$(cat "$1" 2>/dev/null)" = "$2" ] && return 0
        t=$((t+1))
    done
    echo "WARN: could not write $2 to $1" >&2
    return 1
}

# init_pwm CHIP CH : export (fresh), set period BEFORE duty, start disabled with duty 0.
# The i.MX TPM shares a counter between channels; a stale export with period=0 makes
# later period writes fail with -EBUSY, so we unexport first for a clean state.
init_pwm() {
    P="/sys/class/pwm/pwmchip${1}"
    [ -d "${P}/pwm${2}" ] && echo "$2" > "${P}/unexport" 2>/dev/null
    echo "$2" > "${P}/export" 2>/dev/null
    write_retry "${P}/pwm${2}/period" "$PERIOD"      # period must be set before duty
    write_retry "${P}/pwm${2}/duty_cycle" 0          # start OFF
    echo 1 > "${P}/pwm${2}/enable" 2>/dev/null
}

set_duty() {   # CHIP CH DUTY
    write_retry "/sys/class/pwm/pwmchip${1}/pwm${2}/duty_cycle" "$3"
}

led() {        # CHIP CH STATE(on|off)  -- all channels active-high
    if [ "$3" = on ]; then set_duty "$1" "$2" "$PERIOD"; else set_duty "$1" "$2" 0; fi
}

all_off() {
    led $RED_CHIP $RED_CH off
    led $GRN_CHIP $GRN_CH off
    led $BLU_CHIP $BLU_CH off
}

# Init: green and blue share pwmchip0, so init green first, then blue.
init_pwm $RED_CHIP $RED_CH
init_pwm $GRN_CHIP $GRN_CH
init_pwm $BLU_CHIP $BLU_CH

trap "all_off; echo; echo interrupted, all LEDs off; exit 0" INT TERM

all_off
echo "start: all OFF"

n=0
while :; do
    c=$((n+1))
    echo "[cycle $c] RED   on";  led $RED_CHIP $RED_CH on;  sleep "$ON_TIME"
    echo "[cycle $c] --- off";   all_off;                  sleep "$REST_TIME"
    echo "[cycle $c] GREEN on";  led $GRN_CHIP $GRN_CH on;  sleep "$ON_TIME"
    echo "[cycle $c] --- off";   all_off;                  sleep "$REST_TIME"
    echo "[cycle $c] BLUE  on";  led $BLU_CHIP $BLU_CH on;  sleep "$ON_TIME"
    echo "[cycle $c] --- off";   all_off;                  sleep "$REST_TIME"

    n=$c
    [ "$LOOPS" -eq 0 ] && continue
    [ "$n" -ge "$LOOPS" ] && break
done

all_off
echo "done ($n cycle(s)), all LEDs off"



Best Regards,
Zhiming

0 件の賞賛
返信
%3CLINGO-SUB%20id%3D%22lingo-sub-2410646%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3Ei.MX93%20FRDM%E3%83%9C%E3%83%BC%E3%83%89%E4%B8%8A%E3%81%AE%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BCLED%E5%88%B6%E5%BE%A1%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2410646%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CP%3E%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF%E3%80%81%E3%81%BF%E3%82%93%E3%81%AA%E3%80%81%3CBR%20%2F%3E%20i.MX93%20FRDM%E3%83%9C%E3%83%BC%E3%83%89%E3%82%92%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%81%9F%E3%81%AE%E3%81%A7%E3%81%99%E3%81%8C%E3%80%81%E3%83%9C%E3%83%BC%E3%83%89%E4%B8%8A%E3%81%AERGB%20LED%E3%82%92%E5%88%B6%E5%BE%A1%E3%81%99%E3%82%8B%E7%B0%A1%E5%8D%98%E3%81%AA%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%92%E6%9B%B8%E3%81%84%E3%81%9F%E3%81%A8%E3%81%93%E3%82%8D%E3%80%81%E7%B7%91%E8%89%B2%E3%81%A8%E9%9D%92%E8%89%B2%E3%81%AELED%E3%81%97%E3%81%8B%E5%88%B6%E5%BE%A1%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%9B%E3%82%93%E3%81%A7%E3%81%97%E3%81%9F%E3%80%82%E3%81%84%E3%82%8D%E3%81%84%E3%82%8D%E8%A9%A6%E3%81%97%E3%81%A6%E3%81%BF%E3%81%BE%E3%81%97%E3%81%9F%E3%81%8C%E3%80%81%E8%B5%A4%E8%89%B2LED%E3%81%8C%E7%82%B9%E7%81%AF%E3%81%97%E3%81%9F%E3%81%BE%E3%81%BE%E3%81%A7%E3%81%99%E3%80%82%3CBR%20%2F%3E%E5%9B%9E%E8%B7%AF%E5%9B%B3%E3%81%AB%E3%82%88%E3%82%8B%E3%81%A8%E3%80%81%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AELED%E3%81%AF%E5%90%8C%E6%A7%98%E3%81%AE%E6%96%B9%E6%B3%95%E3%81%A7%E6%8E%A5%E7%B6%9A%E3%81%95%E3%82%8C%E3%81%A6%E3%81%8A%E3%82%8A%E3%80%81%E3%82%A2%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%83%8F%E3%82%A4%E3%81%A7%E5%8B%95%E4%BD%9C%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%3CBR%20%2F%3E%E3%81%93%E3%82%8C%E3%81%8C%E7%A7%81%E3%81%AE%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%A7%E3%81%99%E3%80%82%3C%2FP%3E%3CP%3E---------------------------%3C%2FP%3E%3CP%3E%23!%2Fbin%2Fsh%3C%2FP%3E%3CP%3E%E6%9C%9F%E9%96%93%3D1000000%3C%2FP%3E%3CP%3Eset_pwm()%20%7B%3CBR%20%2F%3E%E3%83%81%E3%83%83%E3%83%97%3D%241%3CBR%20%2F%3E%E3%83%81%E3%83%A3%E3%83%8D%E3%83%AB%3D%242%3CBR%20%2F%3EDUTY%3D%243%3CBR%20%2F%3EPWM_PATH%3D%22%20%2Fsys%2Fclass%2Fpwm%2Fpwmchip%24%7BCHIP%7D%2Fpwm%24%7BCHANNEL%7D%22%3C%2FP%3E%3CP%3Eif%20%5B%20!%20-d%20%22%24PWM_PATH%22%20%5D%3B%20then%3CBR%20%2F%3E%20echo%20%22%24CHANNEL%22%20%26gt%3B%20%22%2Fsys%2Fclass%2Fpwm%2Fpwmchip%20%24%7BCHIP%7D%20%2Fexport%22%202%26gt%3B%2Fdev%2Fnull%3CBR%20%2F%3E%E3%83%95%E3%82%A3%3C%2FP%3E%3CP%3E%23%20%E3%81%BE%E3%81%9ADTY%E3%82%B5%E3%82%A4%E3%82%AF%E3%83%AB%E3%82%920%E3%81%AB%E3%83%AA%E3%82%BB%E3%83%83%E3%83%88%E3%81%97%E3%81%A6TPM%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E3%81%AE%E5%88%B6%E7%B4%84%E3%82%92%E6%BA%80%E3%81%9F%E3%81%99%3CBR%20%2F%3Eecho%200%20%26gt%3B%20%22%24%7BPWM_PATH%7D%2Fduty_cycle%22%202%26gt%3B%2Fdev%2Fnull%3CBR%20%2F%3E%E3%82%A8%E3%82%B3%E3%83%BC%E3%80%8C%24PERIOD%E3%80%8D%26gt%3B%E3%80%8C%24%7BPWM_PATH%7D%2F%E5%8F%A5%E7%82%B9%E3%80%8D%3CBR%20%2F%3E%E3%82%A8%E3%82%B3%E3%83%BC%E3%80%8C%24DUTY%E3%80%8D%26gt%3B%E3%80%8C%24%7BPWM_PATH%7D%2Fduty_cycle%E3%80%8D%3CBR%20%2F%3Eecho%201%20%26gt%3B%20%22%22%24%7BPWM_PATH%7D%2Fenable%22%202%26gt%3B%2Fdev%2Fnull%3CBR%20%2F%3E%7D%3C%2FP%3E%3CP%3E%23%20%E8%B5%A4%E8%89%B2%E3%81%AF%E3%82%A2%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%83%AD%E3%83%BC%E3%81%A7%E3%81%99%E3%80%82%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E3%81%AFOFF%20%3D%201000000%20(3.3V%20%2F%20%E3%83%8F%E3%82%A4)%3CBR%20%2F%3E%20RED_DUTY%3D%20%24%7B1%3A-0%7D%3C%2FP%3E%3CP%3E%23%20%E7%B7%91%E3%81%A8%E9%9D%92%E3%81%AF%E3%82%A2%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%83%8F%E3%82%A4%E3%81%A7%E3%81%99%E3%80%82%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E3%81%AFOFF%20%3D%200%20(0V%20%2F%20%E3%83%AD%E3%83%BC)%E3%81%A7%E3%81%99%E3%80%82%3CBR%20%2F%3E%20GREEN_DUTY%3D%20%24%7B2%3A-0%7D%3CBR%20%2F%3E%20BLUE_DUTY%3D%20%24%7B3%3A-0%7D%3C%2FP%3E%3CP%3E%23%20%E3%83%AC%E3%83%83%E3%83%89%20-%26gt%3B%20pwmchip4%E3%80%81%E3%83%81%E3%83%A3%E3%83%8D%E3%83%AB3%3CBR%20%2F%3Eset_pwm%204%203%20%E3%80%8C%24RED_DUTY%E3%80%8D%3C%2FP%3E%3CP%3E%23%20%E7%B7%91%20-%26gt%3B%20pwmchip0%E3%80%81%E3%83%81%E3%83%A3%E3%83%8D%E3%83%AB0%3CBR%20%2F%3Eset_pwm%200%200%20%E3%80%8C%24GREEN_DUTY%E3%80%8D%3C%2FP%3E%3CP%3E%23%20%E3%83%96%E3%83%AB%E3%83%BC%20-%26gt%3B%20pwmchip0%E3%80%81%E3%83%81%E3%83%A3%E3%83%8D%E3%83%AB2%3CBR%20%2F%3Eset_pwm%200%202%20%E3%80%8C%24BLUE_DUTY%E3%80%8D%3CBR%20%2F%3E-------------------------------------------%3C%2FP%3E%3CP%3E%E8%B5%A4%E3%81%84LED(GPIO_IO13)%E3%81%8Cledsgrp2%E3%81%AB%E5%89%B2%E3%82%8A%E5%BD%93%E3%81%A6%E3%82%89%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%81%8B%E7%A2%BA%E8%AA%8D%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%3A%3CBR%20%2F%3E%E3%83%94%E3%83%B317(IMX93_IOMUXC_GPIO_IO13)%3A424f0000.pwm%20(GPIO%20UNCLAIMED)%20function%20pinctrl%20group%20ledsgrp2%3CBR%20%2F%3E%3CBR%20%2F%3Edebugfs%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E7%A2%BA%E8%AA%8D%E3%81%97%E3%81%9F%E9%99%90%E3%82%8A%E3%80%81%E3%83%94%E3%83%B3GPIO_IO13%E3%81%AFALT1%E3%83%A2%E3%83%BC%E3%83%89%E3%80%81%E3%81%A4%E3%81%BE%E3%82%8ATPM2%E3%83%81%E3%83%A3%E3%83%8D%E3%83%AB3(PWM)%E3%81%AB%E8%A8%AD%E5%AE%9A%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%3CBR%20%2F%3E%3CBR%20%2F%3E%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E3%81%A8%E3%80%81%E9%9D%92%E3%81%A8%E7%B7%91%E3%81%AELED%E3%81%AF%E6%AD%A3%E5%B8%B8%E3%81%AB%E5%88%B6%E5%BE%A1%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%81%8C%E3%80%81%E8%B5%A4%E3%81%84LED%E3%81%AF%E7%82%B9%E7%81%AF%E3%81%97%E3%81%9F%E3%81%BE%E3%81%BE%E3%81%A7%E3%81%99%E3%80%82%3CBR%20%2F%3E%3CBR%20%2F%3E%E4%BD%95%E3%81%8B%E8%A6%8B%E8%90%BD%E3%81%A8%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%82%E3%82%8B%E3%81%A0%E3%82%8D%E3%81%86%E3%81%8B%EF%BC%9F%3CBR%20%2F%3E%3CBR%20%2F%3E%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-2410725%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%20translate%3D%22no%22%3ERe%3A%20user%20LED%20control%20on%20i.MX93%20FRDM%20board%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2410725%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CP%3E%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF%3CA%20href%3D%22https%3A%2F%2Fcommunity.nxp.com%2Ft5%2Fuser%2Fviewprofilepage%2Fuser-id%2F171880%22%20target%3D%22_blank%22%3E%40ilya_chepurin%3C%2FA%3E%26nbsp%3B%3CBR%20%2F%3E%3CBR%20%2F%3E%E8%B5%A4%E3%81%84LED%E3%81%AF%E3%83%81%E3%83%A3%E3%83%8D%E3%83%AB2%E3%81%A7%E3%81%99%E3%80%82%E4%BB%A5%E4%B8%8B%E3%81%AE%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%83%86%E3%82%B9%E3%83%88%E3%81%97%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84(%3CSTRONG%3EL6.18.20%E3%81%A7%E7%A2%BA%E8%AA%8D%3C%2FSTRONG%3E%E6%B8%88%E3%81%BF)%3C%2FP%3E%0A%3CPRE%20class%3D%22lia-code-sample%20language-markup%22%3E%3CCODE%20translate%3D%22no%22%3E%23!%2Fbin%2Fsh%0A%23%20RGB%20LED%20PWM%20cycle%20test%20for%20i.MX93%20EVK%2FFRDM.%0A%23%20Sequence%20per%20cycle%3A%20RED%20on%201s%20-%26gt%3B%20all%20off%201s%20-%26gt%3B%20GREEN%20on%201s%20-%26gt%3B%20all%20off%201s%20-%26gt%3B%20BLUE%20on%201s%20-%26gt%3B%20all%20off%201s%0A%23%20Usage%3A%20.%2Frun.sh%20%5BLOOPS%5D%20%20%20%20%20%20%20%20LOOPS%3A%20number%20of%20full%20cycles%2C%200%20%3D%20infinite%2C%20default%203%0A%23%20Timing%20overridable%20via%20env%3A%20%20%20%20ON_TIME%3D2%20REST_TIME%3D1%20.%2Frun.sh%0A%0APERIOD%3D1000000%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%201%20kHz%20period%20in%20ns%0AON_TIME%3D%24%7BON_TIME%3A-1%7D%20%20%20%20%20%20%20%20%20%20%23%20seconds%20a%20color%20stays%20ON%0AREST_TIME%3D%24%7BREST_TIME%3A-1%7D%20%20%20%20%20%20%23%20seconds%20all%20OFF%20between%20colors%0ALOOPS%3D%24%7B1%3A-3%7D%0ARETRIES%3D50%0A%0A%23%20Channel%20mapping%20and%20polarity%20(verified%20on%20this%20board%2C%20all%20ACTIVE-HIGH)%3A%0A%23%20%20%20Red%20%20%20-%26gt%3B%20424f0000.pwm%20%3D%20pwmchip1%20ch2%20%20ON%3Dduty%20PERIOD%20%20OFF%3Dduty%200%0A%23%20%20%20Green%20-%26gt%3B%20424e0000.pwm%20%3D%20pwmchip0%20ch0%20%20ON%3Dduty%20PERIOD%20%20OFF%3Dduty%200%0A%23%20%20%20Blue%20%20-%26gt%3B%20424e0000.pwm%20%3D%20pwmchip0%20ch2%20%20ON%3Dduty%20PERIOD%20%20OFF%3Dduty%200%0ARED_CHIP%3D1%3B%20%20RED_CH%3D2%0AGRN_CHIP%3D0%3B%20%20GRN_CH%3D0%0ABLU_CHIP%3D0%3B%20%20BLU_CH%3D2%0A%0A%23%20write_retry%20FILE%20VALUE%20%3A%20write%20VALUE%20to%20FILE%2C%20retry%20on%20transient%20TPM%20busy%2F-ETIME%2C%0A%23%20and%20confirm%20the%20value%20took%20effect.%20Returns%200%20on%20success.%0Awrite_retry()%20%7B%0A%20%20%20%20t%3D0%0A%20%20%20%20while%20%5B%20%22%24t%22%20-lt%20%22%24RETRIES%22%20%5D%3B%20do%0A%20%20%20%20%20%20%20%20echo%20%22%242%22%20%26gt%3B%20%22%241%22%202%26gt%3B%2Fdev%2Fnull%0A%20%20%20%20%20%20%20%20%5B%20%22%24(cat%20%22%241%22%202%26gt%3B%2Fdev%2Fnull)%22%20%3D%20%22%242%22%20%5D%20%26amp%3B%26amp%3B%20return%200%0A%20%20%20%20%20%20%20%20t%3D%24((t%2B1))%0A%20%20%20%20done%0A%20%20%20%20echo%20%22WARN%3A%20could%20not%20write%20%242%20to%20%241%22%20%26gt%3B%26amp%3B2%0A%20%20%20%20return%201%0A%7D%0A%0A%23%20init_pwm%20CHIP%20CH%20%3A%20export%20(fresh)%2C%20set%20period%20BEFORE%20duty%2C%20start%20disabled%20with%20duty%200.%0A%23%20The%20i.MX%20TPM%20shares%20a%20counter%20between%20channels%3B%20a%20stale%20export%20with%20period%3D0%20makes%0A%23%20later%20period%20writes%20fail%20with%20-EBUSY%2C%20so%20we%20unexport%20first%20for%20a%20clean%20state.%0Ainit_pwm()%20%7B%0A%20%20%20%20P%3D%22%2Fsys%2Fclass%2Fpwm%2Fpwmchip%24%7B1%7D%22%0A%20%20%20%20%5B%20-d%20%22%24%7BP%7D%2Fpwm%24%7B2%7D%22%20%5D%20%26amp%3B%26amp%3B%20echo%20%22%242%22%20%26gt%3B%20%22%24%7BP%7D%2Funexport%22%202%26gt%3B%2Fdev%2Fnull%0A%20%20%20%20echo%20%22%242%22%20%26gt%3B%20%22%24%7BP%7D%2Fexport%22%202%26gt%3B%2Fdev%2Fnull%0A%20%20%20%20write_retry%20%22%24%7BP%7D%2Fpwm%24%7B2%7D%2Fperiod%22%20%22%24PERIOD%22%20%20%20%20%20%20%23%20period%20must%20be%20set%20before%20duty%0A%20%20%20%20write_retry%20%22%24%7BP%7D%2Fpwm%24%7B2%7D%2Fduty_cycle%22%200%20%20%20%20%20%20%20%20%20%20%23%20start%20OFF%0A%20%20%20%20echo%201%20%26gt%3B%20%22%24%7BP%7D%2Fpwm%24%7B2%7D%2Fenable%22%202%26gt%3B%2Fdev%2Fnull%0A%7D%0A%0Aset_duty()%20%7B%20%20%20%23%20CHIP%20CH%20DUTY%0A%20%20%20%20write_retry%20%22%2Fsys%2Fclass%2Fpwm%2Fpwmchip%24%7B1%7D%2Fpwm%24%7B2%7D%2Fduty_cycle%22%20%22%243%22%0A%7D%0A%0Aled()%20%7B%20%20%20%20%20%20%20%20%23%20CHIP%20CH%20STATE(on%7Coff)%20%20--%20all%20channels%20active-high%0A%20%20%20%20if%20%5B%20%22%243%22%20%3D%20on%20%5D%3B%20then%20set_duty%20%22%241%22%20%22%242%22%20%22%24PERIOD%22%3B%20else%20set_duty%20%22%241%22%20%22%242%22%200%3B%20fi%0A%7D%0A%0Aall_off()%20%7B%0A%20%20%20%20led%20%24RED_CHIP%20%24RED_CH%20off%0A%20%20%20%20led%20%24GRN_CHIP%20%24GRN_CH%20off%0A%20%20%20%20led%20%24BLU_CHIP%20%24BLU_CH%20off%0A%7D%0A%0A%23%20Init%3A%20green%20and%20blue%20share%20pwmchip0%2C%20so%20init%20green%20first%2C%20then%20blue.%0Ainit_pwm%20%24RED_CHIP%20%24RED_CH%0Ainit_pwm%20%24GRN_CHIP%20%24GRN_CH%0Ainit_pwm%20%24BLU_CHIP%20%24BLU_CH%0A%0Atrap%20%22all_off%3B%20echo%3B%20echo%20interrupted%2C%20all%20LEDs%20off%3B%20exit%200%22%20INT%20TERM%0A%0Aall_off%0Aecho%20%22start%3A%20all%20OFF%22%0A%0An%3D0%0Awhile%20%3A%3B%20do%0A%20%20%20%20c%3D%24((n%2B1))%0A%20%20%20%20echo%20%22%5Bcycle%20%24c%5D%20RED%20%20%20on%22%3B%20%20led%20%24RED_CHIP%20%24RED_CH%20on%3B%20%20sleep%20%22%24ON_TIME%22%0A%20%20%20%20echo%20%22%5Bcycle%20%24c%5D%20---%20off%22%3B%20%20%20all_off%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sleep%20%22%24REST_TIME%22%0A%20%20%20%20echo%20%22%5Bcycle%20%24c%5D%20GREEN%20on%22%3B%20%20led%20%24GRN_CHIP%20%24GRN_CH%20on%3B%20%20sleep%20%22%24ON_TIME%22%0A%20%20%20%20echo%20%22%5Bcycle%20%24c%5D%20---%20off%22%3B%20%20%20all_off%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sleep%20%22%24REST_TIME%22%0A%20%20%20%20echo%20%22%5Bcycle%20%24c%5D%20BLUE%20%20on%22%3B%20%20led%20%24BLU_CHIP%20%24BLU_CH%20on%3B%20%20sleep%20%22%24ON_TIME%22%0A%20%20%20%20echo%20%22%5Bcycle%20%24c%5D%20---%20off%22%3B%20%20%20all_off%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sleep%20%22%24REST_TIME%22%0A%0A%20%20%20%20n%3D%24c%0A%20%20%20%20%5B%20%22%24LOOPS%22%20-eq%200%20%5D%20%26amp%3B%26amp%3B%20continue%0A%20%20%20%20%5B%20%22%24n%22%20-ge%20%22%24LOOPS%22%20%5D%20%26amp%3B%26amp%3B%20break%0Adone%0A%0Aall_off%0Aecho%20%22done%20(%24n%20cycle(s))%2C%20all%20LEDs%20off%22%0A%3C%2FCODE%3E%3C%2FPRE%3E%0A%3CP%3E%3CBR%20%2F%3E%3CBR%20%2F%3E%E3%82%88%E3%82%8D%E3%81%97%E3%81%8F%E3%81%8A%E9%A1%98%E3%81%84%E3%81%97%E3%81%BE%E3%81%99%E3%80%81%3CBR%20%2F%3E%E5%BF%97%E6%98%8E%3C%2FP%3E%3C%2FLINGO-BODY%3E