Intento conectar un módulo ENC28J60 que expone una interfaz SPI a mi Beaglebone Black. Solo tengo los pines 1 (NET_CS), 2 (SCK), 3 (MOSI, es decir, D0), 4 (MISO, es decir, D1), 5 (GND), 10 (VCC) conectado a mi Interfaz SPI1 de Beaglebone . Los pines que he conectado son los siguientes. Los pines que no tengo conectados están etiquetados como N/A
en la columna BBB PIN
.
ENC PIN | FUNCTION | BBB PIN
-----------------------------
1 | NET_CS | P9.28
2 | SCK | P9.31
3 | MOSI | P9.29
4 | MISO | P9.30
5 | GND | P9.03
6 | WOL | <N/A>
7 | NET_INT | <N/A>
8 | CLKOUT | <N/A>
9 | NET_RST | <N/A>
10 | VCC | P9.01
He usado la siguiente superposición del árbol de dispositivos para configurar mis pines.
/dts-v1/;
/plugin/;
/ {
compatible = "ti,beaglebone", "ti,beaglebone-black";
/* identification */
part-number = "BB-ENC28J60";
/* version */
version = "00A0";
/* state the resources this cape uses */
exclusive-use =
/* the pin header uses */
"P9.24",
"P9.25",
"P9.26",
"P9.27",
"P9.28",
"P9.29",
"P9.30",
"P9.31",
"spi1";
fragment@0 {
target = <&am33xx_pinmux>;
__overlay__ {
pinctrl_spi1: pinctrl_spi1_pins {
pinctrl-single,pins = <
0x184 0x37 /* P9_24 RST | IN_PULLUP | MODE7 */
0x1ac 0x37 /* P9_25 INT | IN_PULLUP | MODE7 */
0x180 0x37 /* P9_26 WOL | IN_PULLUP | MODE7 */
0x1a4 0x37 /* P9_27 CLKOUT | IN_PULLUP | MODE7 */
0x19c 0x13 /* P9_28 SPI1_CS | OUTPUT_PULLUP | MODE3 */
0x194 0x33 /* P9_29 SPI1_D0 | INPUT_PULLUP | MODE3 */
0x198 0x13 /* P9_30 SPI1_D1 | OUTPUT_PULLUP | MODE3 */
0x190 0x3B /* P9_31 SPI1_SCLK | INPUT_PULLUP | MODE3 */
>;
};
};
};
fragment@1 {
target = <&spi1>;
__overlay__ {
#address-cells = <1>;
#size-cells = <0>;
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_spi1>;
spidev@0{
compatible = "microchip,enc28j60";
reg = <0>;
interrupt-parent = <&gpio3>;
interrupts = <21>;
spi-max-frequency = <20000000>;
};
spidev@1{
compatible = "spidev";
reg = <1>;
spi-max-frequency = <24000000>;
};
};
};
};
Nota: para otros lectores, no tengo idea de lo que estoy haciendo con este árbol de dispositivos, especialmente con respecto al interrupt
que elegí en este ejemplo. Así que no lo cortes y no lo pegues.
Parece que tener solo estos pines conectados es suficiente para identificar el módulo como una interfaz de red de un Debian que se ejecuta en mi Beaglebone. Revisé el registro dmesg
después de aplicar la capa y vi lo siguiente. Cuando juego con el cableado invirtiendo MISO y MOSI o alguna otra combinación que incluya CS o CLK, constantemente obtengo errores en dmesg
. Eso me hace pensar que estoy en el camino correcto, o al menos que mi cableado es correcto.
[ 57.074485] bone-capemgr bone_capemgr.9: part_number 'BB-ENC28J60', version 'N/A'
[ 57.074670] bone-capemgr bone_capemgr.9: slot #7: generic override
[ 57.074721] bone-capemgr bone_capemgr.9: bone: Using override eeprom data at slot 7
[ 57.074774] bone-capemgr bone_capemgr.9: slot #7: 'Override Board Name,00A0,Override Manuf,BB-ENC28J60'
[ 57.075043] bone-capemgr bone_capemgr.9: slot #7: Requesting part number/version based 'BB-ENC28J60-00A0.dtbo
[ 57.075098] bone-capemgr bone_capemgr.9: slot #7: Requesting firmware 'BB-ENC28J60-00A0.dtbo' for board-name 'Override Board Name', version '00A0'
[ 57.086968] bone-capemgr bone_capemgr.9: slot #7: dtbo 'BB-ENC28J60-00A0.dtbo' loaded; converting to live tree
[ 57.088829] bone-capemgr bone_capemgr.9: slot #7: #2 overlays
[ 57.140361] edma-dma-engine edma-dma-engine.0: allocated channel for 0:45
[ 57.140553] edma-dma-engine edma-dma-engine.0: allocated channel for 0:44
[ 57.222844] edma-dma-engine edma-dma-engine.0: allocated channel for 0:43
[ 57.223015] edma-dma-engine edma-dma-engine.0: allocated channel for 0:42
[ 57.223509] enc28j60 spi1.0: enc28j60 Ethernet driver 1.01 loaded
[ 57.237571] net eth1: enc28j60 driver registered
[ 57.247437] bone-capemgr bone_capemgr.9: slot #7: Applied #2 overlays.
Si elevo el nivel de depuración en la interfaz y ifconfig up
la nueva interfaz, veo el resultado a continuación en mi registro del kernel.
Nov 24 08:58:53 arm kernel: [ 117.451971] enc28j60: enc28j60_net_open() enter
Nov 24 08:58:53 arm kernel: [ 117.456764] enc28j60: enc28j60_hw_init() - HalfDuplex
Nov 24 08:58:53 arm kernel: [ 117.456813] enc28j60: enc28j60_soft_reset() enter
Nov 24 08:58:53 arm kernel: [ 117.461525] enc28j60: chip RevID: 0x06
Nov 24 08:58:53 arm kernel: [ 117.469000] enc28j60 Hw initialized.
Nov 24 08:58:53 arm kernel: [ 117.469000] HwRevID: 0x06
Nov 24 08:58:53 arm kernel: [ 117.469000] Cntrl: ECON1 ECON2 ESTAT EIR EIE
Nov 24 08:58:53 arm kernel: [ 117.469000] 0x03 0x88 0x01 0x00 0x00
Nov 24 08:58:53 arm kernel: [ 117.469000] MAC : MACON1 MACON3 MACON4
Nov 24 08:58:53 arm kernel: [ 117.469000] 0x0d 0x32 0x40
Nov 24 08:58:53 arm kernel: [ 117.469000] Rx : ERXST ERXND ERXWRPT ERXRDPT ERXFCON EPKTCNT MAMXFL
Nov 24 08:58:53 arm kernel: [ 117.469000] 0x0000 0x19ff 0x0000 0x19ff 0xa1 0x00 0x05ee
Nov 24 08:58:53 arm kernel: [ 117.469000] Tx : ETXST ETXND MACLCON1 MACLCON2 MAPHSUP
Nov 24 08:58:53 arm kernel: [ 117.469000] 0x1a00 0x1fff 0x0f 0x37 0x10
Nov 24 08:58:53 arm kernel: [ 117.469118] enc28j60: eth1: Setting MAC address to 62:78:04:14:a4:b6
Nov 24 08:58:53 arm kernel: [ 117.469602] enc28j60: enc28j60_hw_enable() enabling interrupts.
Nov 24 08:58:53 arm kernel: [ 117.472893] enc28j60: enc28j60_check_link_status() PHSTAT1: 1800, PHSTAT2: 0000
Nov 24 08:58:53 arm kernel: [ 117.472942] net eth1: link down
Nov 24 08:58:53 arm kernel: [ 117.472982] net eth1: normal mode
Nov 24 08:58:53 arm kernel: [ 117.473035] net eth1: normal mode
Nov 24 08:58:53 arm kernel: [ 117.473208] net eth1: multicast mode
Nov 24 08:58:53 arm kernel: [ 117.473295] IPv6: ADDRCONF(NETDEV_UP): eth1: link is not ready
Nov 24 08:58:53 arm kernel: [ 117.473376] enc28j60: multicast mode
En este punto, estoy atascado. Mi pregunta es si se requieren todos los pines de mi módulo, o solo los centrados en SPI. Si no es así, ¿hay algún indicador sobre cómo depurar esto?