can: usb: esd_usb2: Add support for CAN-USB/Micro and listen-only mode
PATCH 1/1 can: usb: esd_usb2: Add support for CAN-USB/Micro and listen-only mode
This patch extends the esd_usb2 driver to support the tiny CAN-USB/Micro CAN/USB interface.
Listen-only mode for both supported devices is added also.
--- drivers/net/can/usb/Kconfig | 4 ++-- drivers/net/can/usb/esd_usb2.c | 39 +++++++++++++++++++++++++++++++-------- 2 files changed, 33 insertions(+), 10 deletions(-)
drivers/net/can/usb/Kconfig +2 -2
@@ -8,9 +8,9 @@ config CAN_EMS_USB from EMS Dr. Thomas Wuensche (http://www.ems-wuensche.de). config CAN_ESD_USB2 - tristate "ESD USB/2 CAN/USB interface" + tristate "ESD USB/2 and USB/Micro CAN/USB interfaces" ---help--- - This driver supports the CAN-USB/2 interface + This driver supports the CAN-USB/2 and CAN-USB/Micro interfaces from esd electronic system design gmbh (http://www.esd.eu). config CAN_PEAK_USB
drivers/net/can/usb/esd_usb2.c +31 -8
@@ -1,7 +1,7 @@/* -* CAN driver for esd CAN-USB/2 +* CAN driver for esd CAN-USB/2 and CAN-USB/Micro * -* Copyright (C) 2010 Matthias Fuchs <[email protected]>, esd gmbh +* Copyright (C) 2010-2012 Matthias Fuchs <[email protected]>, esd gmbh * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published
@@ -28,14 +28,16 @@#include <linux/can/error.h> MODULE_AUTHOR ("Matthias Fuchs <[email protected]>" ); -MODULE_DESCRIPTION ("CAN driver for esd CAN-USB/2 interfaces" ); +MODULE_DESCRIPTION ("CAN driver for esd CAN-USB/2 and CAN-USB/Micro interfaces" );MODULE_LICENSE ("GPL v2" );/* Define these values to match your devices */ #define USB_ESDGMBH_VENDOR_ID 0x0ab4#define USB_CANUSB2_PRODUCT_ID 0x0010 +#define USB_CANUSBM_PRODUCT_ID 0x0011#define ESD_USB2_CAN_CLOCK 60000000 +#define ESD_USBM_CAN_CLOCK 36000000#define ESD_USB2_MAX_NETS 2/* USB2 commands */
@@ -69,6 +71,7 @@ MODULE_LICENSE("GPL v2");#define ESD_USB2_TSEG2_SHIFT 20#define ESD_USB2_SJW_MAX 4#define ESD_USB2_SJW_SHIFT 14 +#define ESD_USBM_SJW_SHIFT 24#define ESD_USB2_BRP_MIN 1#define ESD_USB2_BRP_MAX 1024#define ESD_USB2_BRP_INC 1
@@ -183,6 +186,7 @@ struct __attribute__ ((packed)) esd_usb2_msg {static struct usb_device_id esd_usb2_table[] = { {USB_DEVICE (USB_ESDGMBH_VENDOR_ID ,USB_CANUSB2_PRODUCT_ID )}, + {USB_DEVICE (USB_ESDGMBH_VENDOR_ID ,USB_CANUSBM_PRODUCT_ID )}, {} };MODULE_DEVICE_TABLE (usb, esd_usb2_table);
@@ -889,18 +893,29 @@ static int esd_usb2_set_bittiming(struct net_device *netdev)struct can_bittiming *bt = &priv->can.bittiming;struct esd_usb2_msg msg;u32 canbtr; +int sjw_shift; canbtr =ESD_USB2_UBR ; canbtr |= (bt->brp -1 ) & (ESD_USB2_BRP_MAX -1 ); + +if (le16_to_cpu (priv->usb2->udev->descriptor.idProduct) == +USB_CANUSBM_PRODUCT_ID ) + sjw_shift =ESD_USBM_SJW_SHIFT ; +else { + sjw_shift =ESD_USB2_SJW_SHIFT ; +if (priv->can.ctrlmode &CAN_CTRLMODE_3_SAMPLES ) + canbtr |=ESD_USB2_3_SAMPLES ; + } +if (priv->can.ctrlmode &CAN_CTRLMODE_LISTENONLY ) + canbtr |=ESD_USB2_LOM ; + canbtr |= ((bt->sjw -1 ) & (ESD_USB2_SJW_MAX -1 )) - <<ESD_USB2_SJW_SHIFT ; + << sjw_shift; canbtr |= ((bt->prop_seg + bt->phase_seg1 -1 ) & (ESD_USB2_TSEG1_MAX -1 )) <<ESD_USB2_TSEG1_SHIFT ; canbtr |= ((bt->phase_seg2 -1 ) & (ESD_USB2_TSEG2_MAX -1 )) <<ESD_USB2_TSEG2_SHIFT ; -if (priv->can.ctrlmode &CAN_CTRLMODE_3_SAMPLES ) - canbtr |=ESD_USB2_3_SAMPLES ; msg.msg.hdr.len =2 ; msg.msg.hdr.cmd =CMD_SETBAUD ;
@@ -971,12 +986,20 @@ static int esd_usb2_probe_one_net(struct usb_interface *intf, int index) priv->index = index; priv->can.state =CAN_STATE_STOPPED ; - priv->can.clock.freq =ESD_USB2_CAN_CLOCK ; + priv->can.ctrlmode_supported =CAN_CTRLMODE_LISTENONLY ; + +if (le16_to_cpu (dev->udev->descriptor.idProduct) == +USB_CANUSBM_PRODUCT_ID ) + priv->can.clock.freq =ESD_USBM_CAN_CLOCK ; +else { + priv->can.clock.freq =ESD_USB2_CAN_CLOCK ; + priv->can.ctrlmode_supported |=CAN_CTRLMODE_3_SAMPLES ; + } + priv->can.bittiming_const = &esd_usb2_bittiming_const; priv->can.do_set_bittiming = esd_usb2_set_bittiming; priv->can.do_set_mode = esd_usb2_set_mode; priv->can.do_get_berr_counter = esd_usb2_get_berr_counter; - priv->can.ctrlmode_supported =CAN_CTRLMODE_3_SAMPLES ; netdev->flags |=IFF_ECHO ;/* we support local echo */
Signature · 1 line
1.7.4.1
Marc Kleine-Budde
maintainerQuoted 4 lines · Matthias Fuchs
This patch extends the
esd_usb2driver to support the tiny CAN-USB/Micro CAN/USB interface.Listen-only mode for both supported devices is added also.
Please make it two separate patches, see comments inline.
Quoted 77 lines
Signed-off-by Matthias Fuchs <[email protected]>--- drivers/net/can/usb/Kconfig | 4 ++-- drivers/net/can/usb/esd_usb2.c | 39 +++++++++++++++++++++++++++++++-------- 2 files changed, 33 insertions(+), 10 deletions(-)drivers/net/can/usb/Kconfig +2
-2@@ -8,9 +8,9 @@ config CAN_EMS_USB from EMS Dr. Thomas Wuensche (http://www.ems-wuensche.de). config CAN_ESD_USB2 - tristate "ESD USB/2 CAN/USB interface" + tristate "ESD USB/2 and USB/Micro CAN/USB interfaces" ---help--- - This driver supports the CAN-USB/2 interface + This driver supports the CAN-USB/2 and CAN-USB/Micro interfaces from esd electronic system design gmbh (http://www.esd.eu). config CAN_PEAK_USBdrivers/net/can/usb/esd_usb2.c +8
-3@@ -1,7 +1,7 @@/* -* CAN driver for esd CAN-USB/2 +* CAN driver for esd CAN-USB/2 and CAN-USB/Micro * -* Copyright (C) 2010 Matthias Fuchs <[email protected]>, esd gmbh +* Copyright (C) 2010-2012 Matthias Fuchs <[email protected]>, esd gmbh * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published @@ -28,14 +28,16 @@#include <linux/can/error.h> MODULE_AUTHOR ("Matthias Fuchs <[email protected]>" ); -MODULE_DESCRIPTION ("CAN driver for esd CAN-USB/2 interfaces" ); +MODULE_DESCRIPTION ("CAN driver for esd CAN-USB/2 and CAN-USB/Micro interfaces" );MODULE_LICENSE ("GPL v2" );/* Define these values to match your devices */ #define USB_ESDGMBH_VENDOR_ID 0x0ab4#define USB_CANUSB2_PRODUCT_ID 0x0010 +#define USB_CANUSBM_PRODUCT_ID 0x0011#define ESD_USB2_CAN_CLOCK 60000000 +#define ESD_USBM_CAN_CLOCK 36000000#define ESD_USB2_MAX_NETS 2/* USB2 commands */ @@ -69,6 +71,7 @@ MODULE_LICENSE("GPL v2");#define ESD_USB2_TSEG2_SHIFT 20#define ESD_USB2_SJW_MAX 4#define ESD_USB2_SJW_SHIFT 14 +#define ESD_USBM_SJW_SHIFT 24#define ESD_USB2_BRP_MIN 1#define ESD_USB2_BRP_MAX 1024#define ESD_USB2_BRP_INC 1@@ -183,6 +186,7 @@ struct __attribute__ ((packed)) esd_usb2_msg {static struct usb_device_id esd_usb2_table[] = { {USB_DEVICE (USB_ESDGMBH_VENDOR_ID ,USB_CANUSB2_PRODUCT_ID )}, + {USB_DEVICE (USB_ESDGMBH_VENDOR_ID ,USB_CANUSBM_PRODUCT_ID )}, {} };MODULE_DEVICE_TABLE (usb, esd_usb2_table);@@ -889,18 +893,29 @@ static int esd_usb2_set_bittiming(struct net_device *netdev)struct can_bittiming *bt = &priv->can.bittiming;struct esd_usb2_msg msg;u32 canbtr; +int sjw_shift;
drivers/net/can/usb/esd_usb2.c static int esd_usb2_set_bittiming(struct net_device *netdev) · line 907
Quoted 10 lines
drivers/net/can/usb/esd_usb2.c +8
-0canbtr =ESD_USB2_UBR ; canbtr |= (bt->brp -1 ) & (ESD_USB2_BRP_MAX -1 ); + +if (le16_to_cpu (priv->usb2->udev->descriptor.idProduct) == +USB_CANUSBM_PRODUCT_ID ) + sjw_shift =ESD_USBM_SJW_SHIFT ; +else { + sjw_shift =ESD_USB2_SJW_SHIFT ; +if (priv->can.ctrlmode &CAN_CTRLMODE_3_SAMPLES ) + canbtr |=ESD_USB2_3_SAMPLES ;
No need to move the CAN_CTRLMODE_3_SAMPLES setting here. The framework takes care, that only supported ctrl modes are accepted.
Quoted 31 lines
drivers/net/can/usb/esd_usb2.c +13
-4+ } +if (priv->can.ctrlmode &CAN_CTRLMODE_LISTENONLY ) + canbtr |=ESD_USB2_LOM ; + canbtr |= ((bt->sjw -1 ) & (ESD_USB2_SJW_MAX -1 )) - <<ESD_USB2_SJW_SHIFT ; + << sjw_shift; canbtr |= ((bt->prop_seg + bt->phase_seg1 -1 ) & (ESD_USB2_TSEG1_MAX -1 )) <<ESD_USB2_TSEG1_SHIFT ; canbtr |= ((bt->phase_seg2 -1 ) & (ESD_USB2_TSEG2_MAX -1 )) <<ESD_USB2_TSEG2_SHIFT ; -if (priv->can.ctrlmode &CAN_CTRLMODE_3_SAMPLES ) - canbtr |=ESD_USB2_3_SAMPLES ; msg.msg.hdr.len =2 ; msg.msg.hdr.cmd =CMD_SETBAUD ;@@ -971,12 +986,20 @@ static int esd_usb2_probe_one_net(struct usb_interface *intf, int index) priv->index = index; priv->can.state =CAN_STATE_STOPPED ; - priv->can.clock.freq =ESD_USB2_CAN_CLOCK ; + priv->can.ctrlmode_supported =CAN_CTRLMODE_LISTENONLY ; + +if (le16_to_cpu (dev->udev->descriptor.idProduct) == +USB_CANUSBM_PRODUCT_ID ) + priv->can.clock.freq =ESD_USBM_CAN_CLOCK ; +else { + priv->can.clock.freq =ESD_USB2_CAN_CLOCK ; + priv->can.ctrlmode_supported |=CAN_CTRLMODE_3_SAMPLES ;
drivers/net/can/usb/esd_usb2.c static int esd_usb2_probe_one_net(struct usb_interface *intf, int index) · line 1005
Quoted 10 lines
drivers/net/can/usb/esd_usb2.c +2
-1+ } + priv->can.bittiming_const = &esd_usb2_bittiming_const; priv->can.do_set_bittiming = esd_usb2_set_bittiming; priv->can.do_set_mode = esd_usb2_set_mode; priv->can.do_get_berr_counter = esd_usb2_get_berr_counter; - priv->can.ctrlmode_supported =CAN_CTRLMODE_3_SAMPLES ; netdev->flags |=IFF_ECHO ;/* we support local echo */
Marc
Signature · 4 lines
Pengutronix e.K. | Marc Kleine-Budde | Industrial Linux Solutions | Phone: +49-231-2826-924 | Vertretung West/Dortmund | Fax: +49-5121-206917-5555 | Amtsgericht Hildesheim, HRA 2686 | http://www.pengutronix.de |