Re: MCP2518FD Treiber
From: Marc Kleine-Budde <mkl@pengutronix.de>
Date: 2020-11-21 13:02:57
Hey Niels, kennst Du schon die linux-can (linux-can [off-list ref]) Mailingliste? Bitte verwende diese für Community Anfragen. Wenn Du noch fragen hast, nimm bitte die ML auf Cc und steige auf Englisch um :D On 11/21/20 10:45 AM, Niels wrote:
Ich habe Deinen Treiber im offiziellen Kernel gefunden und versuche nun ein Projekt mit diesem Baustein umzusetzen. Der MCP (MIKROE 3060: https://www.mikroe.com/mcp2518fd-click) ist verbunden mit einem IMX7D von NXP.> Leider unterstützt NXP für den IMX7D als neustes zur Zeit nur den Kernel 5.4.47. Auf dem IMX7D läuft ein Debian 10.6. Für den Backport musste allerdings nur in rx_offload.c die Funktion can_rx_offload_add_manual (aus dem master kopiert) hinzugefügt werden und zwei Namen in einer Struktur haben sich geändert.
Es gibt aus meiner Sicht beim imx7 den Gammelkernel von nxp einzusetzen.
Sieht eigentlich alles gut aus. Signale auf dem Scope sehen auch richtig aus. Nur das abschließende "ip link can2 up" bzw. "ifconfig can2 up" resultiert in "invalid argument". Ich hab es mit verschiedenen iproute2 Versionen / SPI Frequenzen ausprobiert. Bei der Initialisierung das e: 0.00MHz irritiert mich. Fehlt da beim DT oder beim ip link set noch was ?
"e" steht für effective. Wenn Du auf einen aktuellen Kernel wechselst oder noch
den folgen Patch auf den nxp Kernel wirfst, dann zeigt der Treiber an, welche
clock der SPI Bus tatsächlich hat.
"c" ist der externe Oszillator
"m" ist die maximale Frequenz vom DT
"r" ist die angefragte (requested) Frequenz des mcp251xfd
Treibers an das SPI Framework
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/drivers/spi/spi-imx.c?h=v5.10-rc4&id=bf253e6bf6b876a4ce74db7dcf8a13b80d84aa5f
root@cl-debian:~# dmesg | grep mcp
[ 15.716774] mcp251xfd spi1.0: can_rx_offload_init_queue: skb_queue_len_max=512
[ 15.756445] mcp251xfd spi1.0 can2: MCP2518FD rev0.0 (+RX_INT -MAB_NO_WARN +CRC_REG +CRC_RX +CRC_TX +ECC -HD c:40.00MHz m:4.00MHz r:4.00MHz e:0.00MHz) successfully initialized.
root@cl-debian:~# ip --details link show can2
7: can2: <NOARP,ECHO> mtu 16 qdisc noop state DOWN mode DEFAULT group default qlen 10
link/can promiscuity 0 minmtu 0 maxmtu 0
can state STOPPED (berr-counter tx 0 rx 0) restart-ms 0
mcp251xfd: tseg1 2..256 tseg2 1..128 sjw 1..128 brp 1..256 brp-inc 1
mcp251xfd: dtseg1 1..32 dtseg2 1..16 dsjw 1..16 dbrp 1..256 dbrp-inc 1
clock 40000000 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
root@cl-debian:~# ip link set can2 type can bitrate 500000 dbitrate 1000000 fd on
root@cl-debian:~# ip --details link show can2
7: can2: <NOARP,ECHO> mtu 72 qdisc noop state DOWN mode DEFAULT group default qlen 10
link/can promiscuity 0 minmtu 0 maxmtu 0
can <FD> state STOPPED (berr-counter tx 0 rx 0) restart-ms 0
bitrate 500000 sample-point 0.875
tq 25 prop-seg 34 phase-seg1 35 phase-seg2 10 sjw 1
mcp251xfd: tseg1 2..256 tseg2 1..128 sjw 1..128 brp 1..256 brp-inc 1
dbitrate 1000000 dsample-point 0.750
dtq 25 dprop-seg 14 dphase-seg1 15 dphase-seg2 10 dsjw 1
mcp251xfd: dtseg1 1..32 dtseg2 1..16 dsjw 1..16 dbrp 1..256 dbrp-inc 1
clock 40000000 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
root@cl-debian:~# ip link set can2 up
RTNETLINK answers: Invalid argument
root@cl-debian:~# dmesg | grep mcp
[ 15.716774] mcp251xfd spi1.0: can_rx_offload_init_queue: skb_queue_len_max=512
[ 15.756445] mcp251xfd spi1.0 can2: MCP2518FD rev0.0 (+RX_INT -MAB_NO_WARN +CRC_REG +CRC_RX +CRC_TX +ECC -HD c:40.00MHz m:4.00MHz r:4.00MHz e:0.00MHz) successfully initialized.
[ 436.792327] mcp251xfd spi1.0 can2: FIFO setup: TEF: 4*12 bytes = 48 bytes, TX: 4*72 bytes = 288 bytes
[ 436.792344] mcp251xfd spi1.0 can2: FIFO setup: RX-0: 16*76 bytes = 1216 bytes
[ 436.792353] mcp251xfd spi1.0 can2: FIFO setup: free: 496 bytes
root@cl-debian:~# strace ifconfig can2 up
ioctl(4, SIOCGIFFLAGS, {ifr_name="can2", ifr_flags=IFF_NOARP}) = 0
ioctl(4, SIOCSIFFLAGS, {ifr_name="can2", ifr_flags=IFF_UP|IFF_RUNNING|IFF_NOARP}) = -1 EINVAL (Invalid argument)
dup(2)
Device Tree Schnipsel:
&ecspi2 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_ecspi2>;
status = "okay";
fsl,spi-num-chipselects = <1>;
cs-gpios = <&gpio4 23 0>;
mcp2518fd@0 {
compatible = "microchip,mcp2518fd";
reg = <0x00>;
microchip,rx-int-gpios = <&gpio3 0 GPIO_ACTIVE_LOW>;Das ist der nRX-INT Pin des MCP, nicht der Interrupt.
spi-max-frequency = <4000000>;
clocks = <&mcp2518fd_clk>; // fixed, 40MHzHier fehlt der Interrupt, siehe: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/devicetree/bindings/net/can/microchip,mcp251xfd.yaml?h=v5.10-rc4#n75 Unter der Annahme, dass der gpio3-0 der richtige IRQ ist, dann musst Du die Zeile | interrupts-extended = <&gpio3 0 IRQ_TYPE_LEVEL_LOW>; anstatt der | microchip,rx-int-gpios verwenden. Ich schaue mal, ob ich beim laden des Treibers schon feststellen kann, ob der IRQ fehlt um dann eine Fehlermeldung auszugeben. Deine Email Adresse würde ich als "Reported-by: Niels [off-list ref]" unter den Patch schreiben. Ist das OK? Grüße, Marc -- Pengutronix e.K. | Marc Kleine-Budde | Embedded Linux | https://www.pengutronix.de | Vertretung West/Dortmund | Phone: +49-231-2826-924 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
Attachments
- signature.asc [application/pgp-signature] 488 bytes