drivers/comedi/drivers/usbduxfast.c
Source file repositories/reference/linux-study-clean/drivers/comedi/drivers/usbduxfast.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/comedi/drivers/usbduxfast.c- Extension
.c- Size
- 24980 bytes
- Lines
- 1040
- Domain
- Driver Families
- Bucket
- drivers/comedi
- Inferred role
- Driver Families: implementation source
- Status
- source implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/kernel.hlinux/module.hlinux/slab.hlinux/input.hlinux/fcntl.hlinux/compiler.hlinux/comedi/comedi_usb.h
Detected Declarations
struct usbduxfast_privatefunction usbduxfast_send_cmdfunction usbduxfast_cmd_datafunction usbduxfast_ai_stopfunction usbduxfast_ai_cancelfunction usbduxfast_ai_handle_urbfunction usbduxfast_ai_interruptfunction usbduxfast_submit_urbfunction usbduxfast_ai_check_chanlistfunction usbduxfast_ai_cmdtestfunction usbduxfast_ai_inttrigfunction usbduxfast_ai_cmdfunction usbduxfast_ai_insn_readfunction usbduxfast_upload_firmwarefunction usbduxfast_auto_attachfunction usbduxfast_detachfunction usbduxfast_usb_probe
Annotated Snippet
struct usbduxfast_private {
struct urb *urb; /* BULK-transfer handling: urb */
u8 *duxbuf;
s8 *inbuf;
short int ai_cmd_running; /* asynchronous command is running */
int ignore; /* counter which ignores the first buffers */
struct mutex mut;
};
/*
* bulk transfers to usbduxfast
*/
#define SENDADCOMMANDS 0
#define SENDINITEP6 1
static int usbduxfast_send_cmd(struct comedi_device *dev, int cmd_type)
{
struct usb_device *usb = comedi_to_usb_dev(dev);
struct usbduxfast_private *devpriv = dev->private;
int nsent;
int ret;
devpriv->duxbuf[0] = cmd_type;
ret = usb_bulk_msg(usb, usb_sndbulkpipe(usb, CHANNELLISTEP),
devpriv->duxbuf, SIZEOFDUXBUF,
&nsent, 10000);
if (ret < 0)
dev_err(dev->class_dev,
"could not transmit command to the usb-device, err=%d\n",
ret);
return ret;
}
static void usbduxfast_cmd_data(struct comedi_device *dev, int index,
u8 len, u8 op, u8 out, u8 log)
{
struct usbduxfast_private *devpriv = dev->private;
/* Set the GPIF bytes, the first byte is the command byte */
devpriv->duxbuf[1 + 0x00 + index] = len;
devpriv->duxbuf[1 + 0x08 + index] = op;
devpriv->duxbuf[1 + 0x10 + index] = out;
devpriv->duxbuf[1 + 0x18 + index] = log;
}
static int usbduxfast_ai_stop(struct comedi_device *dev, int do_unlink)
{
struct usbduxfast_private *devpriv = dev->private;
/* stop aquistion */
devpriv->ai_cmd_running = 0;
if (do_unlink && devpriv->urb) {
/* kill the running transfer */
usb_kill_urb(devpriv->urb);
}
return 0;
}
static int usbduxfast_ai_cancel(struct comedi_device *dev,
struct comedi_subdevice *s)
{
struct usbduxfast_private *devpriv = dev->private;
int ret;
mutex_lock(&devpriv->mut);
ret = usbduxfast_ai_stop(dev, 1);
mutex_unlock(&devpriv->mut);
return ret;
}
static void usbduxfast_ai_handle_urb(struct comedi_device *dev,
struct comedi_subdevice *s,
struct urb *urb)
{
struct usbduxfast_private *devpriv = dev->private;
struct comedi_async *async = s->async;
struct comedi_cmd *cmd = &async->cmd;
int ret;
if (devpriv->ignore) {
devpriv->ignore--;
} else {
unsigned int nsamples;
nsamples = comedi_bytes_to_samples(s, urb->actual_length);
nsamples = comedi_nsamples_left(s, nsamples);
Annotation
- Immediate include surface: `linux/kernel.h`, `linux/module.h`, `linux/slab.h`, `linux/input.h`, `linux/fcntl.h`, `linux/compiler.h`, `linux/comedi/comedi_usb.h`.
- Detected declarations: `struct usbduxfast_private`, `function usbduxfast_send_cmd`, `function usbduxfast_cmd_data`, `function usbduxfast_ai_stop`, `function usbduxfast_ai_cancel`, `function usbduxfast_ai_handle_urb`, `function usbduxfast_ai_interrupt`, `function usbduxfast_submit_urb`, `function usbduxfast_ai_check_chanlist`, `function usbduxfast_ai_cmdtest`.
- Atlas domain: Driver Families / drivers/comedi.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.