1

Temat: i2c over CP2112

Witam.

Piszę bo może ktoś się już spotkał z takim problemem jak ja i rzuci trochę swiatła.

Cel: posiadanie magistrali i2c poprzez USB pod OpenWRT
Router: Netgear R6220
Układ i2c: CP2112 (rev. F02)
Soft: LUCI OpenWrt 19.07 by Cezary jak również najnowsza kompilacja 19.07 bez LUCI

Przygotowanie pod użycie zgodnie z opisem: https://openwrt.org/docs/guide-user/har … c-tiny-usb

Moduły i oprogramowanie zainstalowane tj.
kmod-i2c-tiny-usb
kmod-i2c-core
i2c-tools

A problem jest taki, że system widzi nowe urządzenie USB tj.

root@OpenWrt:~# dmesg | grep i2c
[   15.743643] i2c /dev entries driver
[   15.754171] usbcore: registered new interface driver i2c-tiny-usb

root@OpenWrt:~# i2cdetect -l
root@OpenWrt:~#

ale nie tworzy magistrali i2c w /dev (pusto...). Reboot, czy ponowne włożenie urządzenia USB nie zmienia sytuacji.

Pod Windows czy Linux (Ubuntu w tym przypadku) działa bez problemu. Wszystko śmiga, urzadzenie wykrywa, tworzy magistralę i2c.

Może po prostu brakuje jakiegoś pakietu, modułu jądra aby wykrył poprawnie magistralę... No nie wiem.

Będę wdzięczny za każdy pomysł.

Z góry dzięki!
MvincM

2

Odp: i2c over CP2112

kmod-i2c-tiny-usb wykorzystywane jest do tanich interfejsów składanych głównie np. atmelach attiny. Jesteś pewien że cp2112 jest obsługiwany przez i2c-tiny-usb?

EDIT: on ma swój driver w kernelu linuksowym: https://github.com/torvalds/linux/blob/ … d-cp2112.c

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

3

Odp: i2c over CP2112

Dzięki. No i teraz jasne... założyłem (bo tak bardzo chciałem), że będzie obsługiwany gdyż jest relatywnie tani i robi robotę poprawnie. Przepisanie tego drivera na jądro OpenWRT to dla mnie zbyt ambitne zadanie (nie podołam).

Zostaje mi chyba jeszcze eksperyment z attiny85 i przejściówką UART-USB i komunikacja po serial (co prawda on tez ma software emulację USB ale ta zwnou nie ma drivera pod OpenWRT). Sam attiny85 też nie jest obsługiwany przez OpenWRT.

A może masz/macie inne pomysły na i2c po USB (bo nie zawsze mamy dwa wolne czy łatwo dostęne GPIO w routerze aby i2c zrobić).

Dzięki!
MvincM

4

Odp: i2c over CP2112

On już jest w kernelu co chcesz przepisywać?

Zrób sobie po prostu makefile żeby zbudował z niego packę i będziesz miał.

Samo i2c-tiny-usb to właśnie na attiny85 może być zbudowane...

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

5

Odp: i2c over CP2112

Odpowiadając na pytanie wink Nie sprawdziwszy założyłem, nie jest on w kernelu aktualnym/dostosowanym na potrzeby rozwiązania/platformy jakim jest OpenWRT ale nie wiem jak mocno kernel openwrt jest rozbieżny z linux (rozumianym jako kernel a nie dystrybucja/OS).

W takim razie na testy zrobie jak mówisz ale pytanie wink czy jest szansa aby w Twoich kompilacjach znalazł się ten diver na stałe bo wiesz dla mnie OpenWRT to eko.one.pl od samego początku więc chciałbym korzystać "produkcyjnie" z Twoich buildów.

Dzięki,
MvincM

6

Odp: i2c over CP2112

Mogę ci go skompilować wieczorem.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

7

Odp: i2c over CP2112

Będę wdzięczny! Jak i potomni bo...

po przeszukaniu rynku to CP2112 jako gotowa płytka ma najlepszy (moim zdaniem) stosunek jakości do ceny. Nawet mając na uwadze, że powszechna wersja jest to rev. F02 (ze znamymi błędami) to mamy gotowca z portem USB za 2.5 USD.

