drivers/comedi/drivers/usbdux.c
Source file repositories/reference/linux-study-clean/drivers/comedi/drivers/usbdux.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/comedi/drivers/usbdux.c- Extension
.c- Size
- 43520 bytes
- Lines
- 1729
- 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 usbdux_privatefunction usbdux_unlink_urbsfunction usbdux_ai_stopfunction usbdux_ai_cancelfunction usbduxsub_ai_handle_urbfunction usbduxsub_ai_isoc_irqfunction usbdux_ao_stopfunction usbdux_ao_cancelfunction usbduxsub_ao_handle_urbfunction usbduxsub_ao_isoc_irqfunction usbdux_submit_urbsfunction usbdux_ai_cmdtestfunction create_adc_commandfunction send_dux_commandsfunction receive_dux_commandsfunction usbdux_ai_inttrigfunction usbdux_ai_cmdfunction usbdux_ai_insn_readfunction usbdux_ao_insn_readfunction usbdux_ao_insn_writefunction usbdux_ao_inttrigfunction usbdux_ao_cmdtestfunction usbdux_ao_cmdfunction usbdux_dio_insn_configfunction usbdux_dio_insn_bitsfunction usbdux_counter_readfunction usbdux_counter_writefunction usbdux_counter_configfunction usbduxsub_unlink_pwm_urbsfunction usbdux_pwm_stopfunction usbdux_pwm_cancelfunction usbduxsub_pwm_irqfunction usbduxsub_submit_pwm_urbsfunction usbdux_pwm_periodfunction usbdux_pwm_startfunction usbdux_pwm_patternfunction usbdux_pwm_writefunction usbdux_pwm_configfunction usbdux_firmware_uploadfunction usbdux_alloc_usb_buffersfunction usbdux_free_usb_buffersfunction usbdux_auto_attachfunction usbdux_detachfunction usbdux_usb_probe
Annotated Snippet
struct usbdux_private {
/* actual number of in-buffers */
int n_ai_urbs;
/* actual number of out-buffers */
int n_ao_urbs;
/* ISO-transfer handling: buffers */
struct urb **ai_urbs;
struct urb **ao_urbs;
/* pwm-transfer handling */
struct urb *pwm_urb;
/* PWM period */
unsigned int pwm_period;
/* PWM internal delay for the GPIF in the FX2 */
u8 pwm_delay;
/* size of the PWM buffer which holds the bit pattern */
int pwm_buf_sz;
/* input buffer for the ISO-transfer */
__le16 *in_buf;
/* input buffer for single insn */
__le16 *insn_buf;
unsigned int high_speed:1;
unsigned int ai_cmd_running:1;
unsigned int ao_cmd_running:1;
unsigned int pwm_cmd_running:1;
/* time between samples in units of the timer */
unsigned int ai_timer;
unsigned int ao_timer;
/* counter between aquisitions */
unsigned int ai_counter;
unsigned int ao_counter;
/* interval in frames/uframes */
unsigned int ai_interval;
/* commands */
u8 *dux_commands;
struct mutex mut;
};
static void usbdux_unlink_urbs(struct urb **urbs, int num_urbs)
{
int i;
for (i = 0; i < num_urbs; i++)
usb_kill_urb(urbs[i]);
}
static void usbdux_ai_stop(struct comedi_device *dev, int do_unlink)
{
struct usbdux_private *devpriv = dev->private;
if (do_unlink && devpriv->ai_urbs)
usbdux_unlink_urbs(devpriv->ai_urbs, devpriv->n_ai_urbs);
devpriv->ai_cmd_running = 0;
}
static int usbdux_ai_cancel(struct comedi_device *dev,
struct comedi_subdevice *s)
{
struct usbdux_private *devpriv = dev->private;
/* prevent other CPUs from submitting new commands just now */
mutex_lock(&devpriv->mut);
/* unlink only if the urb really has been submitted */
usbdux_ai_stop(dev, devpriv->ai_cmd_running);
mutex_unlock(&devpriv->mut);
return 0;
}
static void usbduxsub_ai_handle_urb(struct comedi_device *dev,
struct comedi_subdevice *s,
struct urb *urb)
{
struct usbdux_private *devpriv = dev->private;
struct comedi_async *async = s->async;
struct comedi_cmd *cmd = &async->cmd;
int ret;
int i;
devpriv->ai_counter--;
if (devpriv->ai_counter == 0) {
devpriv->ai_counter = devpriv->ai_timer;
/* get the data from the USB bus and hand it over to comedi */
for (i = 0; i < cmd->chanlist_len; i++) {
unsigned int range = CR_RANGE(cmd->chanlist[i]);
u16 val = le16_to_cpu(devpriv->in_buf[i]);
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 usbdux_private`, `function usbdux_unlink_urbs`, `function usbdux_ai_stop`, `function usbdux_ai_cancel`, `function usbduxsub_ai_handle_urb`, `function usbduxsub_ai_isoc_irq`, `function usbdux_ao_stop`, `function usbdux_ao_cancel`, `function usbduxsub_ao_handle_urb`, `function usbduxsub_ao_isoc_irq`.
- 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.