linklayer / cantact

Drivers and Command Line Interface for CANtact tools

Home Page:http://cantact.io

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Device not found Error

antman1p opened this issue · comments

On Ubuntu, when I run can -v dump I get a Device not found Error. ifconfig -a shows can0. The red AND green lights are on, on the cantact.

Hi, thanks for reporting this issue!

Could you provide the tail end of the output for dmesg? It should look something like

[177119.097238] usb 1-7.4.1.4.1: New USB device found, idVendor=1d50, idProduct=606f, bcdDevice= 0.00
[177119.097239] usb 1-7.4.1.4.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[177119.097240] usb 1-7.4.1.4.1: Product: CANtact gs_usb
[177119.097240] usb 1-7.4.1.4.1: Manufacturer: Linklayer
[177119.097241] usb 1-7.4.1.4.1: SerialNumber: 000000000002
[177119.103271] gs_usb 1-7.4.1.4.1:1.0: Configuring for 1 interfaces

It sounds like ether the VID/PID are not what this driver expects, or the driver is failing to detach the device from the kernel gs_usb driver.

@ericevenchick I'm having the same error on OSX Catalina 10.15.7:

$ brew install lsusb
(...)
$ lsusb
Bus 020 Device 010: ID 05ac:100e Apple Inc. USB3.0 Hub
Bus 020 Device 009: ID 05ac:100f Apple Inc. USB2.0 Hub
Bus 020 Device 033: ID ad50:60c4 ad50 CANtact dev  Serial: 001600024153430820333937
Bus 020 Device 012: ID 05ac:1460 Apple Inc. USB-C Digital AV Multiport Adapter  Serial: DLC725707H0G2KQAR
Bus 000 Device 001: ID 1d6b:PTLP Linux Foundation USB 3.0 Bus

Then when trying to play a bit with the cantact Rust CLI I'm getting this:

$ ./target/debug/can cfg --channel 0 --bitrate 500000
Channels:
	0 -> Channel { bitrate: 500000, enabled: true, loopback: false, monitor: false, fd: false, data_bitrate: 500000 }
	1 -> Channel { bitrate: 500000, enabled: true, loopback: false, monitor: false, fd: false, data_bitrate: 500000 }

$ ./target/debug/can dump
error: DeviceError(DeviceNotFound)

Full disclosure, I'm reusing one of my STM32F042G6 project dev boards instead of an actual CANtact to get acquainted with this device SINCE I JUST PURCHASED THE CANTACT-PRO and can't wait until it starts shipping post 8th January to Australia ;)

With very minor cantact-fw mods (USB pin remapping is needed due to my STM32 package) I got my dev board flashed with cantact firmware (v1, not PRO):

--- a/Src/stm32f0xx_hal_msp.c
+++ b/Src/stm32f0xx_hal_msp.c
@@ -70,10 +70,10 @@ void HAL_CAN_MspInit(CAN_HandleTypeDef* hcan)
     __CAN_CLK_ENABLE();
 
     /**CAN GPIO Configuration
-    PB8     ------> CAN_RX
-    PB9     ------> CAN_TX
+    PB4     ------> CAN_RX
+    PB5     ------> CAN_TX
     */
-    GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9;
+    GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5;
     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
     GPIO_InitStruct.Pull = GPIO_NOPULL;
     GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
@@ -99,10 +99,10 @@ void HAL_CAN_MspDeInit(CAN_HandleTypeDef* hcan)
     __CAN_CLK_DISABLE();
 
     /**CAN GPIO Configuration
-    PB8     ------> CAN_RX
-    PB9     ------> CAN_TX
+    PB4     ------> CAN_RX
+    PB5     ------> CAN_TX
     */
-    HAL_GPIO_DeInit(GPIOB, GPIO_PIN_8|GPIO_PIN_9);
+    HAL_GPIO_DeInit(GPIOB, GPIO_PIN_4|GPIO_PIN_5);
 
   /* USER CODE BEGIN CAN_MspDeInit 1 */
 
diff --git a/Src/system_stm32f0xx.c b/Src/system_stm32f0xx.c
index 9cd1ca7..29db7cf 100644
--- a/Src/system_stm32f0xx.c
+++ b/Src/system_stm32f0xx.c
@@ -196,6 +196,12 @@ void SystemInit(void)
   /* Reset HSI14 bit */
   RCC->CR2 &= (uint32_t)0xFFFFFFFE;
 
