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:

 Bash | 
 
 copy code |
?

1
dtc -I dtb -O dts sun8i-h3-spi0-mcp2515.dtbo > sun8i-h3-spi0-mcp2515.dts

Następnie wyedytowałem…

 Bash | 
 
 copy code |
?

1
nano sun8i-h3-spi0-mcp2515.dts

…do następującej postaci:

 Bash | 
 
 copy code |
?

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:

 Bash | 
 
 copy code |
?

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:

 Bash | 
 
 copy code |
?

1
nano /boot/armbianEnv.txt

 Bash | 
 
 copy code |
?

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:

 Bash | 
 
 copy code |
?

1
nano /etc/modules

 Bash | 
 
 copy code |
?

1
can
2
can-dev
3
can-raw

 Bash | 
 
 copy code |
?

1
nano /etc/network/interfaces

 Bash | 
 
 copy code |
?

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:

 Bash | 
 
 copy code |
?

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