Pisząc o wykorzystaniu Attiny85 miałem na myśli projekt "LittleWire" obsługujący m.in. zastosowanie i2c a ten nie jest wpierany w obecnej wersji OpenWRT.

Wielkie dzięki! Stay tuned!

8

Odp: i2c over CP2112

Znów - do hardware littewire możesz wgrać zmodyfikowany firmware od i2c-tiny-usb. Gdzieś tam się poniewiera na githube. Działało, sam tak kiedyś miałem.

Z taniości możesz też zastosować zwykłe esp8266. Będzie nawet bezprzewodowo, softów "generycznych" jest sporo, możesz także sam napisać.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

9

Odp: i2c over CP2112

Reasumujac. Będę wdzieczny za kompitację. Dodatkowo wgram sobie i2c-tiny-usb na moje attiny85 (nawet z czystej ciekawości - dzięki za hint).

Co do esp8266 to oczywście znam i stosuje (czy to z tasmota czy micropython na pokładzie). Właśnie wyzwaniem dla mnie jest WiFi bo powinienem i2c po kablu zrobić dla zachowania relatywnej niezawodności (brak połaczenia, zrywanie itd.). No i w tym przypadku doszedłem do momentu w którym komunikacja jest po UART i wtedy nie ma wyzwania z wifi (tyle, że więcej do obkodowania jest ergo tez miejsce na popełnienie błedu jak mówimy o niezawodności). Innym wątkiem jest też konsumpcja energii (attiny85 vs esp8266) tu esp8266 może nie jest strasznie prądożerne ale w podtrzymaniu bateryjnym to już zaczyna mieć znaczenie a jak wyłaczysz WiFi które zjada sporo to już masz małą funkcjonalnie różnicę vs attiny85 czy cp2112 i router). Oczywiście esp ma i ADC i i2c i hardware UART na pokładzie - nie umniejszam ale i znacznie krócej na baterii trzyma.

10

Odp: i2c over CP2112

Do mojego ostatniego wydania: https://dl.eko.one.pl/test/kmod-hid-cp2 … l_24kc.ipk
Jeżeli czegoś będzie brakowało w zależnościach to sobie doinstaluj.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

11

Odp: i2c over CP2112

Super. Dzięki.

A mogę jeszcze serdecznie poprosić o kompilację pod TL-WR1043ND V1. Testowy router pod eksperymenty.

Z góry dzięki!
MvincM

12

Odp: i2c over CP2112

W tym samym miejscu. Sprawdzałeś w ogóle czy działa?

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

13

Odp: i2c over CP2112

No to jest tak wink

Testowy router to ten TP-LINK (testy, eksperymenty itd.). I on jest na najnowszym OpenWRT (no i tu mamy niezgodność architektury). A produkcyjny router to R6220 (zgodność architektiry) ale jest na starszej kompilacji więc krzyczy (słusznie) o nowszy kernel itd. I oczywiście moge podnieść ten produkcyjny router do najnowszego OpenWRT ale to jak wszyscy pójdą spać i "internetów" nie będą potrzebowali (czyli za parę godzin).

Czyli odpowiedź wink nie - nie sprawdziłem (jak wyżej).

Dzięki!
MM

14

Odp: i2c over CP2112

No przecież masz moduł też dla 1043.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

15

Odp: i2c over CP2112

Dzięki, fakt widzę!

Niestety wydaje mi sę, że i tu wersja kernela nie gra (architektura zgodna).

root@OpenWrt:/tmp# opkg install kmod-hid-cp2112_4.14.212-1_mips_24kc.ipk
Installing kmod-hid-cp2112 (4.14.212-1) to root...
Collected errors:
* satisfy_dependencies_for: Cannot satisfy the following dependencies for kmod-hid-cp2112:
*      kernel (= 4.14.212-1-d577b4ae4934d425bbef726ad92e3fc0)
*      kmod-hid
* opkg_install_cmd: Cannot install package kmod-hid-cp2112.

root@OpenWrt:/tmp# uname -r
4.14.212

root@OpenWrt:/tmp# cat /proc/version
Linux version 4.14.212 (cezary@eko.one.pl) (gcc version 7.5.0 (OpenWrt GCC 7.5.0 r11261-3f5fecfd33)) #0 Thu Dec 17 14:51:43 2020

Możliwe, że budujesz na nowszej wersji?

MvincM

16 (edytowany przez Cezary 2020-12-21 23:23:53)

Odp: i2c over CP2112

Bo ty masz ath79 a nie ar71xx. Nie przejmuj się, instaluj z --force-depends tylko sobie wcześniej  kmod-hid zainstaluj.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

17

Odp: i2c over CP2112

Kurcze sprawa taka, że moduły są, zależnosc z kernelem "zforceowałem" i jest tak było tj. wykrywa samo urządenie USB ale już nie magistralę czyli jakby jednak tego sterownika nie widział/nie ten był.

root@OpenWrt:/tmp# dmesg | grep i2c
[   14.477714] i2c /dev entries driver
[   14.492904] usbcore: registered new interface driver i2c-tiny-usb


root@OpenWrt:/tmp# opkg list-installed | grep kmod
...
kmod-gpio-button-hotplug - 4.14.212-3
kmod-hid - 4.14.212-1
kmod-hid-cp2112 - 4.14.212-1
kmod-i2c-core - 4.14.212-1
kmod-i2c-tiny-usb - 4.14.212-1
kmod-usb-core - 4.14.212-1
kmod-usb-ehci - 4.14.212-1
kmod-usb-ledtrig-usbport - 4.14.212-1
kmod-usb-storage - 4.14.212-1
kmod-usb-storage-uas - 4.14.212-1
kmod-usb2 - 4.14.212-1
...

Ale sam CP2112 jest naprawdę super: niski pobór prądu (w idle praktycznie zero...), i2c i jeszcze do tego zostaje parę pinów na GPIO... no super sprawa.

18

Odp: i2c over CP2112

i2c-detect -l

zrób

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

19

Odp: i2c over CP2112

Sorki nie napisałem. Niestety czysto. I2c-detect nie wykrywa nic bo i nie ma urządzenia stworzonego w /dev. Siłowe wywołanie magistrali 0 (teoretycznie jedynej jakby była) też kończy się komunikatem o nie znalezionym urządzeniu (no i ciężko mieć pretensje jak w /dev pusto).

20

Odp: i2c over CP2112

To podłącz pod linuksa, zobacz jakie moduły ładuje do jego obsługi.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

21

Odp: i2c over CP2112

Słuszny trop. Ciekawe. Niby to samo a magistrala i urządzenie się nie tworzy. Zebrałem "log". Dałem wycinki dla czytelności. Popatrz proszę. Pewnie jest coś czego nie widzę...

OpenWRT:

root@OpenWrt:/tmp# lsmod
...
hid                    80912  1 hid_cp2112
hid_cp2112             12192  0
i2c_core               21232  3 hid_cp2112,i2c_tiny_usb,i2c_dev
i2c_dev                 4816  0
i2c_tiny_usb            2400  0
input_core             24560  2 hid,evdev
...
root@OpenWrt:/tmp#

root@OpenWrt:/tmp# modinfo hid_cp2112
module:         /lib/modules/4.14.212/hid-cp2112.ko
license:        GPL
depends:        hid,nls_base
root@OpenWrt:/tmp#

root@OpenWrt:~# dmesg | grep i2c
[   14.487660] i2c /dev entries driver
[   14.502910] usbcore: registered new interface driver i2c-tiny-usb
root@OpenWrt:~#

root@OpenWrt:~# ls /dev | grep i2c
root@OpenWrt:~#


LINUX:

test@batnet:~$ lsmod
Module                  Size  Used by
...
hid_cp2112             32768  0
usbhid                 57344  0
hid                   131072  3 usbhid,hid_generic,hid_cp2112
...

