Jump to content

Recommended Posts

Posted

TL;DR *Works* with a minor amendment to the DTS overlay pin reference.

 

$ uname -a
Linux nanopineo 5.10.13-sunxi #trunk SMP Mon Feb 8 21:56:43 CET 2021 armv7l armv7l armv7l GNU/Linux

$ dmesg | grep Machine
[    0.000000] OF: fdt: Machine model: FriendlyARM NanoPi NEO

# Baked current kernel. Configuration ... CIR module appears to NOT be enabled by default for NanoPI NEO.
$ grep -iE  "^CONFIG_IR_.*(CIR|SUN)" /boot/config-5.10.13-sunxi
CONFIG_IR_GPIO_CIR=m
CONFIG_IR_SUNXI=m

# Connected Vishay TSOP4838 IR Receiver to 3V3 (via 100R, with C100nF to GND), GND, OUT -> PL11
#              +----------+
# 1 --- OUT ---!     /--\ !
# 2 --- GND ---!     |  | !
# 3 --- 3V3 ---!     \__/ !
#              +----------+

# Get DTS and install as user overlay (commit 0ff3217)
$ wget -O sun8i-h3-cir.dts https://raw.githubusercontent.com/armbian/sunxi-DT-overlays/master/sun8i-h3/sun8i-h3-cir.dts
# Fix pin reference
# from     ir_pins_a             (from DTS file)
#   to               r_ir_rx_pin (from dtc -I fs -O dts /proc/device-tree)
$ sed -e "s/ir_pins_a/r_ir_rx_pin/" sun8i-h3-cir.dts > sun8i-h3-cir-nanopineo.dts

$ cat sun8i-h3-cir-nanopineo.dts
/dts-v1/;
/plugin/;

/ {
        compatible = "allwinner,sun8i-h3";

        fragment@0 {
                target = <&ir>;
                __overlay__ {
                        pinctrl-names = "default";
                        pinctrl-0 = <&r_ir_rx_pin>;
                        status = "okay";
                };
        };
};

$ armbian-add-overlay sun8i-h3-cir-nanopineo.dts
Compiling the overlay
Copying the compiled overlay file to /boot/overlay-user/
Reboot is required to apply the changes

$ shutdown -r now

$ dmesg | grep sunxi-ir
[   10.653323] rc rc0: sunxi-ir as /devices/platform/soc/1f02000.ir/rc/rc0
[   10.653692] rc rc0: lirc_dev: driver sunxi-ir registered at minor = 0, raw IR receiver, no transmitter
[   10.653883] input: sunxi-ir as /devices/platform/soc/1f02000.ir/rc/rc0/input3
[   10.665297] sunxi-ir 1f02000.ir: initialized sunXi IR driver

# Protocols file is there == driver present and overlay loaded OK.
$ cat /sys/class/rc/rc0/protocols
rc-5 nec rc-6 jvc sony rc-5-sz sanyo sharp mce_kbd xmp imon rc-mm [lirc]

# Enable "nec" protocol.
# I tried them all to find out what encoding is used by the remote that I happened to have here.
# There may be a smarter way where the IR subsystem tells you what encoding an incoming signal has.
$ echo "+nec" > /sys/class/rc/rc0/protocols

# The bracketed items appear to be [enabled]
$ cat /sys/class/rc/rc0/protocols
rc-5 [nec] rc-6 jvc sony rc-5-sz sanyo sharp mce_kbd xmp imon rc-mm [lirc]

# Test:
$ apt-get install ir-keytable

$ ir-keytable
Found /sys/class/rc/rc0/ with:
        Name: sunxi-ir
        Driver: sunxi-ir
        Default keymap: rc-empty
        Input device: /dev/input/event3
        LIRC device: /dev/lirc0
        Attached BPF protocols: Operation not supported
        Supported kernel protocols: lirc rc-5 rc-5-sz jvc sony nec sanyo mce_kbd rc-6 sharp xmp imon rc-mm
        Enabled kernel protocols: lirc nec
        bus: 25, vendor/product: 0001:0001, version: 0x0100
        Repeat delay = 500 ms, repeat period = 125 ms

$  ir-keytable -t
Testing events. Please, press CTRL-C to abort.
147.355171: lirc protocol(necx): scancode = 0xe31947
147.355225: event type EV_MSC(0x04): scancode = 0xe31947
147.355225: event type EV_SYN(0x00).
^C


# Test using event system (adjust Input device, cf. above):
$ evtest /dev/input/event3
Input driver version is 1.0.1
Input device ID: bus 0x19 vendor 0x1 product 0x1 version 0x100
Input device name: "sunxi-ir"
Supported events:
  Event type 0 (EV_SYN)
  Event type 1 (EV_KEY)
    Event code 152 (KEY_SCREENLOCK)
  Event type 2 (EV_REL)
    Event code 0 (REL_X)
    Event code 1 (REL_Y)
  Event type 4 (EV_MSC)
    Event code 4 (MSC_SCAN)
Key repeat handling:
  Repeat type 20 (EV_REP)
    Repeat code 0 (REP_DELAY)
      Value    500
    Repeat code 1 (REP_PERIOD)
      Value    125
Properties:
  Property type 5 (INPUT_PROP_POINTING_STICK)
Testing ... (interrupt to exit)
Event: time 1612923728.916182, type 4 (EV_MSC), code 4 (MSC_SCAN), value e31948
Event: time 1612923728.916182, -------------- SYN_REPORT ------------
Event: time 1612923728.967737, type 4 (EV_MSC), code 4 (MSC_SCAN), value e31948
Event: time 1612923728.967737, -------------- SYN_REPORT ------------
^C

# From here on, use LIRC and/or adjust /etc/rc_maps.cfg et al. to map scan
# codes to key codes. This makes the IR receiver compatible with media player
# software. For the IoT device that I am building currently the scan codes
# suffice, so I won't describe this here.


(I am not really sure if that name change is a bug in the DTS repository, or if that name "ir_pins_a" refers to an older kernel, or if one is supposed to have another DT fragment somewhere that maps "ir_pins_a" to "r_ir_rx_pin", please comment if above is not the _right solution_.)

<
Guest
This topic is now closed to further replies.
×
×
  • Create New...

Important Information

Terms of Use - Privacy Policy - Guidelines