On Mon, Feb 3, 2020 at 8:11 PM Greg KH <greg@xxxxxxxxx> wrote: > > On Mon, Feb 03, 2020 at 04:32:46PM +0000, Lucas Tanure wrote: > > Hi, > > > > I'm trying to write a Hid driver for MCP2210. > > What type of device is this? It is a USB <-> SPI converter. > > > But the USB Hid specification is quite complicated. > > The kernel should do it "all for you" already, why do you need to create > a custom HID driver for this device? I need a driver that register an SPI controller with in the kernel. So this SPI controller would receive regmap reads/writes and translate to USB HID packages and send to the SPI device attached in the other side of the cable. > > What type of HID reports does the device export and why doesn't the > existing kernel drivers work for you? I don't know enough yet to answer about HID Reports, but at end of this e-mail I attached the lsub -v of the device. I want to use this device in kernel space, registering a SPI controller. And with this SPI controller another SPI slave device will be registered. So, for the SPI slave device it will be like there is no USB in between itself and the kernel. > > > I would like to know how to send and receive data to the device. Any > > links to a good tutorial ? > > HID has the idea of "reports" and data comes in and out in that specific > format, all depending on how the device describes itself. There's isn't > usually a normal "send/receive" type of thing, but it all depends on the > type of device. Ok. Reading the datasheet of this device I need to send some 64 byte arrays to configure the SPI bus. And after that I start to send reports to communicate with the SPI slave device. > > > This is my current driver is attached. > > > > Thanks > > Lucas > > > #define DEBUG > > #include <linux/module.h> > > #include <linux/hid.h> > > #include <linux/usb.h> > > > > static int mcp2210_probe(struct hid_device *hdev, > > const struct hid_device_id *id) > > { > > struct usb_interface *intf = to_usb_interface(hdev->dev.parent); > > int ret = 0; > > > > hid_dbg(hdev, "%s\n", __FUNCTION__); > > > > ret = hid_parse(hdev); > > if (ret) { > > hid_err(hdev, "parse failed\n"); > > return ret; > > } else { > > hid_dbg(hdev, "parse success\n"); > > } > > > > ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT); > > if (ret) { > > hid_err(hdev, "hw start failed\n"); > > return ret; > > } else { > > hid_dbg(hdev, "start success\n"); > > } > > Does this all work? For this version, it`s takes precedence from HID generic driver, wich is great. > > What fails? If I try to execute small test of data communcation: u8 *buf = kzalloc (64, GFP_KERNEL); buf[0] = 0x50; //read EEPROM command buf[1] = 0x03 ; // Address to read ret = hid_hw_raw_request(hdev, 0, buf, 64, HID_INPUT_REPORT, HID_REQ_GET_REPORT) ret is -EPIPE. > > thanks, > > greg k-h Many Thanks Lucas Bus 001 Device 008: ID 04d8:00de Microchip Technology, Inc. MCP2210 USB to SPI Master Couldn't open device, some information will be missing Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 0 bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 8 idVendor 0x04d8 Microchip Technology, Inc. idProduct 0x00de bcdDevice 0.02 iManufacturer 1 iProduct 2 iSerial 3 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 0x0029 bNumInterfaces 1 bConfigurationValue 1 iConfiguration 0 bmAttributes 0x80 (Bus Powered) MaxPower 100mA Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 2 bInterfaceClass 3 Human Interface Device bInterfaceSubClass 0 bInterfaceProtocol 0 iInterface 0 HID Device Descriptor: bLength 9 bDescriptorType 33 bcdHID 1.11 bCountryCode 0 Not supported bNumDescriptors 1 bDescriptorType 34 Report wDescriptorLength 29 Report Descriptors: ** UNAVAILABLE ** Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0040 1x 64 bytes bInterval 1 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x01 EP 1 OUT bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0040 1x 64 bytes bInterval 1 _______________________________________________ Kernelnewbies mailing list Kernelnewbies@xxxxxxxxxxxxxxxxx https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies