1. 18 6月, 2012 8 次提交
    • D
      HID: uhid: implement feature requests · fcfcf0de
      David Herrmann 提交于
      HID standard allows sending a feature request to the device which is
      answered by an HID report. uhid implements this by sending a UHID_FEATURE
      event to user-space which then must answer with UHID_FEATURE_ANSWER. If it
      doesn't do this in a timely manner, the request is discarded silently.
      
      We serialize the feature requests, that is, there is always only a single
      active feature-request sent to user-space, other requests have to wait.
      HIDP and USB-HID do it the same way.
      
      Because we discard feature-requests silently, we must make sure to match
      a response to the corresponding request. We use sequence-IDs for this so
      user-space must copy the ID from the request into the answer.
      Feature-answers are ignored if they do not contain the same ID as the
      currently pending feature request.
      
      Internally, we must make sure that feature-requests are synchronized with
      UHID_DESTROY and close() events. We must not dead-lock when closing the
      HID device, either, so we have to use separate locks.
      Signed-off-by: NDavid Herrmann <dh.herrmann@googlemail.com>
      Signed-off-by: NJiri Kosina <jkosina@suse.cz>
      fcfcf0de
    • D
      HID: uhid: forward raw output reports to user-space · 3b3baa82
      David Herrmann 提交于
      Some drivers that use non-standard HID features require raw output reports
      sent to the device. We now forward these requests directly to user-space
      so the transport-level driver can correctly send it to the device or
      handle it correspondingly.
      
      There is no way to signal back whether the transmission was successful,
      moreover, there might be lots of messages coming out from the driver
      flushing the output-queue. However, there is currently no driver that
      causes this so we are safe. If some drivers need to transmit lots of data
      this way, we need a method to synchronize this and can implement another
      UHID_OUTPUT_SYNC event.
      Signed-off-by: NDavid Herrmann <dh.herrmann@googlemail.com>
      Signed-off-by: NJiri Kosina <jkosina@suse.cz>
      3b3baa82
    • D
      HID: uhid: forward output request to user-space · f80e1360
      David Herrmann 提交于
      If the hid-driver wants to send standardized data to the device it uses a
      linux input_event. We forward this to the user-space transport-level
      driver so they can perform the requested action on the device.
      Signed-off-by: NDavid Herrmann <dh.herrmann@googlemail.com>
      Signed-off-by: NJiri Kosina <jkosina@suse.cz>
      f80e1360
    • D
      HID: uhid: forward open/close events to user-space · e7191474
      David Herrmann 提交于
      HID core notifies us with *_open/*_close callbacks when there is an actual
      user of our device. We forward these to user-space so they can react on
      this. This allows user-space to skip I/O unless they receive an OPEN
      event. When they receive a CLOSE event they can stop I/O again to save
      energy.
      Signed-off-by: NDavid Herrmann <dh.herrmann@googlemail.com>
      Signed-off-by: NJiri Kosina <jkosina@suse.cz>
      e7191474
    • D
      HID: uhid: add UHID_START and UHID_STOP events · ec4b7dea
      David Herrmann 提交于
      We send UHID_START and UHID_STOP events to user-space when the HID core
      starts/stops the device. This notifies user-space about driver readiness
      and data-I/O can start now.
      
      This directly forwards the callbacks from hid-core to user-space.
      Signed-off-by: NDavid Herrmann <dh.herrmann@googlemail.com>
      Signed-off-by: NJiri Kosina <jkosina@suse.cz>
      ec4b7dea
    • D
      HID: uhid: allow feeding input data into uhid devices · 5e87a36a
      David Herrmann 提交于
      This adds a new event type UHID_INPUT which allows user-space to feed raw
      HID reports into the HID subsystem. We copy the data into kernel memory
      and directly feed it into the HID core.
      
      There is no error handling of the events couldn't be parsed so user-space
      should consider all events successfull unless read() returns an error.
      Signed-off-by: NDavid Herrmann <dh.herrmann@googlemail.com>
      Signed-off-by: NJiri Kosina <jkosina@suse.cz>
      5e87a36a
    • D
      HID: uhid: add UHID_CREATE and UHID_DESTROY events · d365c6cf
      David Herrmann 提交于
      UHID_CREATE and UHID_DESTROY are used to create and destroy a device on an
      open uhid char-device. Internally, we allocate and register an HID device
      with the HID core and immediately start the device. From now on events may
      be received or sent to the device.
      
      The UHID_CREATE event has a payload similar to the data used by
      Bluetooth-HIDP when creating a new connection.
      Signed-off-by: NDavid Herrmann <dh.herrmann@googlemail.com>
      Signed-off-by: NJiri Kosina <jkosina@suse.cz>
      d365c6cf
    • D
      HID: uhid: add internal message buffer · ace3d861
      David Herrmann 提交于
      When receiving messages from the HID subsystem, we need to process them
      and store them in an internal buffer so user-space can read() on the char
      device to retrieve the messages.
      
      This adds a static buffer for 32 messages to each uhid device. Each
      message is dynamically allocated so the uhid_device structure does not get
      too big.
      
      uhid_queue() adds a message to the buffer. If the buffer is full, the
      message is discarded. uhid_queue_event() is an helper for messages without
      payload.
      
      This also adds a public header: uhid.h. It contains the declarations for
      the user-space API. It is built around "struct uhid_event" which contains
      a type field which specifies the event type and each event can then add a
      variable-length payload. For now, there is only a dummy event but later
      patches will add new event types and payloads.
      Signed-off-by: NDavid Herrmann <dh.herrmann@googlemail.com>
      Signed-off-by: NJiri Kosina <jkosina@suse.cz>
      ace3d861