NanoPI Neo Air to bardzo przyjemna płytka systemu embedded.
Pojawiła się potrzeba uruchomienia na tym maleństwie drivera do magistrali CAN.
O ile w dystrybucji ARMBIAN jest wszystko co potrzeba, czyli moduł w kernelu, o tyle problemem okazało się uruchomienie modułu.
Konfigurację (częstotliwość kwarcu dla MCP2515, IRQ) musiałem nadpisać dtb uwzględniając mój hardware.
Pierwszą rzeczą jaką zrobiłem, jest kopii zapasowa konfiguracji. Tak na wszelki wypadek.
Potem skopiowałem plik dtbo do katalogu użytkownika i zdekompilowałem go:
1 | dtc -I dtb -O dts sun8i-h3-spi0-mcp2515.dtbo > sun8i-h3-spi0-mcp2515.dts |
Następnie wyedytowałem…
1 | nano sun8i-h3-spi0-mcp2515.dts |
…do następującej postaci:
01 | /dts-v1/; |
02 | |
03 | / { |
04 | compatible = "allwinner,sun8i-h3"; |
05 | |
06 | fragment@0 { |
07 | target-path = "/aliases"; |
08 | |
09 | __overlay__ { |
10 | spi0 = "/soc/spi@01c68000"; |
11 | }; |
12 | }; |
13 | |
14 | fragment@1 { |
15 | target-path = "/clocks"; |
16 | |
17 | __overlay__ { |
18 | #address-cells = <0x1>; |
19 | #size-cells = <0x1>; |
20 | |
21 | can0_osc_fixed { |
22 | compatible = "fixed-clock"; |
23 | #clock-cells = <0x0>; |
24 | #częstotliwość kwarcu: |
25 | clock-frequency = <16000000>; |
26 | linux,phandle = <0x2>; |
27 | phandle = <0x2>; |
28 | }; |
29 | }; |
30 | }; |
31 | |
32 | fragment@2 { |
33 | target = <0xffffffff>; |
34 | |
35 | __overlay__ { |
36 | |
37 | can0_pin_irq@0 { |
38 | #pin z podpiętym IRQ |
39 | allwinner,pins = "PG11"; |
40 | allwinner,function = "irq"; |
41 | allwinner,drive = <0x0>; |
42 | allwinner,pull = <0x1>; |
43 | linux,phandle = <0x1>; |
44 | phandle = <0x1>; |
45 | }; |
46 | }; |
47 | }; |
48 | |
49 | fragment@3 { |
50 | target = <0xffffffff>; |
51 | |
52 | __overlay__ { |
53 | status = "okay"; |
54 | #address-cells = <0x1>; |
55 | #size-cells = <0x0>; |
56 | |
57 | mcp2515@0 { |
58 | reg = <0x0>; |
59 | compatible = "microchip,mcp2515"; |
60 | pinctrl-names = "default"; |
61 | pinctrl-0 = <0x1>; |
62 | spi-max-frequency = <0x989680>; |
63 | interrupt-parent = <0xffffffff>; |
64 | interrupts = <0 203 2>; |
65 | clocks = <0x2>; |
66 | status = "okay"; |
67 | linux,phandle = <0x3>; |
68 | phandle = <0x3>; |
69 | }; |
70 | }; |
71 | }; |
72 | |
73 | __symbols__ { |
74 | can0_osc_fixed = "/fragment@1/__overlay__/can0_osc_fixed"; |
75 | can0_pin_irq = "/fragment@2/__overlay__/can0_pin_irq@0"; |
76 | can0 = "/fragment@3/__overlay__/mcp2515@0"; |
77 | }; |
78 | |
79 | __fixups__ { |
80 | pio = "/fragment@2:target:0", "/fragment@3/__overlay__/mcp2515@0:interrupt-parent:0"; |
81 | spi0 = "/fragment@3:target:0"; |
82 | }; |
83 | |
84 | __local_fixups__ { |
85 | |
86 | fragment@3 { |
87 | |
88 | __overlay__ { |
89 | |
90 | mcp2515@0 { |
91 | pinctrl-0 = <0x0>; |
92 | clocks = <0x0>; |
93 | }; |
94 | }; |
95 | }; |
96 | }; |
97 | }; |
Na koniec ponowna kompilacja i skopiowanie do katalogu źródłowego:
1 | dtc -O dtb -o sun8i-h3-spi0-mcp2515.dtbo -b 0 sun8i-h3-spi0-mcp2515.dts && cp sun8i-h3-spi0-mcp2515.dtbo /boot/dtb/overlay/ |
Dodałem jeszcze obsługę do pliku armbianEnv:
1 | nano /boot/armbianEnv.txt |
1 | verbosity=7 |
2 | logo=disabled |
3 | console=both |
4 | disp_mode=1920x1080p60 |
5 | overlay_prefix=sun8i-h3 |
6 | rootdev=UUID=abdc65e6-2e32-4a5f-9a19-56c01c6bdb23 |
7 | rootfstype=ext4 |
8 | overlays=spi0-mcp2515 |
Konfiguracja samej magistrali CAN:
1 | nano /etc/network/interfaces |
1 | auto can0 |
2 | iface can0 can static |
3 | #taktowanie magistrali CAN |
4 | bitrate 250000 |
I to wszystko. Po restarcie powinniśmy w dmsg zobaczyć następujące linie:
1 | [ 6.824164] can: controller area network core (rev 20120528 abi 9) |
2 | [ 6.829914] can: raw protocol (rev 20120528) |
3 | [ 8.252856] mcp251x spi0.0 can0: MCP2515 successfully initialized. |
4 | |