test@batnet:~$ modinfo hid_cp2112
filename:       /lib/modules/5.4.0-58-generic/kernel/drivers/hid/hid-cp2112.ko
license:        GPL
author:         David Barksdale <dbarksdale@uplogix.com>
description:    Silicon Labs HID USB to SMBus master bridge
srcversion:     7BDAC7879E24577E7A2B81C
alias:          hid:b0003g*v000010C4p0000EA90
depends:        hid
retpoline:      Y
intree:         Y
name:           hid_cp2112
vermagic:       5.4.0-58-generic SMP mod_unload
sig_id:         PKCS#7
signer:         Build time autogenerated kernel key
sig_key:        4F:99:95:CB:A3:36:65:3E:1E:5A:30:73:58:12:C3:10:81:02:EA:FF
sig_hashalgo:   sha512
signature:      A0:AB:8B:69:2C:14:89:DD:0C:8F:9F:39:68:A7:FC:F9:6B:B4:8B:52:
        C4:84:69:B7:C1:86:EA:19:F0:53:CB:E7:94:DE:C5:67:2E:12:01:54:
        30:56:10:96:E8:5D:88:53:75:E4:BB:CF:68:57:CA:22:F6:03:D3:ED:
        A7:7D:60:02:DE:E3:7F:B9:8D:99:79:B1:C6:52:8D:00:FB:63:4A:CB:
        D9:18:63:AC:E8:79:C0:54:F7:2A:92:3F:1A:54:06:DF:2C:D8:BB:8E:
        F0:8C:A7:2A:22:7F:EB:83:3A:83:60:AB:F7:0E:39:01:00:2A:EB:55:
        65:82:38:AC:C6:C0:7C:08:CB:22:72:76:94:B3:5A:9C:F9:D9:20:F6:
        ED:DF:6A:B4:A1:A8:22:DC:6F:81:98:7C:30:B4:36:C7:DD:3D:B7:E6:
        20:4F:8A:96:88:E8:43:96:D4:31:8E:E5:EE:9C:17:94:3D:6E:7C:36:
        30:82:B2:7E:F2:8C:1A:54:FC:55:25:FC:AF:E3:8B:0A:9E:FC:10:A9:
        92:91:AD:F5:F9:22:50:82:1E:AA:31:15:1A:DC:37:AD:56:43:12:A7:
        C0:85:20:80:B3:F6:44:6A:2A:B8:B3:3A:91:EE:BD:52:14:34:D9:F5:
        0F:D9:19:A8:1E:F8:A6:7E:6E:74:15:2C:3A:A5:41:CE:0E:9A:74:1C:
        FF:41:1B:24:60:DF:0E:66:C8:4F:33:86:96:C6:C4:C0:A2:63:21:F9:
        A7:C3:D4:6A:ED:16:94:E0:6F:4D:3D:60:72:6E:0F:DD:D2:8D:7F:52:
        34:C3:C4:24:1A:28:EE:DD:2F:98:44:D8:58:1F:08:87:A9:D2:7E:BE:
        18:23:C3:FA:F5:3C:60:A3:0A:FC:0E:23:83:72:D6:76:2F:7A:81:29:
        41:61:2A:7F:13:15:1F:B3:DC:C2:C5:FD:CA:4F:65:10:AF:C2:2C:2C:
        97:CB:C6:A9:B3:0C:E5:33:2A:98:4C:6A:7D:E7:BC:B5:EA:49:9D:F7:
        11:63:9C:2B:E2:48:78:FE:30:20:AF:7C:65:F6:82:5D:E6:EE:84:FB:
        91:6D:7F:76:DA:EA:A5:9C:53:D6:87:B6:90:7F:90:63:40:12:CC:0B:
        44:D4:8B:81:A6:FC:35:0E:BF:0F:B4:FB:C7:DE:77:E8:D4:2D:E3:33:
        9E:A4:DA:D9:C4:35:1F:55:10:9C:8A:52:0B:79:77:F0:FB:30:F8:15:
        90:D4:7F:7A:3A:6A:9F:CD:51:05:18:2C:5D:EA:AA:E0:59:5A:FB:35:
        94:23:09:11:21:B4:1E:36:65:00:15:FC:11:10:13:00:BF:FD:81:7A:
        C7:57:97:E0:FE:1E:61:58:07:42:74:AB
