Re: MCP2518FD Treiber

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hey Niels,

kennst Du schon die linux-can (linux-can <linux-can@xxxxxxxxxxxxxxx>)
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, 40MHz

Hier 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 <niels@xxxxxxxxxx>" 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 |

Attachment: signature.asc
Description: OpenPGP digital signature


[Index of Archives]     [Automotive Discussions]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]     [CAN Bus]

  Powered by Linux