drivers/comedi/drivers/ni_at_ao.c
Source file repositories/reference/linux-study-clean/drivers/comedi/drivers/ni_at_ao.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/comedi/drivers/ni_at_ao.c- Extension
.c- Size
- 10415 bytes
- Lines
- 374
- 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.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/module.hlinux/comedi/comedidev.hlinux/comedi/comedi_8254.h
Detected Declarations
struct atao_boardstruct atao_privatefunction atao_select_reg_groupfunction atao_ao_insn_writefunction atao_dio_insn_bitsfunction atao_dio_insn_configfunction atao_calib_insn_writefunction atao_resetfunction atao_attach
Annotated Snippet
struct atao_board {
const char *name;
int n_ao_chans;
};
static const struct atao_board atao_boards[] = {
{
.name = "at-ao-6",
.n_ao_chans = 6,
}, {
.name = "at-ao-10",
.n_ao_chans = 10,
},
};
struct atao_private {
unsigned short cfg1;
unsigned short cfg3;
/* Used for caldac readback */
unsigned char caldac[21];
};
static void atao_select_reg_group(struct comedi_device *dev, int group)
{
struct atao_private *devpriv = dev->private;
if (group)
devpriv->cfg1 |= ATAO_CFG1_GRP2WR;
else
devpriv->cfg1 &= ~ATAO_CFG1_GRP2WR;
outw(devpriv->cfg1, dev->iobase + ATAO_CFG1_REG);
}
static int atao_ao_insn_write(struct comedi_device *dev,
struct comedi_subdevice *s,
struct comedi_insn *insn,
unsigned int *data)
{
unsigned int chan = CR_CHAN(insn->chanspec);
unsigned int val = s->readback[chan];
int i;
if (chan == 0)
atao_select_reg_group(dev, 1);
for (i = 0; i < insn->n; i++) {
val = data[i];
/* the hardware expects two's complement values */
outw(comedi_offset_munge(s, val),
dev->iobase + ATAO_AO_REG(chan));
}
s->readback[chan] = val;
if (chan == 0)
atao_select_reg_group(dev, 0);
return insn->n;
}
static int atao_dio_insn_bits(struct comedi_device *dev,
struct comedi_subdevice *s,
struct comedi_insn *insn,
unsigned int *data)
{
if (comedi_dio_update_state(s, data))
outw(s->state, dev->iobase + ATAO_DIO_REG);
data[1] = inw(dev->iobase + ATAO_DIO_REG);
return insn->n;
}
static int atao_dio_insn_config(struct comedi_device *dev,
struct comedi_subdevice *s,
struct comedi_insn *insn,
unsigned int *data)
{
struct atao_private *devpriv = dev->private;
unsigned int chan = CR_CHAN(insn->chanspec);
unsigned int mask;
int ret;
if (chan < 4)
mask = 0x0f;
else
mask = 0xf0;
ret = comedi_dio_insn_config(dev, s, insn, data, mask);
Annotation
- Immediate include surface: `linux/module.h`, `linux/comedi/comedidev.h`, `linux/comedi/comedi_8254.h`.
- Detected declarations: `struct atao_board`, `struct atao_private`, `function atao_select_reg_group`, `function atao_ao_insn_write`, `function atao_dio_insn_bits`, `function atao_dio_insn_config`, `function atao_calib_insn_write`, `function atao_reset`, `function atao_attach`.
- Atlas domain: Driver Families / drivers/comedi.
- Implementation status: source implementation candidate.
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.