+  /* Remap pins for USB, see:
+   * https://community.st.com/s/question/0D50X00009XkghG/solved-stm32f042-can-init-problem
+  */
+  RCC->APB2ENR |= RCC_APB2ENR_SYSCFGCOMPEN;
+  SYSCFG->CFGR1 |= (uint32_t)SYSCFG_CFGR1_PA11_PA12_RMP;
+
   /* Disable all interrupts */
   RCC->CIR = 0x00000000;

Fun fact, on a Linux machine (old but gold kernel 3.2.x), I'm only getting a bare VID:PID (i.e just ad50:60c4) instead of a proper enumeration string like I get on OSX:

Bus 020 Device 033: ID ad50:60c4 ad50 CANtact dev  Serial: 001600024153430820333937

I doubt it's related, but there are a few warnings referring to the pointer signedness when compiling cantact-fw and specifically related to those strings:

arm-none-eabi-gcc -DCORE_M0 -D HSI48_VALUE=48000000 -D HSE_VALUE=16000000 -D CANTACT_BUILD_NUMBER=0 -DSTM32F042x6 -IDrivers/CMSIS/Include -IDrivers/CMSIS/Device/ST/STM32F0xx/Include -IDrivers/STM32F0xx_HAL_Driver/Inc -IInc -IMiddlewares/ST/STM32_USB_Device_Library/Core/Inc -IMiddlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc  -mcpu=cortex-m0 -mthumb -Wall -g -ffunction-sections -fdata-sections -Os -Os -c -o build/stm32f0xx_hal_msp.o Src/stm32f0xx_hal_msp.c
Src/usbd_desc.c: In function 'USBD_FS_ProductStrDescriptor':
Src/usbd_desc.c:72:33: warning: pointer targets in passing argument 1 of 'USBD_GetString' differ in signedness [-Wpointer-sign]
   72 | #define USBD_PRODUCT_STRING_FS  "CANtact" " " CANTACT_SW_VER
      |                                 ^~~~~~~~~
      |                                 |
      |                                 char *
Src/usbd_desc.c:209:21: note: in expansion of macro 'USBD_PRODUCT_STRING_FS'
  209 |     USBD_GetString (USBD_PRODUCT_STRING_FS, USBD_StrDesc, length);
      |                     ^~~~~~~~~~~~~~~~~~~~~~
In file included from Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_core.h:36,
                 from Src/usbd_desc.c:37:
Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h:90:39: note: expected 'uint8_t *' {aka 'unsigned char *'} but argument is of type 'char *'
   90 | void USBD_GetString         (uint8_t *desc, uint8_t *unicode, uint16_t *len);
      |                              ~~~~~~~~~^~~~
Src/usbd_desc.c:72:33: warning: pointer targets in passing argument 1 of 'USBD_GetString' differ in signedness [-Wpointer-sign]
   72 | #define USBD_PRODUCT_STRING_FS  "CANtact" " " CANTACT_SW_VER
      |                                 ^~~~~~~~~
      |                                 |
      |                                 char *
Src/usbd_desc.c:213:21: note: in expansion of macro 'USBD_PRODUCT_STRING_FS'
  213 |     USBD_GetString (USBD_PRODUCT_STRING_FS, USBD_StrDesc, length);
      |                     ^~~~~~~~~~~~~~~~~~~~~~
In file included from Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_core.h:36,
                 from Src/usbd_desc.c:37:
Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h:90:39: note: expected 'uint8_t *' {aka 'unsigned char *'} but argument is of type 'char *'
   90 | void USBD_GetString         (uint8_t *desc, uint8_t *unicode, uint16_t *len);
      |                              ~~~~~~~~~^~~~
Src/usbd_desc.c: In function 'USBD_FS_ManufacturerStrDescriptor':
Src/usbd_desc.c:70:34: warning: pointer targets in passing argument 1 of 'USBD_GetString' differ in signedness [-Wpointer-sign]
   70 | #define USBD_MANUFACTURER_STRING "CANtact"
      |                                  ^~~~~~~~~
      |                                  |
      |                                  char *
Src/usbd_desc.c:227:19: note: in expansion of macro 'USBD_MANUFACTURER_STRING'
  227 |   USBD_GetString (USBD_MANUFACTURER_STRING, USBD_StrDesc, length);
      |                   ^~~~~~~~~~~~~~~~~~~~~~~~