parm:           gpio_push_pull:GPIO push-pull configuration bitmask (int)

test@batnet:~$ dmesg
...
[  327.954114] usb 2-3.2: new full-speed USB device number 9 using xhci_hcd
[  328.056005] usb 2-3.2: New USB device found, idVendor=10c4, idProduct=ea90, bcdDevice= 0.00
[  328.056012] usb 2-3.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[  328.056016] usb 2-3.2: Product: CP2112 HID USB-to-SMBus Bridge
[  328.056019] usb 2-3.2: Manufacturer: Silicon Laboratories
[  328.056022] usb 2-3.2: SerialNumber: 0053A75A
[  328.064195] cp2112 0003:10C4:EA90.0003: hidraw1: USB HID v1.01 Device [Silicon Laboratories CP2112 HID USB-to-SMBus Bridge] on usb-0000:00:14.0-3.2/input0
[  328.122389] cp2112 0003:10C4:EA90.0003: Part Number: 0x0C Device Version: 0x02
...

22

Odp: i2c over CP2112

Zainstaluj kmod-usb-hid i kmod-hid-generic

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

23

Odp: i2c over CP2112

No i mamy to!!! W sensie masz to wink

Dzięki! Dzięki!

Wykrywa magistralę. Podłączę ina219 i jakiś RTC i sprawdzę jak w działaniu na routerze a nie na kompie + linux (gdzie śmiga). Jeszcze raz dzięki!

P.S.
Czy jeśli moje testy w działaniu potwierdzą poprawne działanie samego układu jak i modułu jądra to jest szansa na włączenie na stałe tego modułu do Twoich kompilacji/buildów?

24

Odp: i2c over CP2112

Tak jest.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

25

Odp: i2c over CP2112

Podłączyłem RTC po i2c a konkretnie to ds1307 i wszystko pięknie śmiga, zegar jest widziany, tworzy urządzenie rtc itd. hwclock czyta, zapisuje czyli komunikacja w dwie strony. Tak więc można śmało powiedzieć działa.

Jedyne wątpliwości, zastanowienie moga budzić dwa wpisy w logach podczas boot'a (na dole szerszy log).

[   15.173036] gpio gpiochip1: Error -2 creating of_node link
[   15.191728] irq: Invalid fwnode type for irqdomain

No jak nic powiązane z modułem ale na pracę RTC nie rzutują. Jeszcze raz dzięki i czekam z niecierpliwościa na oficjalny build wink

A szystkim zainteresowany polecam układ CP2112. W mojej opinii działa stabilniej niż i2c na attiny85 (swoją drogą odpaliłem, działa ale np. skanowanie magistrali resetuje attiny85 ale generalnie też robi robotę). Dzięki za hint z tą opcją!

log:

[   14.519598] i2c /dev entries driver
[   14.533254] usbcore: registered new interface driver i2c-tiny-usb
[   14.702440] hidraw: raw HID events driver (C) Jiri Kosina
[   14.736553] Loading modules backported from Linux version v4.19.161-0-gdaefdc9eb24b
[   14.744332] Backport generated by backports.git v4.19.161-1-0-g4bb568fe
[   14.803570] ip_tables: (C) 2000-2006 Netfilter Core Team
[   14.831641] nf_conntrack version 0.5.0 (1024 buckets, 4096 max)
[   15.075811] cp2112 0003:10C4:EA90.0001: hidraw0: USB HID v1.01 Device [Silicon Laboratories CP2112 HID USB-to-SMBus Bridge] on usb-1b000100.usb-1/input0
[   15.111096] urngd: v1.0.2 started.
[   15.152648] cp2112 0003:10C4:EA90.0001: Part Number: 0x0C Device Version: 0x02
[   15.173036] gpio gpiochip1: Error -2 creating of_node link
[   15.191728] irq: Invalid fwnode type for irqdomain
[   15.196966] usbcore: registered new interface driver usbhid
[   15.202647] usbhid: USB HID core driver