In file included from Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_core.h:36,
                 from Src/usbd_desc.c:37:
Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h:90:39: note: expected 'uint8_t *' {aka 'unsigned char *'} but argument is of type 'char *'
   90 | void USBD_GetString         (uint8_t *desc, uint8_t *unicode, uint16_t *len);
      |                              ~~~~~~~~~^~~~
Src/usbd_desc.c: In function 'USBD_FS_ConfigStrDescriptor':
Src/usbd_desc.c:74:41: warning: pointer targets in passing argument 1 of 'USBD_GetString' differ in signedness [-Wpointer-sign]
   74 | #define USBD_CONFIGURATION_STRING_FS    "CDC Config"
      |                                         ^~~~~~~~~~~~
      |                                         |
      |                                         char *
Src/usbd_desc.c:279:21: note: in expansion of macro 'USBD_CONFIGURATION_STRING_FS'
  279 |     USBD_GetString (USBD_CONFIGURATION_STRING_FS, USBD_StrDesc, length);
      |                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_core.h:36,
                 from Src/usbd_desc.c:37:
Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h:90:39: note: expected 'uint8_t *' {aka 'unsigned char *'} but argument is of type 'char *'
   90 | void USBD_GetString         (uint8_t *desc, uint8_t *unicode, uint16_t *len);
      |                              ~~~~~~~~~^~~~
Src/usbd_desc.c:74:41: warning: pointer targets in passing argument 1 of 'USBD_GetString' differ in signedness [-Wpointer-sign]
   74 | #define USBD_CONFIGURATION_STRING_FS    "CDC Config"
      |                                         ^~~~~~~~~~~~
      |                                         |
      |                                         char *
Src/usbd_desc.c:283:21: note: in expansion of macro 'USBD_CONFIGURATION_STRING_FS'
  283 |     USBD_GetString (USBD_CONFIGURATION_STRING_FS, USBD_StrDesc, length);
      |                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_core.h:36,
                 from Src/usbd_desc.c:37:
Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h:90:39: note: expected 'uint8_t *' {aka 'unsigned char *'} but argument is of type 'char *'
   90 | void USBD_GetString         (uint8_t *desc, uint8_t *unicode, uint16_t *len);
      |                              ~~~~~~~~~^~~~
Src/usbd_desc.c: In function 'USBD_FS_InterfaceStrDescriptor':
Src/usbd_desc.c:75:34: warning: pointer targets in passing argument 1 of 'USBD_GetString' differ in signedness [-Wpointer-sign]
   75 | #define USBD_INTERFACE_STRING_FS "CDC Interface"
      |                                  ^~~~~~~~~~~~~~~
      |                                  |
      |                                  char *
Src/usbd_desc.c:299:21: note: in expansion of macro 'USBD_INTERFACE_STRING_FS'
  299 |     USBD_GetString (USBD_INTERFACE_STRING_FS, USBD_StrDesc, length);
      |                     ^~~~~~~~~~~~~~~~~~~~~~~~
In file included from Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_core.h:36,
                 from Src/usbd_desc.c:37:
Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h:90:39: note: expected 'uint8_t *' {aka 'unsigned char *'} but argument is of type 'char *'
   90 | void USBD_GetString         (uint8_t *desc, uint8_t *unicode, uint16_t *len);
      |                              ~~~~~~~~~^~~~
Src/usbd_desc.c:75:34: warning: pointer targets in passing argument 1 of 'USBD_GetString' differ in signedness [-Wpointer-sign]
   75 | #define USBD_INTERFACE_STRING_FS "CDC Interface"
      |                                  ^~~~~~~~~~~~~~~
      |                                  |
      |                                  char *
Src/usbd_desc.c:303:21: note: in expansion of macro 'USBD_INTERFACE_STRING_FS'
  303 |     USBD_GetString (USBD_INTERFACE_STRING_FS, USBD_StrDesc, length);
      |                     ^~~~~~~~~~~~~~~~~~~~~~~~
In file included from Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_core.h:36,
                 from Src/usbd_desc.c:37:
Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h:90:39: note: expected 'uint8_t *' {aka 'unsigned char *'} but argument is of type 'char *'
   90 | void USBD_GetString         (uint8_t *desc, uint8_t *unicode, uint16_t *len);
      |                              ~~~~~~~~~^~~~

@ericevenchick Here's how it looks in my (old) linux machine, btw (no can0 interface as @antman1p points out, am I missing loading some kernel module?):

$ lsusb 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 002: ID 413c:a005 Dell Computer Corp. Internal 2.0 Hub
Bus 001 Device 003: ID 0b97:7761 O2 Micro, Inc. Oz776 1.1 Hub
Bus 005 Device 016: ID ad50:60c4        <-------- Only VID:PID, no "CANTACT" strings like in OSX
Bus 001 Device 005: ID 0483:2016 SGS Thomson Microelectronics Fingerprint Reader
Bus 001 Device 006: ID 0b97:7762 O2 Micro, Inc. Oz776 SmartCard Reader
 
$ uname -a
Linux biobit 3.2.0-61-generic-pae #93-Ubuntu SMP Fri May 2 21:46:08 UTC 2014 i686 i686 i386 GNU/Linux
 
$ dmesg
(...)
[  839.640159] usb 5-1: new full-speed USB device number 16 using uhci_hcd
[  839.812272] cdc_acm 5-1:1.0: This device cannot do calls on its own. It is not a modem.
[  839.812331] cdc_acm 5-1:1.0: ttyACM0: USB ACM device
 
$ ifconfig 
eth0      Link encap:Ethernet  HWaddr 00:1c:23:14:0d:a1  
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
          Interrupt:18 
 
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:724 errors:0 dropped:0 overruns:0 frame:0
          TX packets:724 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:51145 (51.1 KB)  TX bytes:51145 (51.1 KB)
 
wlan0     Link encap:Ethernet  HWaddr 00:0e:8e:0d:fe:0d  
          inet addr:10.1.1.35  Bcast:10.1.1.255  Mask:255.255.255.0
          inet6 addr: fdd2:f6ab:51e1:0:30e4:ce13:d249:9bc2/64 Scope:Global
          inet6 addr: fdd2:f6ab:51e1:0:20e:8eff:fe0d:fe0d/64 Scope:Global
          inet6 addr: fe80::20e:8eff:fe0d:fe0d/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:4628 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3275 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:3696703 (3.6 MB)  TX bytes:528172 (528.1 KB)

Whereas on OSX the USB reads well:

CANtact dev:

  Produkt-ID:	0x60c4
  Tillverkar-ID:	0xad50
  Version:	2.00
  Serienummer:	001600024153430820333937
  Hastighet:	Upp till 12 Mbit/s
  Tillverkare:	CANtact
  Plats-ID:	0x14124200 / 27
  Tillgänglig ström (mA):	500
  Nödvändig ström (mA):	100
  Extra arbetsström (mA):	0

Oh, this looks like the original CANtact firmware which does USB serial to CAN is probably not what you want. Instead, give the candlelight firmware (https://github.com/candle-usb/candleLight_fw) a go. It implements gs_usb and should work with SocketCAN and these newer tools.

CANtact Pro doesn't do this serial thing at all, it just implements gs_usb. Serial over USB has bottlenecks and is generally not good.

Oh, thanks! I just tested it with a minor fix for my specific IC package which needs some of the remapping I mentioned before but with a similar HAL API call:

diff --git a/src/main.c b/src/main.c
index 47b63b5..22c28f8 100644
--- a/src/main.c
+++ b/src/main.c
@@ -215,6 +215,8 @@ void SystemClock_Config(void)

        HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

+       __HAL_REMAP_PIN_ENABLE(HAL_REMAP_PA11_PA12);
+
        /* SysTick_IRQn interrupt configuration */
        HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
 }

And the tooling seems to work now, so I just need to drop a CAN transceiver IC to my repurposed dev board (https://github.com/brainstorm/bbtrackball-rs) and I'll be in business, thanks mate!

Just a minor tweak: could you add a warning message on the "old" cantact_fw repo's README.md? That can save a bit of time/head scratching to other folks, cheers! ;)

(...) it just implements gs_usb. Serial over USB has bottlenecks and is generally not good.

@ericevenchick On that point, I'm very curious about the issues you found with serial over USB (a.k.a CDC ACM? SLCAN?)... I don't quite understand how gs_usb is superior or more reliable when the underlying abstraction are both implemented as just queues (I guess?).

Sorry to hijack this issue as I did, @antman1p, I faced your issue under Linux and solved it as the README.md states.

Perhaps @ericevenchick can close this issue now I reckon?