PageRenderTime 93ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 2ms

/drivers/staging/comedi/drivers/ni_mio_common.c

https://bitbucket.org/cyanogenmod/android_kernel_asus_tf300t
C | 6005 lines | 4968 code | 604 blank | 433 comment | 869 complexity | c44039260f42b06fffd172846b247bbb MD5 | raw file
Possible License(s): LGPL-2.0, AGPL-1.0, GPL-2.0
  1. /*
  2. comedi/drivers/ni_mio_common.c
  3. Hardware driver for DAQ-STC based boards
  4. COMEDI - Linux Control and Measurement Device Interface
  5. Copyright (C) 1997-2001 David A. Schleef <ds@schleef.org>
  6. Copyright (C) 2002-2006 Frank Mori Hess <fmhess@users.sourceforge.net>
  7. This program is free software; you can redistribute it and/or modify
  8. it under the terms of the GNU General Public License as published by
  9. the Free Software Foundation; either version 2 of the License, or
  10. (at your option) any later version.
  11. This program is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. GNU General Public License for more details.
  15. You should have received a copy of the GNU General Public License
  16. along with this program; if not, write to the Free Software
  17. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18. */
  19. /*
  20. This file is meant to be included by another file, e.g.,
  21. ni_atmio.c or ni_pcimio.c.
  22. Interrupt support originally added by Truxton Fulton
  23. <trux@truxton.com>
  24. References (from ftp://ftp.natinst.com/support/manuals):
  25. 340747b.pdf AT-MIO E series Register Level Programmer Manual
  26. 341079b.pdf PCI E Series RLPM
  27. 340934b.pdf DAQ-STC reference manual
  28. 67xx and 611x registers (from ftp://ftp.ni.com/support/daq/mhddk/documentation/)
  29. release_ni611x.pdf
  30. release_ni67xx.pdf
  31. Other possibly relevant info:
  32. 320517c.pdf User manual (obsolete)
  33. 320517f.pdf User manual (new)
  34. 320889a.pdf delete
  35. 320906c.pdf maximum signal ratings
  36. 321066a.pdf about 16x
  37. 321791a.pdf discontinuation of at-mio-16e-10 rev. c
  38. 321808a.pdf about at-mio-16e-10 rev P
  39. 321837a.pdf discontinuation of at-mio-16de-10 rev d
  40. 321838a.pdf about at-mio-16de-10 rev N
  41. ISSUES:
  42. - the interrupt routine needs to be cleaned up
  43. 2006-02-07: S-Series PCI-6143: Support has been added but is not
  44. fully tested as yet. Terry Barnaby, BEAM Ltd.
  45. */
  46. /* #define DEBUG_INTERRUPT */
  47. /* #define DEBUG_STATUS_A */
  48. /* #define DEBUG_STATUS_B */
  49. #include <linux/interrupt.h>
  50. #include <linux/sched.h>
  51. #include "8255.h"
  52. #include "mite.h"
  53. #include "comedi_fc.h"
  54. #ifndef MDPRINTK
  55. #define MDPRINTK(format, args...)
  56. #endif
  57. /* A timeout count */
  58. #define NI_TIMEOUT 1000
  59. static const unsigned old_RTSI_clock_channel = 7;
  60. /* Note: this table must match the ai_gain_* definitions */
  61. static const short ni_gainlkup[][16] = {
  62. [ai_gain_16] = {0, 1, 2, 3, 4, 5, 6, 7,
  63. 0x100, 0x101, 0x102, 0x103, 0x104, 0x105, 0x106, 0x107},
  64. [ai_gain_8] = {1, 2, 4, 7, 0x101, 0x102, 0x104, 0x107},
  65. [ai_gain_14] = {1, 2, 3, 4, 5, 6, 7,
  66. 0x101, 0x102, 0x103, 0x104, 0x105, 0x106, 0x107},
  67. [ai_gain_4] = {0, 1, 4, 7},
  68. [ai_gain_611x] = {0x00a, 0x00b, 0x001, 0x002,
  69. 0x003, 0x004, 0x005, 0x006},
  70. [ai_gain_622x] = {0, 1, 4, 5},
  71. [ai_gain_628x] = {1, 2, 3, 4, 5, 6, 7},
  72. [ai_gain_6143] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
  73. };
  74. static const struct comedi_lrange range_ni_E_ai = { 16, {
  75. RANGE(-10, 10),
  76. RANGE(-5, 5),
  77. RANGE(-2.5, 2.5),
  78. RANGE(-1, 1),
  79. RANGE(-0.5, 0.5),
  80. RANGE(-0.25, 0.25),
  81. RANGE(-0.1, 0.1),
  82. RANGE(-0.05, 0.05),
  83. RANGE(0, 20),
  84. RANGE(0, 10),
  85. RANGE(0, 5),
  86. RANGE(0, 2),
  87. RANGE(0, 1),
  88. RANGE(0, 0.5),
  89. RANGE(0, 0.2),
  90. RANGE(0, 0.1),
  91. }
  92. };
  93. static const struct comedi_lrange range_ni_E_ai_limited = { 8, {
  94. RANGE(-10, 10),
  95. RANGE(-5, 5),
  96. RANGE(-1, 1),
  97. RANGE(-0.1,
  98. 0.1),
  99. RANGE(0, 10),
  100. RANGE(0, 5),
  101. RANGE(0, 1),
  102. RANGE(0, 0.1),
  103. }
  104. };
  105. static const struct comedi_lrange range_ni_E_ai_limited14 = { 14, {
  106. RANGE(-10,
  107. 10),
  108. RANGE(-5, 5),
  109. RANGE(-2, 2),
  110. RANGE(-1, 1),
  111. RANGE(-0.5,
  112. 0.5),
  113. RANGE(-0.2,
  114. 0.2),
  115. RANGE(-0.1,
  116. 0.1),
  117. RANGE(0, 10),
  118. RANGE(0, 5),
  119. RANGE(0, 2),
  120. RANGE(0, 1),
  121. RANGE(0,
  122. 0.5),
  123. RANGE(0,
  124. 0.2),
  125. RANGE(0,
  126. 0.1),
  127. }
  128. };
  129. static const struct comedi_lrange range_ni_E_ai_bipolar4 = { 4, {
  130. RANGE(-10, 10),
  131. RANGE(-5, 5),
  132. RANGE(-0.5,
  133. 0.5),
  134. RANGE(-0.05,
  135. 0.05),
  136. }
  137. };
  138. static const struct comedi_lrange range_ni_E_ai_611x = { 8, {
  139. RANGE(-50, 50),
  140. RANGE(-20, 20),
  141. RANGE(-10, 10),
  142. RANGE(-5, 5),
  143. RANGE(-2, 2),
  144. RANGE(-1, 1),
  145. RANGE(-0.5, 0.5),
  146. RANGE(-0.2, 0.2),
  147. }
  148. };
  149. static const struct comedi_lrange range_ni_M_ai_622x = { 4, {
  150. RANGE(-10, 10),
  151. RANGE(-5, 5),
  152. RANGE(-1, 1),
  153. RANGE(-0.2, 0.2),
  154. }
  155. };
  156. static const struct comedi_lrange range_ni_M_ai_628x = { 7, {
  157. RANGE(-10, 10),
  158. RANGE(-5, 5),
  159. RANGE(-2, 2),
  160. RANGE(-1, 1),
  161. RANGE(-0.5, 0.5),
  162. RANGE(-0.2, 0.2),
  163. RANGE(-0.1, 0.1),
  164. }
  165. };
  166. static const struct comedi_lrange range_ni_S_ai_6143 = { 1, {
  167. RANGE(-5, +5),
  168. }
  169. };
  170. static const struct comedi_lrange range_ni_E_ao_ext = { 4, {
  171. RANGE(-10, 10),
  172. RANGE(0, 10),
  173. RANGE_ext(-1, 1),
  174. RANGE_ext(0, 1),
  175. }
  176. };
  177. static const struct comedi_lrange *const ni_range_lkup[] = {
  178. [ai_gain_16] = &range_ni_E_ai,
  179. [ai_gain_8] = &range_ni_E_ai_limited,
  180. [ai_gain_14] = &range_ni_E_ai_limited14,
  181. [ai_gain_4] = &range_ni_E_ai_bipolar4,
  182. [ai_gain_611x] = &range_ni_E_ai_611x,
  183. [ai_gain_622x] = &range_ni_M_ai_622x,
  184. [ai_gain_628x] = &range_ni_M_ai_628x,
  185. [ai_gain_6143] = &range_ni_S_ai_6143
  186. };
  187. static int ni_dio_insn_config(struct comedi_device *dev,
  188. struct comedi_subdevice *s,
  189. struct comedi_insn *insn, unsigned int *data);
  190. static int ni_dio_insn_bits(struct comedi_device *dev,
  191. struct comedi_subdevice *s,
  192. struct comedi_insn *insn, unsigned int *data);
  193. static int ni_cdio_cmdtest(struct comedi_device *dev,
  194. struct comedi_subdevice *s, struct comedi_cmd *cmd);
  195. static int ni_cdio_cmd(struct comedi_device *dev, struct comedi_subdevice *s);
  196. static int ni_cdio_cancel(struct comedi_device *dev,
  197. struct comedi_subdevice *s);
  198. static void handle_cdio_interrupt(struct comedi_device *dev);
  199. static int ni_cdo_inttrig(struct comedi_device *dev, struct comedi_subdevice *s,
  200. unsigned int trignum);
  201. static int ni_serial_insn_config(struct comedi_device *dev,
  202. struct comedi_subdevice *s,
  203. struct comedi_insn *insn, unsigned int *data);
  204. static int ni_serial_hw_readwrite8(struct comedi_device *dev,
  205. struct comedi_subdevice *s,
  206. unsigned char data_out,
  207. unsigned char *data_in);
  208. static int ni_serial_sw_readwrite8(struct comedi_device *dev,
  209. struct comedi_subdevice *s,
  210. unsigned char data_out,
  211. unsigned char *data_in);
  212. static int ni_calib_insn_read(struct comedi_device *dev,
  213. struct comedi_subdevice *s,
  214. struct comedi_insn *insn, unsigned int *data);
  215. static int ni_calib_insn_write(struct comedi_device *dev,
  216. struct comedi_subdevice *s,
  217. struct comedi_insn *insn, unsigned int *data);
  218. static int ni_eeprom_insn_read(struct comedi_device *dev,
  219. struct comedi_subdevice *s,
  220. struct comedi_insn *insn, unsigned int *data);
  221. static int ni_m_series_eeprom_insn_read(struct comedi_device *dev,
  222. struct comedi_subdevice *s,
  223. struct comedi_insn *insn,
  224. unsigned int *data);
  225. static int ni_pfi_insn_bits(struct comedi_device *dev,
  226. struct comedi_subdevice *s,
  227. struct comedi_insn *insn, unsigned int *data);
  228. static int ni_pfi_insn_config(struct comedi_device *dev,
  229. struct comedi_subdevice *s,
  230. struct comedi_insn *insn, unsigned int *data);
  231. static unsigned ni_old_get_pfi_routing(struct comedi_device *dev,
  232. unsigned chan);
  233. static void ni_rtsi_init(struct comedi_device *dev);
  234. static int ni_rtsi_insn_bits(struct comedi_device *dev,
  235. struct comedi_subdevice *s,
  236. struct comedi_insn *insn, unsigned int *data);
  237. static int ni_rtsi_insn_config(struct comedi_device *dev,
  238. struct comedi_subdevice *s,
  239. struct comedi_insn *insn, unsigned int *data);
  240. static void caldac_setup(struct comedi_device *dev, struct comedi_subdevice *s);
  241. static int ni_read_eeprom(struct comedi_device *dev, int addr);
  242. #ifdef DEBUG_STATUS_A
  243. static void ni_mio_print_status_a(int status);
  244. #else
  245. #define ni_mio_print_status_a(a)
  246. #endif
  247. #ifdef DEBUG_STATUS_B
  248. static void ni_mio_print_status_b(int status);
  249. #else
  250. #define ni_mio_print_status_b(a)
  251. #endif
  252. static int ni_ai_reset(struct comedi_device *dev, struct comedi_subdevice *s);
  253. #ifndef PCIDMA
  254. static void ni_handle_fifo_half_full(struct comedi_device *dev);
  255. static int ni_ao_fifo_half_empty(struct comedi_device *dev,
  256. struct comedi_subdevice *s);
  257. #endif
  258. static void ni_handle_fifo_dregs(struct comedi_device *dev);
  259. static int ni_ai_inttrig(struct comedi_device *dev, struct comedi_subdevice *s,
  260. unsigned int trignum);
  261. static void ni_load_channelgain_list(struct comedi_device *dev,
  262. unsigned int n_chan, unsigned int *list);
  263. static void shutdown_ai_command(struct comedi_device *dev);
  264. static int ni_ao_inttrig(struct comedi_device *dev, struct comedi_subdevice *s,
  265. unsigned int trignum);
  266. static int ni_ao_reset(struct comedi_device *dev, struct comedi_subdevice *s);
  267. static int ni_8255_callback(int dir, int port, int data, unsigned long arg);
  268. static int ni_gpct_insn_write(struct comedi_device *dev,
  269. struct comedi_subdevice *s,
  270. struct comedi_insn *insn, unsigned int *data);
  271. static int ni_gpct_insn_read(struct comedi_device *dev,
  272. struct comedi_subdevice *s,
  273. struct comedi_insn *insn, unsigned int *data);
  274. static int ni_gpct_insn_config(struct comedi_device *dev,
  275. struct comedi_subdevice *s,
  276. struct comedi_insn *insn, unsigned int *data);
  277. static int ni_gpct_cmd(struct comedi_device *dev, struct comedi_subdevice *s);
  278. static int ni_gpct_cmdtest(struct comedi_device *dev,
  279. struct comedi_subdevice *s, struct comedi_cmd *cmd);
  280. static int ni_gpct_cancel(struct comedi_device *dev,
  281. struct comedi_subdevice *s);
  282. static void handle_gpct_interrupt(struct comedi_device *dev,
  283. unsigned short counter_index);
  284. static int init_cs5529(struct comedi_device *dev);
  285. static int cs5529_do_conversion(struct comedi_device *dev,
  286. unsigned short *data);
  287. static int cs5529_ai_insn_read(struct comedi_device *dev,
  288. struct comedi_subdevice *s,
  289. struct comedi_insn *insn, unsigned int *data);
  290. #ifdef NI_CS5529_DEBUG
  291. static unsigned int cs5529_config_read(struct comedi_device *dev,
  292. unsigned int reg_select_bits);
  293. #endif
  294. static void cs5529_config_write(struct comedi_device *dev, unsigned int value,
  295. unsigned int reg_select_bits);
  296. static int ni_m_series_pwm_config(struct comedi_device *dev,
  297. struct comedi_subdevice *s,
  298. struct comedi_insn *insn, unsigned int *data);
  299. static int ni_6143_pwm_config(struct comedi_device *dev,
  300. struct comedi_subdevice *s,
  301. struct comedi_insn *insn, unsigned int *data);
  302. static int ni_set_master_clock(struct comedi_device *dev, unsigned source,
  303. unsigned period_ns);
  304. static void ack_a_interrupt(struct comedi_device *dev, unsigned short a_status);
  305. static void ack_b_interrupt(struct comedi_device *dev, unsigned short b_status);
  306. enum aimodes {
  307. AIMODE_NONE = 0,
  308. AIMODE_HALF_FULL = 1,
  309. AIMODE_SCAN = 2,
  310. AIMODE_SAMPLE = 3,
  311. };
  312. enum ni_common_subdevices {
  313. NI_AI_SUBDEV,
  314. NI_AO_SUBDEV,
  315. NI_DIO_SUBDEV,
  316. NI_8255_DIO_SUBDEV,
  317. NI_UNUSED_SUBDEV,
  318. NI_CALIBRATION_SUBDEV,
  319. NI_EEPROM_SUBDEV,
  320. NI_PFI_DIO_SUBDEV,
  321. NI_CS5529_CALIBRATION_SUBDEV,
  322. NI_SERIAL_SUBDEV,
  323. NI_RTSI_SUBDEV,
  324. NI_GPCT0_SUBDEV,
  325. NI_GPCT1_SUBDEV,
  326. NI_FREQ_OUT_SUBDEV,
  327. NI_NUM_SUBDEVICES
  328. };
  329. static inline unsigned NI_GPCT_SUBDEV(unsigned counter_index)
  330. {
  331. switch (counter_index) {
  332. case 0:
  333. return NI_GPCT0_SUBDEV;
  334. break;
  335. case 1:
  336. return NI_GPCT1_SUBDEV;
  337. break;
  338. default:
  339. break;
  340. }
  341. BUG();
  342. return NI_GPCT0_SUBDEV;
  343. }
  344. enum timebase_nanoseconds {
  345. TIMEBASE_1_NS = 50,
  346. TIMEBASE_2_NS = 10000
  347. };
  348. #define SERIAL_DISABLED 0
  349. #define SERIAL_600NS 600
  350. #define SERIAL_1_2US 1200
  351. #define SERIAL_10US 10000
  352. static const int num_adc_stages_611x = 3;
  353. static void handle_a_interrupt(struct comedi_device *dev, unsigned short status,
  354. unsigned ai_mite_status);
  355. static void handle_b_interrupt(struct comedi_device *dev, unsigned short status,
  356. unsigned ao_mite_status);
  357. static void get_last_sample_611x(struct comedi_device *dev);
  358. static void get_last_sample_6143(struct comedi_device *dev);
  359. static inline void ni_set_bitfield(struct comedi_device *dev, int reg,
  360. unsigned bit_mask, unsigned bit_values)
  361. {
  362. unsigned long flags;
  363. spin_lock_irqsave(&devpriv->soft_reg_copy_lock, flags);
  364. switch (reg) {
  365. case Interrupt_A_Enable_Register:
  366. devpriv->int_a_enable_reg &= ~bit_mask;
  367. devpriv->int_a_enable_reg |= bit_values & bit_mask;
  368. devpriv->stc_writew(dev, devpriv->int_a_enable_reg,
  369. Interrupt_A_Enable_Register);
  370. break;
  371. case Interrupt_B_Enable_Register:
  372. devpriv->int_b_enable_reg &= ~bit_mask;
  373. devpriv->int_b_enable_reg |= bit_values & bit_mask;
  374. devpriv->stc_writew(dev, devpriv->int_b_enable_reg,
  375. Interrupt_B_Enable_Register);
  376. break;
  377. case IO_Bidirection_Pin_Register:
  378. devpriv->io_bidirection_pin_reg &= ~bit_mask;
  379. devpriv->io_bidirection_pin_reg |= bit_values & bit_mask;
  380. devpriv->stc_writew(dev, devpriv->io_bidirection_pin_reg,
  381. IO_Bidirection_Pin_Register);
  382. break;
  383. case AI_AO_Select:
  384. devpriv->ai_ao_select_reg &= ~bit_mask;
  385. devpriv->ai_ao_select_reg |= bit_values & bit_mask;
  386. ni_writeb(devpriv->ai_ao_select_reg, AI_AO_Select);
  387. break;
  388. case G0_G1_Select:
  389. devpriv->g0_g1_select_reg &= ~bit_mask;
  390. devpriv->g0_g1_select_reg |= bit_values & bit_mask;
  391. ni_writeb(devpriv->g0_g1_select_reg, G0_G1_Select);
  392. break;
  393. default:
  394. printk("Warning %s() called with invalid register\n", __func__);
  395. printk("reg is %d\n", reg);
  396. break;
  397. }
  398. mmiowb();
  399. spin_unlock_irqrestore(&devpriv->soft_reg_copy_lock, flags);
  400. }
  401. #ifdef PCIDMA
  402. static int ni_ai_drain_dma(struct comedi_device *dev);
  403. /* DMA channel setup */
  404. /* negative channel means no channel */
  405. static inline void ni_set_ai_dma_channel(struct comedi_device *dev, int channel)
  406. {
  407. unsigned bitfield;
  408. if (channel >= 0) {
  409. bitfield =
  410. (ni_stc_dma_channel_select_bitfield(channel) <<
  411. AI_DMA_Select_Shift) & AI_DMA_Select_Mask;
  412. } else {
  413. bitfield = 0;
  414. }
  415. ni_set_bitfield(dev, AI_AO_Select, AI_DMA_Select_Mask, bitfield);
  416. }
  417. /* negative channel means no channel */
  418. static inline void ni_set_ao_dma_channel(struct comedi_device *dev, int channel)
  419. {
  420. unsigned bitfield;
  421. if (channel >= 0) {
  422. bitfield =
  423. (ni_stc_dma_channel_select_bitfield(channel) <<
  424. AO_DMA_Select_Shift) & AO_DMA_Select_Mask;
  425. } else {
  426. bitfield = 0;
  427. }
  428. ni_set_bitfield(dev, AI_AO_Select, AO_DMA_Select_Mask, bitfield);
  429. }
  430. /* negative mite_channel means no channel */
  431. static inline void ni_set_gpct_dma_channel(struct comedi_device *dev,
  432. unsigned gpct_index,
  433. int mite_channel)
  434. {
  435. unsigned bitfield;
  436. if (mite_channel >= 0) {
  437. bitfield = GPCT_DMA_Select_Bits(gpct_index, mite_channel);
  438. } else {
  439. bitfield = 0;
  440. }
  441. ni_set_bitfield(dev, G0_G1_Select, GPCT_DMA_Select_Mask(gpct_index),
  442. bitfield);
  443. }
  444. /* negative mite_channel means no channel */
  445. static inline void ni_set_cdo_dma_channel(struct comedi_device *dev,
  446. int mite_channel)
  447. {
  448. unsigned long flags;
  449. spin_lock_irqsave(&devpriv->soft_reg_copy_lock, flags);
  450. devpriv->cdio_dma_select_reg &= ~CDO_DMA_Select_Mask;
  451. if (mite_channel >= 0) {
  452. /*XXX just guessing ni_stc_dma_channel_select_bitfield() returns the right bits,
  453. under the assumption the cdio dma selection works just like ai/ao/gpct.
  454. Definitely works for dma channels 0 and 1. */
  455. devpriv->cdio_dma_select_reg |=
  456. (ni_stc_dma_channel_select_bitfield(mite_channel) <<
  457. CDO_DMA_Select_Shift) & CDO_DMA_Select_Mask;
  458. }
  459. ni_writeb(devpriv->cdio_dma_select_reg, M_Offset_CDIO_DMA_Select);
  460. mmiowb();
  461. spin_unlock_irqrestore(&devpriv->soft_reg_copy_lock, flags);
  462. }
  463. static int ni_request_ai_mite_channel(struct comedi_device *dev)
  464. {
  465. unsigned long flags;
  466. spin_lock_irqsave(&devpriv->mite_channel_lock, flags);
  467. BUG_ON(devpriv->ai_mite_chan);
  468. devpriv->ai_mite_chan =
  469. mite_request_channel(devpriv->mite, devpriv->ai_mite_ring);
  470. if (devpriv->ai_mite_chan == NULL) {
  471. spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
  472. comedi_error(dev,
  473. "failed to reserve mite dma channel for analog input.");
  474. return -EBUSY;
  475. }
  476. devpriv->ai_mite_chan->dir = COMEDI_INPUT;
  477. ni_set_ai_dma_channel(dev, devpriv->ai_mite_chan->channel);
  478. spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
  479. return 0;
  480. }
  481. static int ni_request_ao_mite_channel(struct comedi_device *dev)
  482. {
  483. unsigned long flags;
  484. spin_lock_irqsave(&devpriv->mite_channel_lock, flags);
  485. BUG_ON(devpriv->ao_mite_chan);
  486. devpriv->ao_mite_chan =
  487. mite_request_channel(devpriv->mite, devpriv->ao_mite_ring);
  488. if (devpriv->ao_mite_chan == NULL) {
  489. spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
  490. comedi_error(dev,
  491. "failed to reserve mite dma channel for analog outut.");
  492. return -EBUSY;
  493. }
  494. devpriv->ao_mite_chan->dir = COMEDI_OUTPUT;
  495. ni_set_ao_dma_channel(dev, devpriv->ao_mite_chan->channel);
  496. spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
  497. return 0;
  498. }
  499. static int ni_request_gpct_mite_channel(struct comedi_device *dev,
  500. unsigned gpct_index,
  501. enum comedi_io_direction direction)
  502. {
  503. unsigned long flags;
  504. struct mite_channel *mite_chan;
  505. BUG_ON(gpct_index >= NUM_GPCT);
  506. spin_lock_irqsave(&devpriv->mite_channel_lock, flags);
  507. BUG_ON(devpriv->counter_dev->counters[gpct_index].mite_chan);
  508. mite_chan =
  509. mite_request_channel(devpriv->mite,
  510. devpriv->gpct_mite_ring[gpct_index]);
  511. if (mite_chan == NULL) {
  512. spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
  513. comedi_error(dev,
  514. "failed to reserve mite dma channel for counter.");
  515. return -EBUSY;
  516. }
  517. mite_chan->dir = direction;
  518. ni_tio_set_mite_channel(&devpriv->counter_dev->counters[gpct_index],
  519. mite_chan);
  520. ni_set_gpct_dma_channel(dev, gpct_index, mite_chan->channel);
  521. spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
  522. return 0;
  523. }
  524. #endif /* PCIDMA */
  525. static int ni_request_cdo_mite_channel(struct comedi_device *dev)
  526. {
  527. #ifdef PCIDMA
  528. unsigned long flags;
  529. spin_lock_irqsave(&devpriv->mite_channel_lock, flags);
  530. BUG_ON(devpriv->cdo_mite_chan);
  531. devpriv->cdo_mite_chan =
  532. mite_request_channel(devpriv->mite, devpriv->cdo_mite_ring);
  533. if (devpriv->cdo_mite_chan == NULL) {
  534. spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
  535. comedi_error(dev,
  536. "failed to reserve mite dma channel for correlated digital outut.");
  537. return -EBUSY;
  538. }
  539. devpriv->cdo_mite_chan->dir = COMEDI_OUTPUT;
  540. ni_set_cdo_dma_channel(dev, devpriv->cdo_mite_chan->channel);
  541. spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
  542. #endif /* PCIDMA */
  543. return 0;
  544. }
  545. static void ni_release_ai_mite_channel(struct comedi_device *dev)
  546. {
  547. #ifdef PCIDMA
  548. unsigned long flags;
  549. spin_lock_irqsave(&devpriv->mite_channel_lock, flags);
  550. if (devpriv->ai_mite_chan) {
  551. ni_set_ai_dma_channel(dev, -1);
  552. mite_release_channel(devpriv->ai_mite_chan);
  553. devpriv->ai_mite_chan = NULL;
  554. }
  555. spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
  556. #endif /* PCIDMA */
  557. }
  558. static void ni_release_ao_mite_channel(struct comedi_device *dev)
  559. {
  560. #ifdef PCIDMA
  561. unsigned long flags;
  562. spin_lock_irqsave(&devpriv->mite_channel_lock, flags);
  563. if (devpriv->ao_mite_chan) {
  564. ni_set_ao_dma_channel(dev, -1);
  565. mite_release_channel(devpriv->ao_mite_chan);
  566. devpriv->ao_mite_chan = NULL;
  567. }
  568. spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
  569. #endif /* PCIDMA */
  570. }
  571. void ni_release_gpct_mite_channel(struct comedi_device *dev,
  572. unsigned gpct_index)
  573. {
  574. #ifdef PCIDMA
  575. unsigned long flags;
  576. BUG_ON(gpct_index >= NUM_GPCT);
  577. spin_lock_irqsave(&devpriv->mite_channel_lock, flags);
  578. if (devpriv->counter_dev->counters[gpct_index].mite_chan) {
  579. struct mite_channel *mite_chan =
  580. devpriv->counter_dev->counters[gpct_index].mite_chan;
  581. ni_set_gpct_dma_channel(dev, gpct_index, -1);
  582. ni_tio_set_mite_channel(&devpriv->
  583. counter_dev->counters[gpct_index],
  584. NULL);
  585. mite_release_channel(mite_chan);
  586. }
  587. spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
  588. #endif /* PCIDMA */
  589. }
  590. static void ni_release_cdo_mite_channel(struct comedi_device *dev)
  591. {
  592. #ifdef PCIDMA
  593. unsigned long flags;
  594. spin_lock_irqsave(&devpriv->mite_channel_lock, flags);
  595. if (devpriv->cdo_mite_chan) {
  596. ni_set_cdo_dma_channel(dev, -1);
  597. mite_release_channel(devpriv->cdo_mite_chan);
  598. devpriv->cdo_mite_chan = NULL;
  599. }
  600. spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
  601. #endif /* PCIDMA */
  602. }
  603. /* e-series boards use the second irq signals to generate dma requests for their counters */
  604. #ifdef PCIDMA
  605. static void ni_e_series_enable_second_irq(struct comedi_device *dev,
  606. unsigned gpct_index, short enable)
  607. {
  608. if (boardtype.reg_type & ni_reg_m_series_mask)
  609. return;
  610. switch (gpct_index) {
  611. case 0:
  612. if (enable) {
  613. devpriv->stc_writew(dev, G0_Gate_Second_Irq_Enable,
  614. Second_IRQ_A_Enable_Register);
  615. } else {
  616. devpriv->stc_writew(dev, 0,
  617. Second_IRQ_A_Enable_Register);
  618. }
  619. break;
  620. case 1:
  621. if (enable) {
  622. devpriv->stc_writew(dev, G1_Gate_Second_Irq_Enable,
  623. Second_IRQ_B_Enable_Register);
  624. } else {
  625. devpriv->stc_writew(dev, 0,
  626. Second_IRQ_B_Enable_Register);
  627. }
  628. break;
  629. default:
  630. BUG();
  631. break;
  632. }
  633. }
  634. #endif /* PCIDMA */
  635. static void ni_clear_ai_fifo(struct comedi_device *dev)
  636. {
  637. if (boardtype.reg_type == ni_reg_6143) {
  638. /* Flush the 6143 data FIFO */
  639. ni_writel(0x10, AIFIFO_Control_6143); /* Flush fifo */
  640. ni_writel(0x00, AIFIFO_Control_6143); /* Flush fifo */
  641. while (ni_readl(AIFIFO_Status_6143) & 0x10) ; /* Wait for complete */
  642. } else {
  643. devpriv->stc_writew(dev, 1, ADC_FIFO_Clear);
  644. if (boardtype.reg_type == ni_reg_625x) {
  645. ni_writeb(0, M_Offset_Static_AI_Control(0));
  646. ni_writeb(1, M_Offset_Static_AI_Control(0));
  647. #if 0
  648. /* the NI example code does 3 convert pulses for 625x boards,
  649. but that appears to be wrong in practice. */
  650. devpriv->stc_writew(dev, AI_CONVERT_Pulse,
  651. AI_Command_1_Register);
  652. devpriv->stc_writew(dev, AI_CONVERT_Pulse,
  653. AI_Command_1_Register);
  654. devpriv->stc_writew(dev, AI_CONVERT_Pulse,
  655. AI_Command_1_Register);
  656. #endif
  657. }
  658. }
  659. }
  660. static void win_out2(struct comedi_device *dev, uint32_t data, int reg)
  661. {
  662. devpriv->stc_writew(dev, data >> 16, reg);
  663. devpriv->stc_writew(dev, data & 0xffff, reg + 1);
  664. }
  665. static uint32_t win_in2(struct comedi_device *dev, int reg)
  666. {
  667. uint32_t bits;
  668. bits = devpriv->stc_readw(dev, reg) << 16;
  669. bits |= devpriv->stc_readw(dev, reg + 1);
  670. return bits;
  671. }
  672. #define ao_win_out(data, addr) ni_ao_win_outw(dev, data, addr)
  673. static inline void ni_ao_win_outw(struct comedi_device *dev, uint16_t data,
  674. int addr)
  675. {
  676. unsigned long flags;
  677. spin_lock_irqsave(&devpriv->window_lock, flags);
  678. ni_writew(addr, AO_Window_Address_611x);
  679. ni_writew(data, AO_Window_Data_611x);
  680. spin_unlock_irqrestore(&devpriv->window_lock, flags);
  681. }
  682. static inline void ni_ao_win_outl(struct comedi_device *dev, uint32_t data,
  683. int addr)
  684. {
  685. unsigned long flags;
  686. spin_lock_irqsave(&devpriv->window_lock, flags);
  687. ni_writew(addr, AO_Window_Address_611x);
  688. ni_writel(data, AO_Window_Data_611x);
  689. spin_unlock_irqrestore(&devpriv->window_lock, flags);
  690. }
  691. static inline unsigned short ni_ao_win_inw(struct comedi_device *dev, int addr)
  692. {
  693. unsigned long flags;
  694. unsigned short data;
  695. spin_lock_irqsave(&devpriv->window_lock, flags);
  696. ni_writew(addr, AO_Window_Address_611x);
  697. data = ni_readw(AO_Window_Data_611x);
  698. spin_unlock_irqrestore(&devpriv->window_lock, flags);
  699. return data;
  700. }
  701. /* ni_set_bits( ) allows different parts of the ni_mio_common driver to
  702. * share registers (such as Interrupt_A_Register) without interfering with
  703. * each other.
  704. *
  705. * NOTE: the switch/case statements are optimized out for a constant argument
  706. * so this is actually quite fast--- If you must wrap another function around this
  707. * make it inline to avoid a large speed penalty.
  708. *
  709. * value should only be 1 or 0.
  710. */
  711. static inline void ni_set_bits(struct comedi_device *dev, int reg,
  712. unsigned bits, unsigned value)
  713. {
  714. unsigned bit_values;
  715. if (value)
  716. bit_values = bits;
  717. else
  718. bit_values = 0;
  719. ni_set_bitfield(dev, reg, bits, bit_values);
  720. }
  721. static irqreturn_t ni_E_interrupt(int irq, void *d)
  722. {
  723. struct comedi_device *dev = d;
  724. unsigned short a_status;
  725. unsigned short b_status;
  726. unsigned int ai_mite_status = 0;
  727. unsigned int ao_mite_status = 0;
  728. unsigned long flags;
  729. #ifdef PCIDMA
  730. struct mite_struct *mite = devpriv->mite;
  731. #endif
  732. if (dev->attached == 0)
  733. return IRQ_NONE;
  734. smp_mb(); /* make sure dev->attached is checked before handler does anything else. */
  735. /* lock to avoid race with comedi_poll */
  736. spin_lock_irqsave(&dev->spinlock, flags);
  737. a_status = devpriv->stc_readw(dev, AI_Status_1_Register);
  738. b_status = devpriv->stc_readw(dev, AO_Status_1_Register);
  739. #ifdef PCIDMA
  740. if (mite) {
  741. unsigned long flags_too;
  742. spin_lock_irqsave(&devpriv->mite_channel_lock, flags_too);
  743. if (devpriv->ai_mite_chan) {
  744. ai_mite_status = mite_get_status(devpriv->ai_mite_chan);
  745. if (ai_mite_status & CHSR_LINKC)
  746. writel(CHOR_CLRLC,
  747. devpriv->mite->mite_io_addr +
  748. MITE_CHOR(devpriv->
  749. ai_mite_chan->channel));
  750. }
  751. if (devpriv->ao_mite_chan) {
  752. ao_mite_status = mite_get_status(devpriv->ao_mite_chan);
  753. if (ao_mite_status & CHSR_LINKC)
  754. writel(CHOR_CLRLC,
  755. mite->mite_io_addr +
  756. MITE_CHOR(devpriv->
  757. ao_mite_chan->channel));
  758. }
  759. spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags_too);
  760. }
  761. #endif
  762. ack_a_interrupt(dev, a_status);
  763. ack_b_interrupt(dev, b_status);
  764. if ((a_status & Interrupt_A_St) || (ai_mite_status & CHSR_INT))
  765. handle_a_interrupt(dev, a_status, ai_mite_status);
  766. if ((b_status & Interrupt_B_St) || (ao_mite_status & CHSR_INT))
  767. handle_b_interrupt(dev, b_status, ao_mite_status);
  768. handle_gpct_interrupt(dev, 0);
  769. handle_gpct_interrupt(dev, 1);
  770. handle_cdio_interrupt(dev);
  771. spin_unlock_irqrestore(&dev->spinlock, flags);
  772. return IRQ_HANDLED;
  773. }
  774. #ifdef PCIDMA
  775. static void ni_sync_ai_dma(struct comedi_device *dev)
  776. {
  777. struct comedi_subdevice *s = dev->subdevices + NI_AI_SUBDEV;
  778. unsigned long flags;
  779. spin_lock_irqsave(&devpriv->mite_channel_lock, flags);
  780. if (devpriv->ai_mite_chan)
  781. mite_sync_input_dma(devpriv->ai_mite_chan, s->async);
  782. spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
  783. }
  784. static void mite_handle_b_linkc(struct mite_struct *mite,
  785. struct comedi_device *dev)
  786. {
  787. struct comedi_subdevice *s = dev->subdevices + NI_AO_SUBDEV;
  788. unsigned long flags;
  789. spin_lock_irqsave(&devpriv->mite_channel_lock, flags);
  790. if (devpriv->ao_mite_chan) {
  791. mite_sync_output_dma(devpriv->ao_mite_chan, s->async);
  792. }
  793. spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
  794. }
  795. static int ni_ao_wait_for_dma_load(struct comedi_device *dev)
  796. {
  797. static const int timeout = 10000;
  798. int i;
  799. for (i = 0; i < timeout; i++) {
  800. unsigned short b_status;
  801. b_status = devpriv->stc_readw(dev, AO_Status_1_Register);
  802. if (b_status & AO_FIFO_Half_Full_St)
  803. break;
  804. /* if we poll too often, the pci bus activity seems
  805. to slow the dma transfer down */
  806. udelay(10);
  807. }
  808. if (i == timeout) {
  809. comedi_error(dev, "timed out waiting for dma load");
  810. return -EPIPE;
  811. }
  812. return 0;
  813. }
  814. #endif /* PCIDMA */
  815. static void ni_handle_eos(struct comedi_device *dev, struct comedi_subdevice *s)
  816. {
  817. if (devpriv->aimode == AIMODE_SCAN) {
  818. #ifdef PCIDMA
  819. static const int timeout = 10;
  820. int i;
  821. for (i = 0; i < timeout; i++) {
  822. ni_sync_ai_dma(dev);
  823. if ((s->async->events & COMEDI_CB_EOS))
  824. break;
  825. udelay(1);
  826. }
  827. #else
  828. ni_handle_fifo_dregs(dev);
  829. s->async->events |= COMEDI_CB_EOS;
  830. #endif
  831. }
  832. /* handle special case of single scan using AI_End_On_End_Of_Scan */
  833. if ((devpriv->ai_cmd2 & AI_End_On_End_Of_Scan)) {
  834. shutdown_ai_command(dev);
  835. }
  836. }
  837. static void shutdown_ai_command(struct comedi_device *dev)
  838. {
  839. struct comedi_subdevice *s = dev->subdevices + NI_AI_SUBDEV;
  840. #ifdef PCIDMA
  841. ni_ai_drain_dma(dev);
  842. #endif
  843. ni_handle_fifo_dregs(dev);
  844. get_last_sample_611x(dev);
  845. get_last_sample_6143(dev);
  846. s->async->events |= COMEDI_CB_EOA;
  847. }
  848. static void ni_event(struct comedi_device *dev, struct comedi_subdevice *s)
  849. {
  850. if (s->
  851. async->events & (COMEDI_CB_ERROR | COMEDI_CB_OVERFLOW |
  852. COMEDI_CB_EOA)) {
  853. switch (s - dev->subdevices) {
  854. case NI_AI_SUBDEV:
  855. ni_ai_reset(dev, s);
  856. break;
  857. case NI_AO_SUBDEV:
  858. ni_ao_reset(dev, s);
  859. break;
  860. case NI_GPCT0_SUBDEV:
  861. case NI_GPCT1_SUBDEV:
  862. ni_gpct_cancel(dev, s);
  863. break;
  864. case NI_DIO_SUBDEV:
  865. ni_cdio_cancel(dev, s);
  866. break;
  867. default:
  868. break;
  869. }
  870. }
  871. comedi_event(dev, s);
  872. }
  873. static void handle_gpct_interrupt(struct comedi_device *dev,
  874. unsigned short counter_index)
  875. {
  876. #ifdef PCIDMA
  877. struct comedi_subdevice *s =
  878. dev->subdevices + NI_GPCT_SUBDEV(counter_index);
  879. ni_tio_handle_interrupt(&devpriv->counter_dev->counters[counter_index],
  880. s);
  881. if (s->async->events)
  882. ni_event(dev, s);
  883. #endif
  884. }
  885. static void ack_a_interrupt(struct comedi_device *dev, unsigned short a_status)
  886. {
  887. unsigned short ack = 0;
  888. if (a_status & AI_SC_TC_St) {
  889. ack |= AI_SC_TC_Interrupt_Ack;
  890. }
  891. if (a_status & AI_START1_St) {
  892. ack |= AI_START1_Interrupt_Ack;
  893. }
  894. if (a_status & AI_START_St) {
  895. ack |= AI_START_Interrupt_Ack;
  896. }
  897. if (a_status & AI_STOP_St) {
  898. /* not sure why we used to ack the START here also, instead of doing it independently. Frank Hess 2007-07-06 */
  899. ack |= AI_STOP_Interrupt_Ack /*| AI_START_Interrupt_Ack */ ;
  900. }
  901. if (ack)
  902. devpriv->stc_writew(dev, ack, Interrupt_A_Ack_Register);
  903. }
  904. static void handle_a_interrupt(struct comedi_device *dev, unsigned short status,
  905. unsigned ai_mite_status)
  906. {
  907. struct comedi_subdevice *s = dev->subdevices + NI_AI_SUBDEV;
  908. /* 67xx boards don't have ai subdevice, but their gpct0 might generate an a interrupt */
  909. if (s->type == COMEDI_SUBD_UNUSED)
  910. return;
  911. #ifdef DEBUG_INTERRUPT
  912. printk
  913. ("ni_mio_common: interrupt: a_status=%04x ai_mite_status=%08x\n",
  914. status, ai_mite_status);
  915. ni_mio_print_status_a(status);
  916. #endif
  917. #ifdef PCIDMA
  918. if (ai_mite_status & CHSR_LINKC) {
  919. ni_sync_ai_dma(dev);
  920. }
  921. if (ai_mite_status & ~(CHSR_INT | CHSR_LINKC | CHSR_DONE | CHSR_MRDY |
  922. CHSR_DRDY | CHSR_DRQ1 | CHSR_DRQ0 | CHSR_ERROR |
  923. CHSR_SABORT | CHSR_XFERR | CHSR_LxERR_mask)) {
  924. printk
  925. ("unknown mite interrupt, ack! (ai_mite_status=%08x)\n",
  926. ai_mite_status);
  927. /* mite_print_chsr(ai_mite_status); */
  928. s->async->events |= COMEDI_CB_ERROR | COMEDI_CB_EOA;
  929. /* disable_irq(dev->irq); */
  930. }
  931. #endif
  932. /* test for all uncommon interrupt events at the same time */
  933. if (status & (AI_Overrun_St | AI_Overflow_St | AI_SC_TC_Error_St |
  934. AI_SC_TC_St | AI_START1_St)) {
  935. if (status == 0xffff) {
  936. printk
  937. ("ni_mio_common: a_status=0xffff. Card removed?\n");
  938. /* we probably aren't even running a command now,
  939. * so it's a good idea to be careful. */
  940. if (comedi_get_subdevice_runflags(s) & SRF_RUNNING) {
  941. s->async->events |=
  942. COMEDI_CB_ERROR | COMEDI_CB_EOA;
  943. ni_event(dev, s);
  944. }
  945. return;
  946. }
  947. if (status & (AI_Overrun_St | AI_Overflow_St |
  948. AI_SC_TC_Error_St)) {
  949. printk("ni_mio_common: ai error a_status=%04x\n",
  950. status);
  951. ni_mio_print_status_a(status);
  952. shutdown_ai_command(dev);
  953. s->async->events |= COMEDI_CB_ERROR;
  954. if (status & (AI_Overrun_St | AI_Overflow_St))
  955. s->async->events |= COMEDI_CB_OVERFLOW;
  956. ni_event(dev, s);
  957. return;
  958. }
  959. if (status & AI_SC_TC_St) {
  960. #ifdef DEBUG_INTERRUPT
  961. printk("ni_mio_common: SC_TC interrupt\n");
  962. #endif
  963. if (!devpriv->ai_continuous) {
  964. shutdown_ai_command(dev);
  965. }
  966. }
  967. }
  968. #ifndef PCIDMA
  969. if (status & AI_FIFO_Half_Full_St) {
  970. int i;
  971. static const int timeout = 10;
  972. /* pcmcia cards (at least 6036) seem to stop producing interrupts if we
  973. *fail to get the fifo less than half full, so loop to be sure.*/
  974. for (i = 0; i < timeout; ++i) {
  975. ni_handle_fifo_half_full(dev);
  976. if ((devpriv->stc_readw(dev,
  977. AI_Status_1_Register) &
  978. AI_FIFO_Half_Full_St) == 0)
  979. break;
  980. }
  981. }
  982. #endif /* !PCIDMA */
  983. if ((status & AI_STOP_St)) {
  984. ni_handle_eos(dev, s);
  985. }
  986. ni_event(dev, s);
  987. #ifdef DEBUG_INTERRUPT
  988. status = devpriv->stc_readw(dev, AI_Status_1_Register);
  989. if (status & Interrupt_A_St) {
  990. printk
  991. ("handle_a_interrupt: didn't clear interrupt? status=0x%x\n",
  992. status);
  993. }
  994. #endif
  995. }
  996. static void ack_b_interrupt(struct comedi_device *dev, unsigned short b_status)
  997. {
  998. unsigned short ack = 0;
  999. if (b_status & AO_BC_TC_St) {
  1000. ack |= AO_BC_TC_Interrupt_Ack;
  1001. }
  1002. if (b_status & AO_Overrun_St) {
  1003. ack |= AO_Error_Interrupt_Ack;
  1004. }
  1005. if (b_status & AO_START_St) {
  1006. ack |= AO_START_Interrupt_Ack;
  1007. }
  1008. if (b_status & AO_START1_St) {
  1009. ack |= AO_START1_Interrupt_Ack;
  1010. }
  1011. if (b_status & AO_UC_TC_St) {
  1012. ack |= AO_UC_TC_Interrupt_Ack;
  1013. }
  1014. if (b_status & AO_UI2_TC_St) {
  1015. ack |= AO_UI2_TC_Interrupt_Ack;
  1016. }
  1017. if (b_status & AO_UPDATE_St) {
  1018. ack |= AO_UPDATE_Interrupt_Ack;
  1019. }
  1020. if (ack)
  1021. devpriv->stc_writew(dev, ack, Interrupt_B_Ack_Register);
  1022. }
  1023. static void handle_b_interrupt(struct comedi_device *dev,
  1024. unsigned short b_status, unsigned ao_mite_status)
  1025. {
  1026. struct comedi_subdevice *s = dev->subdevices + NI_AO_SUBDEV;
  1027. /* unsigned short ack=0; */
  1028. #ifdef DEBUG_INTERRUPT
  1029. printk("ni_mio_common: interrupt: b_status=%04x m1_status=%08x\n",
  1030. b_status, ao_mite_status);
  1031. ni_mio_print_status_b(b_status);
  1032. #endif
  1033. #ifdef PCIDMA
  1034. /* Currently, mite.c requires us to handle LINKC */
  1035. if (ao_mite_status & CHSR_LINKC) {
  1036. mite_handle_b_linkc(devpriv->mite, dev);
  1037. }
  1038. if (ao_mite_status & ~(CHSR_INT | CHSR_LINKC | CHSR_DONE | CHSR_MRDY |
  1039. CHSR_DRDY | CHSR_DRQ1 | CHSR_DRQ0 | CHSR_ERROR |
  1040. CHSR_SABORT | CHSR_XFERR | CHSR_LxERR_mask)) {
  1041. printk
  1042. ("unknown mite interrupt, ack! (ao_mite_status=%08x)\n",
  1043. ao_mite_status);
  1044. /* mite_print_chsr(ao_mite_status); */
  1045. s->async->events |= COMEDI_CB_EOA | COMEDI_CB_ERROR;
  1046. }
  1047. #endif
  1048. if (b_status == 0xffff)
  1049. return;
  1050. if (b_status & AO_Overrun_St) {
  1051. printk
  1052. ("ni_mio_common: AO FIFO underrun status=0x%04x status2=0x%04x\n",
  1053. b_status, devpriv->stc_readw(dev, AO_Status_2_Register));
  1054. s->async->events |= COMEDI_CB_OVERFLOW;
  1055. }
  1056. if (b_status & AO_BC_TC_St) {
  1057. MDPRINTK
  1058. ("ni_mio_common: AO BC_TC status=0x%04x status2=0x%04x\n",
  1059. b_status, devpriv->stc_readw(dev, AO_Status_2_Register));
  1060. s->async->events |= COMEDI_CB_EOA;
  1061. }
  1062. #ifndef PCIDMA
  1063. if (b_status & AO_FIFO_Request_St) {
  1064. int ret;
  1065. ret = ni_ao_fifo_half_empty(dev, s);
  1066. if (!ret) {
  1067. printk("ni_mio_common: AO buffer underrun\n");
  1068. ni_set_bits(dev, Interrupt_B_Enable_Register,
  1069. AO_FIFO_Interrupt_Enable |
  1070. AO_Error_Interrupt_Enable, 0);
  1071. s->async->events |= COMEDI_CB_OVERFLOW;
  1072. }
  1073. }
  1074. #endif
  1075. ni_event(dev, s);
  1076. }
  1077. #ifdef DEBUG_STATUS_A
  1078. static const char *const status_a_strings[] = {
  1079. "passthru0", "fifo", "G0_gate", "G0_TC",
  1080. "stop", "start", "sc_tc", "start1",
  1081. "start2", "sc_tc_error", "overflow", "overrun",
  1082. "fifo_empty", "fifo_half_full", "fifo_full", "interrupt_a"
  1083. };
  1084. static void ni_mio_print_status_a(int status)
  1085. {
  1086. int i;
  1087. printk("A status:");
  1088. for (i = 15; i >= 0; i--) {
  1089. if (status & (1 << i)) {
  1090. printk(" %s", status_a_strings[i]);
  1091. }
  1092. }
  1093. printk("\n");
  1094. }
  1095. #endif
  1096. #ifdef DEBUG_STATUS_B
  1097. static const char *const status_b_strings[] = {
  1098. "passthru1", "fifo", "G1_gate", "G1_TC",
  1099. "UI2_TC", "UPDATE", "UC_TC", "BC_TC",
  1100. "start1", "overrun", "start", "bc_tc_error",
  1101. "fifo_empty", "fifo_half_full", "fifo_full", "interrupt_b"
  1102. };
  1103. static void ni_mio_print_status_b(int status)
  1104. {
  1105. int i;
  1106. printk("B status:");
  1107. for (i = 15; i >= 0; i--) {
  1108. if (status & (1 << i)) {
  1109. printk(" %s", status_b_strings[i]);
  1110. }
  1111. }
  1112. printk("\n");
  1113. }
  1114. #endif
  1115. #ifndef PCIDMA
  1116. static void ni_ao_fifo_load(struct comedi_device *dev,
  1117. struct comedi_subdevice *s, int n)
  1118. {
  1119. struct comedi_async *async = s->async;
  1120. struct comedi_cmd *cmd = &async->cmd;
  1121. int chan;
  1122. int i;
  1123. short d;
  1124. u32 packed_data;
  1125. int range;
  1126. int err = 1;
  1127. chan = async->cur_chan;
  1128. for (i = 0; i < n; i++) {
  1129. err &= comedi_buf_get(async, &d);
  1130. if (err == 0)
  1131. break;
  1132. range = CR_RANGE(cmd->chanlist[chan]);
  1133. if (boardtype.reg_type & ni_reg_6xxx_mask) {
  1134. packed_data = d & 0xffff;
  1135. /* 6711 only has 16 bit wide ao fifo */
  1136. if (boardtype.reg_type != ni_reg_6711) {
  1137. err &= comedi_buf_get(async, &d);
  1138. if (err == 0)
  1139. break;
  1140. chan++;
  1141. i++;
  1142. packed_data |= (d << 16) & 0xffff0000;
  1143. }
  1144. ni_writel(packed_data, DAC_FIFO_Data_611x);
  1145. } else {
  1146. ni_writew(d, DAC_FIFO_Data);
  1147. }
  1148. chan++;
  1149. chan %= cmd->chanlist_len;
  1150. }
  1151. async->cur_chan = chan;
  1152. if (err == 0) {
  1153. async->events |= COMEDI_CB_OVERFLOW;
  1154. }
  1155. }
  1156. /*
  1157. * There's a small problem if the FIFO gets really low and we
  1158. * don't have the data to fill it. Basically, if after we fill
  1159. * the FIFO with all the data available, the FIFO is _still_
  1160. * less than half full, we never clear the interrupt. If the
  1161. * IRQ is in edge mode, we never get another interrupt, because
  1162. * this one wasn't cleared. If in level mode, we get flooded
  1163. * with interrupts that we can't fulfill, because nothing ever
  1164. * gets put into the buffer.
  1165. *
  1166. * This kind of situation is recoverable, but it is easier to
  1167. * just pretend we had a FIFO underrun, since there is a good
  1168. * chance it will happen anyway. This is _not_ the case for
  1169. * RT code, as RT code might purposely be running close to the
  1170. * metal. Needs to be fixed eventually.
  1171. */
  1172. static int ni_ao_fifo_half_empty(struct comedi_device *dev,
  1173. struct comedi_subdevice *s)
  1174. {
  1175. int n;
  1176. n = comedi_buf_read_n_available(s->async);
  1177. if (n == 0) {
  1178. s->async->events |= COMEDI_CB_OVERFLOW;
  1179. return 0;
  1180. }
  1181. n /= sizeof(short);
  1182. if (n > boardtype.ao_fifo_depth / 2)
  1183. n = boardtype.ao_fifo_depth / 2;
  1184. ni_ao_fifo_load(dev, s, n);
  1185. s->async->events |= COMEDI_CB_BLOCK;
  1186. return 1;
  1187. }
  1188. static int ni_ao_prep_fifo(struct comedi_device *dev,
  1189. struct comedi_subdevice *s)
  1190. {
  1191. int n;
  1192. /* reset fifo */
  1193. devpriv->stc_writew(dev, 1, DAC_FIFO_Clear);
  1194. if (boardtype.reg_type & ni_reg_6xxx_mask)
  1195. ni_ao_win_outl(dev, 0x6, AO_FIFO_Offset_Load_611x);
  1196. /* load some data */
  1197. n = comedi_buf_read_n_available(s->async);
  1198. if (n == 0)
  1199. return 0;
  1200. n /= sizeof(short);
  1201. if (n > boardtype.ao_fifo_depth)
  1202. n = boardtype.ao_fifo_depth;
  1203. ni_ao_fifo_load(dev, s, n);
  1204. return n;
  1205. }
  1206. static void ni_ai_fifo_read(struct comedi_device *dev,
  1207. struct comedi_subdevice *s, int n)
  1208. {
  1209. struct comedi_async *async = s->async;
  1210. int i;
  1211. if (boardtype.reg_type == ni_reg_611x) {
  1212. short data[2];
  1213. u32 dl;
  1214. for (i = 0; i < n / 2; i++) {
  1215. dl = ni_readl(ADC_FIFO_Data_611x);
  1216. /* This may get the hi/lo data in the wrong order */
  1217. data[0] = (dl >> 16) & 0xffff;
  1218. data[1] = dl & 0xffff;
  1219. cfc_write_array_to_buffer(s, data, sizeof(data));
  1220. }
  1221. /* Check if there's a single sample stuck in the FIFO */
  1222. if (n % 2) {
  1223. dl = ni_readl(ADC_FIFO_Data_611x);
  1224. data[0] = dl & 0xffff;
  1225. cfc_write_to_buffer(s, data[0]);
  1226. }
  1227. } else if (boardtype.reg_type == ni_reg_6143) {
  1228. short data[2];
  1229. u32 dl;
  1230. /* This just reads the FIFO assuming the data is present, no checks on the FIFO status are performed */
  1231. for (i = 0; i < n / 2; i++) {
  1232. dl = ni_readl(AIFIFO_Data_6143);
  1233. data[0] = (dl >> 16) & 0xffff;
  1234. data[1] = dl & 0xffff;
  1235. cfc_write_array_to_buffer(s, data, sizeof(data));
  1236. }
  1237. if (n % 2) {
  1238. /* Assume there is a single sample stuck in the FIFO */
  1239. ni_writel(0x01, AIFIFO_Control_6143); /* Get stranded sample into FIFO */
  1240. dl = ni_readl(AIFIFO_Data_6143);
  1241. data[0] = (dl >> 16) & 0xffff;
  1242. cfc_write_to_buffer(s, data[0]);
  1243. }
  1244. } else {
  1245. if (n > sizeof(devpriv->ai_fifo_buffer) /
  1246. sizeof(devpriv->ai_fifo_buffer[0])) {
  1247. comedi_error(dev, "bug! ai_fifo_buffer too small");
  1248. async->events |= COMEDI_CB_ERROR;
  1249. return;
  1250. }
  1251. for (i = 0; i < n; i++) {
  1252. devpriv->ai_fifo_buffer[i] =
  1253. ni_readw(ADC_FIFO_Data_Register);
  1254. }
  1255. cfc_write_array_to_buffer(s, devpriv->ai_fifo_buffer,
  1256. n *
  1257. sizeof(devpriv->ai_fifo_buffer[0]));
  1258. }
  1259. }
  1260. static void ni_handle_fifo_half_full(struct comedi_device *dev)
  1261. {
  1262. int n;
  1263. struct comedi_subdevice *s = dev->subdevices + NI_AI_SUBDEV;
  1264. n = boardtype.ai_fifo_depth / 2;
  1265. ni_ai_fifo_read(dev, s, n);
  1266. }
  1267. #endif
  1268. #ifdef PCIDMA
  1269. static int ni_ai_drain_dma(struct comedi_device *dev)
  1270. {
  1271. int i;
  1272. static const int timeout = 10000;
  1273. unsigned long flags;
  1274. int retval = 0;
  1275. spin_lock_irqsave(&devpriv->mite_channel_lock, flags);
  1276. if (devpriv->ai_mite_chan) {
  1277. for (i = 0; i < timeout; i++) {
  1278. if ((devpriv->stc_readw(dev,
  1279. AI_Status_1_Register) &
  1280. AI_FIFO_Empty_St)
  1281. && mite_bytes_in_transit(devpriv->ai_mite_chan) ==
  1282. 0)
  1283. break;
  1284. udelay(5);
  1285. }
  1286. if (i == timeout) {
  1287. printk("ni_mio_common: wait for dma drain timed out\n");
  1288. printk
  1289. ("mite_bytes_in_transit=%i, AI_Status1_Register=0x%x\n",
  1290. mite_bytes_in_transit(devpriv->ai_mite_chan),
  1291. devpriv->stc_readw(dev, AI_Status_1_Register));
  1292. retval = -1;
  1293. }
  1294. }
  1295. spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
  1296. ni_sync_ai_dma(dev);
  1297. return retval;
  1298. }
  1299. #endif
  1300. /*
  1301. Empties the AI fifo
  1302. */
  1303. static void ni_handle_fifo_dregs(struct comedi_device *dev)
  1304. {
  1305. struct comedi_subdevice *s = dev->subdevices + NI_AI_SUBDEV;
  1306. short data[2];
  1307. u32 dl;
  1308. short fifo_empty;
  1309. int i;
  1310. if (boardtype.reg_type == ni_reg_611x) {
  1311. while ((devpriv->stc_readw(dev,
  1312. AI_Status_1_Register) &
  1313. AI_FIFO_Empty_St) == 0) {
  1314. dl = ni_readl(ADC_FIFO_Data_611x);
  1315. /* This may get the hi/lo data in the wrong order */
  1316. data[0] = (dl >> 16);
  1317. data[1] = (dl & 0xffff);
  1318. cfc_write_array_to_buffer(s, data, sizeof(data));
  1319. }
  1320. } else if (boardtype.reg_type == ni_reg_6143) {
  1321. i = 0;
  1322. while (ni_readl(AIFIFO_Status_6143) & 0x04) {
  1323. dl = ni_readl(AIFIFO_Data_6143);
  1324. /* This may get the hi/lo data in the wrong order */
  1325. data[0] = (dl >> 16);
  1326. data[1] = (dl & 0xffff);
  1327. cfc_write_array_to_buffer(s, data, sizeof(data));
  1328. i += 2;
  1329. }
  1330. /* Check if stranded sample is present */
  1331. if (ni_readl(AIFIFO_Status_6143) & 0x01) {
  1332. ni_writel(0x01, AIFIFO_Control_6143); /* Get stranded sample into FIFO */
  1333. dl = ni_readl(AIFIFO_Data_6143);
  1334. data[0] = (dl >> 16) & 0xffff;
  1335. cfc_write_to_buffer(s, data[0]);
  1336. }
  1337. } else {
  1338. fifo_empty =
  1339. devpriv->stc_readw(dev,
  1340. AI_Status_1_Register) & AI_FIFO_Empty_St;
  1341. while (fifo_empty == 0) {
  1342. for (i = 0;
  1343. i <
  1344. sizeof(devpriv->ai_fifo_buffer) /
  1345. sizeof(devpriv->ai_fifo_buffer[0]); i++) {
  1346. fifo_empty =
  1347. devpriv->stc_readw(dev,
  1348. AI_Status_1_Register) &
  1349. AI_FIFO_Empty_St;
  1350. if (fifo_empty)
  1351. break;
  1352. devpriv->ai_fifo_buffer[i] =
  1353. ni_readw(ADC_FIFO_Data_Register);
  1354. }
  1355. cfc_write_array_to_buffer(s, devpriv->ai_fifo_buffer,
  1356. i *
  1357. sizeof(devpriv->
  1358. ai_fifo_buffer[0]));
  1359. }
  1360. }
  1361. }
  1362. static void get_last_sample_611x(struct comedi_device *dev)
  1363. {
  1364. struct comedi_subdevice *s = dev->subdevices + NI_AI_SUBDEV;
  1365. short data;
  1366. u32 dl;
  1367. if (boardtype.reg_type != ni_reg_611x)
  1368. return;
  1369. /* Check if there's a single sample stuck in the FIFO */
  1370. if (ni_readb(XXX_Status) & 0x80) {
  1371. dl = ni_readl(ADC_FIFO_Data_611x);
  1372. data = (dl & 0xffff);
  1373. cfc_write_to_buffer(s, data);
  1374. }
  1375. }
  1376. static void get_last_sample_6143(struct comedi_device *dev)
  1377. {
  1378. struct comedi_subdevice *s = dev->subdevices + NI_AI_SUBDEV;
  1379. short data;
  1380. u32 dl;
  1381. if (boardtype.reg_type != ni_reg_6143)
  1382. return;
  1383. /* Check if there's a single sample stuck in the FIFO */
  1384. if (ni_readl(AIFIFO_Status_6143) & 0x01) {
  1385. ni_writel(0x01, AIFIFO_Control_6143); /* Get stranded sample into FIFO */
  1386. dl = ni_readl(AIFIFO_Data_6143);
  1387. /* This may get the hi/lo data in the wrong order */
  1388. data = (dl >> 16) & 0xffff;
  1389. cfc_write_to_buffer(s, data);
  1390. }
  1391. }
  1392. static void ni_ai_munge(struct comedi_device *dev, struct comedi_subdevice *s,
  1393. void *data, unsigned int num_bytes,
  1394. unsigned int chan_index)
  1395. {
  1396. struct comedi_async *async = s->async;
  1397. unsigned int i;
  1398. unsigned int length = num_bytes / bytes_per_sample(s);
  1399. short *array = data;
  1400. unsigned int *larray = data;
  1401. for (i = 0; i < length; i++) {
  1402. #ifdef PCIDMA
  1403. if (s->subdev_flags & SDF_LSAMPL)
  1404. larray[i] = le32_to_cpu(larray[i]);
  1405. else
  1406. array[i] = le16_to_cpu(array[i]);
  1407. #endif
  1408. if (s->subdev_flags & SDF_LSAMPL)
  1409. larray[i] += devpriv->ai_offset[chan_index];
  1410. else
  1411. array[i] += devpriv->ai_offset[chan_index];
  1412. chan_index++;
  1413. chan_index %= async->cmd.chanlist_len;
  1414. }
  1415. }
  1416. #ifdef PCIDMA
  1417. static int ni_ai_setup_MITE_dma(struct comedi_device *dev)
  1418. {
  1419. struct comedi_subdevice *s = dev->subdevices + NI_AI_SUBDEV;
  1420. int retval;
  1421. unsigned long flags;
  1422. retval = ni_request_ai_mite_channel(dev);
  1423. if (retval)
  1424. return retval;
  1425. /* printk("comedi_debug: using mite channel %i for ai.\n", devpriv->ai_mite_chan->channel); */
  1426. /* write alloc the entire buffer */
  1427. comedi_buf_write_alloc(s->async, s->async->prealloc_bufsz);
  1428. spin_lock_irqsave(&devpriv->mite_channel_lock, flags);
  1429. if (devpriv->ai_mite_chan == NULL) {
  1430. spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
  1431. return -EIO;
  1432. }
  1433. switch (boardtype.reg_type) {
  1434. case ni_reg_611x:
  1435. case ni_reg_6143:
  1436. mite_prep_dma(devpriv->ai_mite_chan, 32, 16);
  1437. break;
  1438. case ni_reg_628x:
  1439. mite_prep_dma(devpriv->ai_mite_chan, 32, 32);
  1440. break;
  1441. default:
  1442. mite_prep_dma(devpriv->ai_mite_chan, 16, 16);
  1443. break;
  1444. }
  1445. /*start the MITE */
  1446. mite_dma_arm(devpriv->ai_mite_chan);
  1447. spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
  1448. return 0;
  1449. }
  1450. static int ni_ao_setup_MITE_dma(struct comedi_device *dev)
  1451. {
  1452. struct comedi_subdevice *s = dev->subdevices + NI_AO_SUBDEV;
  1453. int retval;
  1454. unsigned long flags;
  1455. retval = ni_request_ao_mite_channel(dev);
  1456. if (retval)
  1457. return retval;
  1458. /* read alloc the entire buffer */
  1459. comedi_buf_read_alloc(s->async, s->async->prealloc_bufsz);
  1460. spin_lock_irqsave(&devpriv->mite_channel_lock, flags);
  1461. if (devpriv->ao_mite_chan) {
  1462. if (boardtype.reg_type & (ni_reg_611x | ni_reg_6713)) {
  1463. mite_prep_dma(devpriv->ao_mite_chan, 32, 32);
  1464. } else {
  1465. /* doing 32 instead of 16 bit wide transfers from memory
  1466. makes the mite do 32 bit pci transfers, doubling pci bandwidth. */
  1467. mite_prep_dma(devpriv->ao_mite_chan, 16, 32);
  1468. }
  1469. mite_dma_arm(devpriv->ao_mite_chan);
  1470. } else
  1471. retval = -EIO;
  1472. spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
  1473. return retval;
  1474. }
  1475. #endif /* PCIDMA */
  1476. /*
  1477. used for both cancel ioctl and board initialization
  1478. this is pretty harsh for a cancel, but it works...
  1479. */
  1480. static int ni_ai_reset(struct comedi_device *dev, struct comedi_subdevice *s)
  1481. {
  1482. ni_release_ai_mite_channel(dev);
  1483. /* ai configuration */
  1484. devpriv->stc_writew(dev, AI_Configuration_Start | AI_Reset,
  1485. Joint_Reset_Register);
  1486. ni_set_bits(dev, Interrupt_A_Enable_Register,
  1487. AI_SC_TC_Interrupt_Enable | AI_START1_Interrupt_Enable |
  1488. AI_START2_Interrupt_Enable | AI_START_Interrupt_Enable |
  1489. AI_STOP_Interrupt_Enable | AI_Error_Interrupt_Enable |
  1490. AI_FIFO_Interrupt_Enable, 0);
  1491. ni_clear_ai_fifo(dev);
  1492. if (boardtype.reg_type != ni_reg_6143)
  1493. ni_writeb(0, Misc_Command);
  1494. devpriv->stc_writew(dev, AI_Disarm, AI_Command_1_Register); /* reset pulses */
  1495. devpriv->stc_writew(dev,
  1496. AI_Start_Stop | AI_Mode_1_Reserved
  1497. /*| AI_Trigger_Once */ ,
  1498. AI_Mode_1_Register);
  1499. devpriv->stc_writew(dev, 0x0000, AI_Mode_2_Register);
  1500. /* generate FIFO interrupts on non-empty */
  1501. devpriv->stc_writew(dev, (0 << 6) | 0x0000, AI_Mode_3_Register);
  1502. if (boardtype.reg_type == ni_reg_611x) {
  1503. devpriv->stc_writew(dev, AI_SHIFTIN_Pulse_Width |
  1504. AI_SOC_Polarity |
  1505. AI_LOCALMUX_CLK_Pulse_Width,
  1506. AI_Personal_Register);
  1507. devpriv->stc_writew(dev,
  1508. AI_SCAN_IN_PROG_Output_Select(3) |
  1509. AI_EXTMUX_CLK_Output_Select(0) |
  1510. AI_LOCALMUX_CLK_Output_Select(2) |
  1511. AI_SC_TC_Output_Select(3) |
  1512. AI_CONVERT_Output_Select
  1513. (AI_CONVERT_Output_Enable_High),
  1514. AI_Output_Control_Register);
  1515. } else if (boardtype.reg_type == ni_reg_6143) {
  1516. devpriv->stc_writew(dev, AI_SHIFTIN_Pulse_Width |
  1517. AI_SOC_Polarity |
  1518. AI_LOCALMUX_CLK_Pulse_Width,
  1519. AI_Personal_Register);
  1520. devpriv->stc_writew(dev,
  1521. AI_SCAN_IN_PROG_Output_Select(3) |
  1522. AI_EXTMUX_CLK_Output_Select(0) |
  1523. AI_LOCALMUX_CLK_Output_Select(2) |
  1524. AI_SC_TC_Output_Select(3) |
  1525. AI_CONVERT_Output_Select
  1526. (AI_CONVERT_Output_Enable_Low),
  1527. AI_Output_Control_Register);
  1528. } else {
  1529. unsigned ai_output_control_bits;
  1530. devpriv->stc_writew(dev, AI_SHIFTIN_Pulse_Width |
  1531. AI_SOC_Polarity |
  1532. AI_CONVERT_Pulse_Width |
  1533. AI_LOCALMUX_CLK_Pulse_Width,
  1534. AI_Personal_Register);
  1535. ai_output_control_bits =
  1536. AI_SCAN_IN_PROG_Output_Select(3) |
  1537. AI_EXTMUX_CLK_Output_Select(0) |
  1538. AI_LOCALMUX_CLK_Output_Select(2) |
  1539. AI_SC_TC_Output_Select(3);
  1540. if (boardtype.reg_type == ni_reg_622x)
  1541. ai_output_control_bits |=
  1542. AI_CONVERT_Output_Select
  1543. (AI_CONVERT_Output_Enable_High);
  1544. else
  1545. ai_output_control_bits |=
  1546. AI_CONVERT_Output_Select
  1547. (AI_CONVERT_Output_Enable_Low);
  1548. devpriv->stc_writew(dev, ai_output_control_bits,
  1549. AI_Output_Control_Register);
  1550. }
  1551. /* the following registers should not be changed, because there
  1552. * are no backup registers in devpriv. If you want to change
  1553. * any of these, add a backup register and other appropriate code:
  1554. * AI_Mode_1_Register
  1555. * AI_Mode_3_Register
  1556. * AI_Personal_Register
  1557. * AI_Output_Control_Register
  1558. */
  1559. devpriv->stc_writew(dev, AI_SC_TC_Error_Confirm | AI_START_Interrupt_Ack | AI_START2_Interrupt_Ack | AI_START1_Interrupt_Ack | AI_SC_TC_Interrupt_Ack | AI_Error_Interrupt_Ack | AI_STOP_Interrupt_Ack, Interrupt_A_Ack_Register); /* clear interrupts */
  1560. devpriv->stc_writew(dev, AI_Configuration_End, Joint_Reset_Register);
  1561. return 0;
  1562. }
  1563. static int ni_ai_poll(struct comedi_device *dev, struct comedi_subdevice *s)
  1564. {
  1565. unsigned long flags = 0;
  1566. int count;
  1567. /* lock to avoid race with interrupt handler */
  1568. if (in_interrupt() == 0)
  1569. spin_lock_irqsave(&dev->spinlock, flags);
  1570. #ifndef PCIDMA
  1571. ni_handle_fifo_dregs(dev);
  1572. #else
  1573. ni_sync_ai_dma(dev);
  1574. #endif
  1575. count = s->async->buf_write_count - s->async->buf_read_count;
  1576. if (in_interrupt() == 0)
  1577. spin_unlock_irqrestore(&dev->spinlock, flags);
  1578. return count;
  1579. }
  1580. static int ni_ai_insn_read(struct comedi_device *dev,
  1581. struct comedi_subdevice *s, struct comedi_insn *insn,
  1582. unsigned int *data)
  1583. {
  1584. int i, n;
  1585. const unsigned int mask = (1 << boardtype.adbits) - 1;
  1586. unsigned signbits;
  1587. unsigned short d;
  1588. unsigned long dl;
  1589. ni_load_channelgain_list(dev, 1, &insn->chanspec);
  1590. ni_clear_ai_fifo(dev);
  1591. signbits = devpriv->ai_offset[0];
  1592. if (boardtype.reg_type == ni_reg_611x) {
  1593. for (n = 0; n < num_adc_stages_611x; n++) {
  1594. devpriv->stc_writew(dev, AI_CONVERT_Pulse,
  1595. AI_Command_1_Register);
  1596. udelay(1);
  1597. }
  1598. for (n = 0; n < insn->n; n++) {
  1599. devpriv->stc_writew(dev, AI_CONVERT_Pulse,
  1600. AI_Command_1_Register);
  1601. /* The 611x has screwy 32-bit FIFOs. */
  1602. d = 0;
  1603. for (i = 0; i < NI_TIMEOUT; i++) {
  1604. if (ni_readb(XXX_Status) & 0x80) {
  1605. d = (ni_readl(ADC_FIFO_Data_611x) >> 16)
  1606. & 0xffff;
  1607. break;
  1608. }
  1609. if (!(devpriv->stc_readw(dev,
  1610. AI_Status_1_Register) &
  1611. AI_FIFO_Empty_St)) {
  1612. d = ni_readl(ADC_FIFO_Data_611x) &
  1613. 0xffff;
  1614. break;
  1615. }
  1616. }
  1617. if (i == NI_TIMEOUT) {
  1618. printk
  1619. ("ni_mio_common: timeout in 611x ni_ai_insn_read\n");
  1620. return -ETIME;
  1621. }
  1622. d += signbits;
  1623. data[n] = d;
  1624. }
  1625. } else if (boardtype.reg_type == ni_reg_6143) {
  1626. for (n = 0; n < insn->n; n++) {
  1627. devpriv->stc_writew(dev, AI_CONVERT_Pulse,
  1628. AI_Command_1_Register);
  1629. /* The 6143 has 32-bit FIFOs. You need to strobe a bit to move a single 16bit stranded sample into the FIFO */
  1630. dl = 0;
  1631. for (i = 0; i < NI_TIMEOUT; i++) {
  1632. if (ni_readl(AIFIFO_Status_6143) & 0x01) {
  1633. ni_writel(0x01, AIFIFO_Control_6143); /* Get stranded sample into FIFO */
  1634. dl = ni_readl(AIFIFO_Data_6143);
  1635. break;
  1636. }
  1637. }
  1638. if (i == NI_TIMEOUT) {
  1639. printk
  1640. ("ni_mio_common: timeout in 6143 ni_ai_insn_read\n");
  1641. return -ETIME;
  1642. }
  1643. data[n] = (((dl >> 16) & 0xFFFF) + signbits) & 0xFFFF;
  1644. }
  1645. } else {
  1646. for (n = 0; n < insn->n; n++) {
  1647. devpriv->stc_writew(dev, AI_CONVERT_Pulse,
  1648. AI_Command_1_Register);
  1649. for (i = 0; i < NI_TIMEOUT; i++) {
  1650. if (!(devpriv->stc_readw(dev,
  1651. AI_Status_1_Register) &
  1652. AI_FIFO_Empty_St))
  1653. break;
  1654. }
  1655. if (i == NI_TIMEOUT) {
  1656. printk
  1657. ("ni_mio_common: timeout in ni_ai_insn_read\n");
  1658. return -ETIME;
  1659. }
  1660. if (boardtype.reg_type & ni_reg_m_series_mask) {
  1661. data[n] =
  1662. ni_readl(M_Offset_AI_FIFO_Data) & mask;
  1663. } else {
  1664. d = ni_readw(ADC_FIFO_Data_Register);
  1665. d += signbits; /* subtle: needs to be short addition */
  1666. data[n] = d;
  1667. }
  1668. }
  1669. }
  1670. return insn->n;
  1671. }
  1672. void ni_prime_channelgain_list(struct comedi_device *dev)
  1673. {
  1674. int i;
  1675. devpriv->stc_writew(dev, AI_CONVERT_Pulse, AI_Command_1_Register);
  1676. for (i = 0; i < NI_TIMEOUT; ++i) {
  1677. if (!(devpriv->stc_readw(dev,
  1678. AI_Status_1_Register) &
  1679. AI_FIFO_Empty_St)) {
  1680. devpriv->stc_writew(dev, 1, ADC_FIFO_Clear);
  1681. return;
  1682. }
  1683. udelay(1);
  1684. }
  1685. printk("ni_mio_common: timeout loading channel/gain list\n");
  1686. }
  1687. static void ni_m_series_load_channelgain_list(struct comedi_device *dev,
  1688. unsigned int n_chan,
  1689. unsigned int *list)
  1690. {
  1691. unsigned int chan, range, aref;
  1692. unsigned int i;
  1693. unsigned offset;
  1694. unsigned int dither;
  1695. unsigned range_code;
  1696. devpriv->stc_writew(dev, 1, Configuration_Memory_Clear);
  1697. /* offset = 1 << (boardtype.adbits - 1); */
  1698. if ((list[0] & CR_ALT_SOURCE)) {
  1699. unsigned bypass_bits;
  1700. chan = CR_CHAN(list[0]);
  1701. range = CR_RANGE(list[0]);
  1702. range_code = ni_gainlkup[boardtype.gainlkup][range];
  1703. dither = ((list[0] & CR_ALT_FILTER) != 0);
  1704. bypass_bits = MSeries_AI_Bypass_Config_FIFO_Bit;
  1705. bypass_bits |= chan;
  1706. bypass_bits |=
  1707. (devpriv->ai_calib_source) &
  1708. (MSeries_AI_Bypass_Cal_Sel_Pos_Mask |
  1709. MSeries_AI_Bypass_Cal_Sel_Neg_Mask |
  1710. MSeries_AI_Bypass_Mode_Mux_Mask |
  1711. MSeries_AO_Bypass_AO_Cal_Sel_Mask);
  1712. bypass_bits |= MSeries_AI_Bypass_Gain_Bits(range_code);
  1713. if (dither)
  1714. bypass_bits |= MSeries_AI_Bypass_Dither_Bit;
  1715. /* don't use 2's complement encoding */
  1716. bypass_bits |= MSeries_AI_Bypass_Polarity_Bit;
  1717. ni_writel(bypass_bits, M_Offset_AI_Config_FIFO_Bypass);
  1718. } else {
  1719. ni_writel(0, M_Offset_AI_Config_FIFO_Bypass);
  1720. }
  1721. offset = 0;
  1722. for (i = 0; i < n_chan; i++) {
  1723. unsigned config_bits = 0;
  1724. chan = CR_CHAN(list[i]);
  1725. aref = CR_AREF(list[i]);
  1726. range = CR_RANGE(list[i]);
  1727. dither = ((list[i] & CR_ALT_FILTER) != 0);
  1728. range_code = ni_gainlkup[boardtype.gainlkup][range];
  1729. devpriv->ai_offset[i] = offset;
  1730. switch (aref) {
  1731. case AREF_DIFF:
  1732. config_bits |=
  1733. MSeries_AI_Config_Channel_Type_Differential_Bits;
  1734. break;
  1735. case AREF_COMMON:
  1736. config_bits |=
  1737. MSeries_AI_Config_Channel_Type_Common_Ref_Bits;
  1738. break;
  1739. case AREF_GROUND:
  1740. config_bits |=
  1741. MSeries_AI_Config_Channel_Type_Ground_Ref_Bits;
  1742. break;
  1743. case AREF_OTHER:
  1744. break;
  1745. }
  1746. config_bits |= MSeries_AI_Config_Channel_Bits(chan);
  1747. config_bits |=
  1748. MSeries_AI_Config_Bank_Bits(boardtype.reg_type, chan);
  1749. config_bits |= MSeries_AI_Config_Gain_Bits(range_code);
  1750. if (i == n_chan - 1)
  1751. config_bits |= MSeries_AI_Config_Last_Channel_Bit;
  1752. if (dither)
  1753. config_bits |= MSeries_AI_Config_Dither_Bit;
  1754. /* don't use 2's complement encoding */
  1755. config_bits |= MSeries_AI_Config_Polarity_Bit;
  1756. ni_writew(config_bits, M_Offset_AI_Config_FIFO_Data);
  1757. }
  1758. ni_prime_channelgain_list(dev);
  1759. }
  1760. /*
  1761. * Notes on the 6110 and 6111:
  1762. * These boards a slightly different than the rest of the series, since
  1763. * they have multiple A/D converters.
  1764. * From the driver side, the configuration memory is a
  1765. * little different.
  1766. * Configuration Memory Low:
  1767. * bits 15-9: same
  1768. * bit 8: unipolar/bipolar (should be 0 for bipolar)
  1769. * bits 0-3: gain. This is 4 bits instead of 3 for the other boards
  1770. * 1001 gain=0.1 (+/- 50)
  1771. * 1010 0.2
  1772. * 1011 0.1
  1773. * 0001 1
  1774. * 0010 2
  1775. * 0011 5
  1776. * 0100 10
  1777. * 0101 20
  1778. * 0110 50
  1779. * Configuration Memory High:
  1780. * bits 12-14: Channel Type
  1781. * 001 for differential
  1782. * 000 for calibration
  1783. * bit 11: coupling (this is not currently handled)
  1784. * 1 AC coupling
  1785. * 0 DC coupling
  1786. * bits 0-2: channel
  1787. * valid channels are 0-3
  1788. */
  1789. static void ni_load_channelgain_list(struct comedi_device *dev,
  1790. unsigned int n_chan, unsigned int *list)
  1791. {
  1792. unsigned int chan, range, aref;
  1793. unsigned int i;
  1794. unsigned int hi, lo;
  1795. unsigned offset;
  1796. unsigned int dither;
  1797. if (boardtype.reg_type & ni_reg_m_series_mask) {
  1798. ni_m_series_load_channelgain_list(dev, n_chan, list);
  1799. return;
  1800. }
  1801. if (n_chan == 1 && (boardtype.reg_type != ni_reg_611x)
  1802. && (boardtype.reg_type != ni_reg_6143)) {
  1803. if (devpriv->changain_state
  1804. && devpriv->changain_spec == list[0]) {
  1805. /* ready to go. */
  1806. return;
  1807. }
  1808. devpriv->changain_state = 1;
  1809. devpriv->changain_spec = list[0];
  1810. } else {
  1811. devpriv->changain_state = 0;
  1812. }
  1813. devpriv->stc_writew(dev, 1, Configuration_Memory_Clear);
  1814. /* Set up Calibration mode if required */
  1815. if (boardtype.reg_type == ni_reg_6143) {
  1816. if ((list[0] & CR_ALT_SOURCE)
  1817. && !devpriv->ai_calib_source_enabled) {
  1818. /* Strobe Relay enable bit */
  1819. ni_writew(devpriv->ai_calib_source |
  1820. Calibration_Channel_6143_RelayOn,
  1821. Calibration_Channel_6143);
  1822. ni_writew(devpriv->ai_calib_source,
  1823. Calibration_Channel_6143);
  1824. devpriv->ai_calib_source_enabled = 1;
  1825. msleep_interruptible(100); /* Allow relays to change */
  1826. } else if (!(list[0] & CR_ALT_SOURCE)
  1827. && devpriv->ai_calib_source_enabled) {
  1828. /* Strobe Relay disable bit */
  1829. ni_writew(devpriv->ai_calib_source |
  1830. Calibration_Channel_6143_RelayOff,
  1831. Calibration_Channel_6143);
  1832. ni_writew(devpriv->ai_calib_source,
  1833. Calibration_Channel_6143);
  1834. devpriv->ai_calib_source_enabled = 0;
  1835. msleep_interruptible(100); /* Allow relays to change */
  1836. }
  1837. }
  1838. offset = 1 << (boardtype.adbits - 1);
  1839. for (i = 0; i < n_chan; i++) {
  1840. if ((boardtype.reg_type != ni_reg_6143)
  1841. && (list[i] & CR_ALT_SOURCE)) {
  1842. chan = devpriv->ai_calib_source;
  1843. } else {
  1844. chan = CR_CHAN(list[i]);
  1845. }
  1846. aref = CR_AREF(list[i]);
  1847. range = CR_RANGE(list[i]);
  1848. dither = ((list[i] & CR_ALT_FILTER) != 0);
  1849. /* fix the external/internal range differences */
  1850. range = ni_gainlkup[boardtype.gainlkup][range];
  1851. if (boardtype.reg_type == ni_reg_611x)
  1852. devpriv->ai_offset[i] = offset;
  1853. else
  1854. devpriv->ai_offset[i] = (range & 0x100) ? 0 : offset;
  1855. hi = 0;
  1856. if ((list[i] & CR_ALT_SOURCE)) {
  1857. if (boardtype.reg_type == ni_reg_611x)
  1858. ni_writew(CR_CHAN(list[i]) & 0x0003,
  1859. Calibration_Channel_Select_611x);
  1860. } else {
  1861. if (boardtype.reg_type == ni_reg_611x)
  1862. aref = AREF_DIFF;
  1863. else if (boardtype.reg_type == ni_reg_6143)
  1864. aref = AREF_OTHER;
  1865. switch (aref) {
  1866. case AREF_DIFF:
  1867. hi |= AI_DIFFERENTIAL;
  1868. break;
  1869. case AREF_COMMON:
  1870. hi |= AI_COMMON;
  1871. break;
  1872. case AREF_GROUND:
  1873. hi |= AI_GROUND;
  1874. break;
  1875. case AREF_OTHER:
  1876. break;
  1877. }
  1878. }
  1879. hi |= AI_CONFIG_CHANNEL(chan);
  1880. ni_writew(hi, Configuration_Memory_High);
  1881. if (boardtype.reg_type != ni_reg_6143) {
  1882. lo = range;
  1883. if (i == n_chan - 1)
  1884. lo |= AI_LAST_CHANNEL;
  1885. if (dither)
  1886. lo |= AI_DITHER;
  1887. ni_writew(lo, Configuration_Memory_Low);
  1888. }
  1889. }
  1890. /* prime the channel/gain list */
  1891. if ((boardtype.reg_type != ni_reg_611x)
  1892. && (boardtype.reg_type != ni_reg_6143)) {
  1893. ni_prime_channelgain_list(dev);
  1894. }
  1895. }
  1896. static int ni_ns_to_timer(const struct comedi_device *dev, unsigned nanosec,
  1897. int round_mode)
  1898. {
  1899. int divider;
  1900. switch (round_mode) {
  1901. case TRIG_ROUND_NEAREST:
  1902. default:
  1903. divider = (nanosec + devpriv->clock_ns / 2) / devpriv->clock_ns;
  1904. break;
  1905. case TRIG_ROUND_DOWN:
  1906. divider = (nanosec) / devpriv->clock_ns;
  1907. break;
  1908. case TRIG_ROUND_UP:
  1909. divider = (nanosec + devpriv->clock_ns - 1) / devpriv->clock_ns;
  1910. break;
  1911. }
  1912. return divider - 1;
  1913. }
  1914. static unsigned ni_timer_to_ns(const struct comedi_device *dev, int timer)
  1915. {
  1916. return devpriv->clock_ns * (timer + 1);
  1917. }
  1918. static unsigned ni_min_ai_scan_period_ns(struct comedi_device *dev,
  1919. unsigned num_channels)
  1920. {
  1921. switch (boardtype.reg_type) {
  1922. case ni_reg_611x:
  1923. case ni_reg_6143:
  1924. /* simultaneously-sampled inputs */
  1925. return boardtype.ai_speed;
  1926. break;
  1927. default:
  1928. /* multiplexed inputs */
  1929. break;
  1930. }
  1931. return boardtype.ai_speed * num_channels;
  1932. }
  1933. static int ni_ai_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s,
  1934. struct comedi_cmd *cmd)
  1935. {
  1936. int err = 0;
  1937. int tmp;
  1938. int sources;
  1939. /* step 1: make sure trigger sources are trivially valid */
  1940. if ((cmd->flags & CMDF_WRITE)) {
  1941. cmd->flags &= ~CMDF_WRITE;
  1942. }
  1943. tmp = cmd->start_src;
  1944. cmd->start_src &= TRIG_NOW | TRIG_INT | TRIG_EXT;
  1945. if (!cmd->start_src || tmp != cmd->start_src)
  1946. err++;
  1947. tmp = cmd->scan_begin_src;
  1948. cmd->scan_begin_src &= TRIG_TIMER | TRIG_EXT;
  1949. if (!cmd->scan_begin_src || tmp != cmd->scan_begin_src)
  1950. err++;
  1951. tmp = cmd->convert_src;
  1952. sources = TRIG_TIMER | TRIG_EXT;
  1953. if ((boardtype.reg_type == ni_reg_611x)
  1954. || (boardtype.reg_type == ni_reg_6143))
  1955. sources |= TRIG_NOW;
  1956. cmd->convert_src &= sources;
  1957. if (!cmd->convert_src || tmp != cmd->convert_src)
  1958. err++;
  1959. tmp = cmd->scan_end_src;
  1960. cmd->scan_end_src &= TRIG_COUNT;
  1961. if (!cmd->scan_end_src || tmp != cmd->scan_end_src)
  1962. err++;
  1963. tmp = cmd->stop_src;
  1964. cmd->stop_src &= TRIG_COUNT | TRIG_NONE;
  1965. if (!cmd->stop_src || tmp != cmd->stop_src)
  1966. err++;
  1967. if (err)
  1968. return 1;
  1969. /* step 2: make sure trigger sources are unique and mutually compatible */
  1970. /* note that mutual compatibility is not an issue here */
  1971. if (cmd->start_src != TRIG_NOW &&
  1972. cmd->start_src != TRIG_INT && cmd->start_src != TRIG_EXT)
  1973. err++;
  1974. if (cmd->scan_begin_src != TRIG_TIMER &&
  1975. cmd->scan_begin_src != TRIG_EXT &&
  1976. cmd->scan_begin_src != TRIG_OTHER)
  1977. err++;
  1978. if (cmd->convert_src != TRIG_TIMER &&
  1979. cmd->convert_src != TRIG_EXT && cmd->convert_src != TRIG_NOW)
  1980. err++;
  1981. if (cmd->stop_src != TRIG_COUNT && cmd->stop_src != TRIG_NONE)
  1982. err++;
  1983. if (err)
  1984. return 2;
  1985. /* step 3: make sure arguments are trivially compatible */
  1986. if (cmd->start_src == TRIG_EXT) {
  1987. /* external trigger */
  1988. unsigned int tmp = CR_CHAN(cmd->start_arg);
  1989. if (tmp > 16)
  1990. tmp = 16;
  1991. tmp |= (cmd->start_arg & (CR_INVERT | CR_EDGE));
  1992. if (cmd->start_arg != tmp) {
  1993. cmd->start_arg = tmp;
  1994. err++;
  1995. }
  1996. } else {
  1997. if (cmd->start_arg != 0) {
  1998. /* true for both TRIG_NOW and TRIG_INT */
  1999. cmd->start_arg = 0;
  2000. err++;
  2001. }
  2002. }
  2003. if (cmd->scan_begin_src == TRIG_TIMER) {
  2004. if (cmd->scan_begin_arg < ni_min_ai_scan_period_ns(dev,
  2005. cmd->
  2006. chanlist_len))
  2007. {
  2008. cmd->scan_begin_arg =
  2009. ni_min_ai_scan_period_ns(dev, cmd->chanlist_len);
  2010. err++;
  2011. }
  2012. if (cmd->scan_begin_arg > devpriv->clock_ns * 0xffffff) {
  2013. cmd->scan_begin_arg = devpriv->clock_ns * 0xffffff;
  2014. err++;
  2015. }
  2016. } else if (cmd->scan_begin_src == TRIG_EXT) {
  2017. /* external trigger */
  2018. unsigned int tmp = CR_CHAN(cmd->scan_begin_arg);
  2019. if (tmp > 16)
  2020. tmp = 16;
  2021. tmp |= (cmd->scan_begin_arg & (CR_INVERT | CR_EDGE));
  2022. if (cmd->scan_begin_arg != tmp) {
  2023. cmd->scan_begin_arg = tmp;
  2024. err++;
  2025. }
  2026. } else { /* TRIG_OTHER */
  2027. if (cmd->scan_begin_arg) {
  2028. cmd->scan_begin_arg = 0;
  2029. err++;
  2030. }
  2031. }
  2032. if (cmd->convert_src == TRIG_TIMER) {
  2033. if ((boardtype.reg_type == ni_reg_611x)
  2034. || (boardtype.reg_type == ni_reg_6143)) {
  2035. if (cmd->convert_arg != 0) {
  2036. cmd->convert_arg = 0;
  2037. err++;
  2038. }
  2039. } else {
  2040. if (cmd->convert_arg < boardtype.ai_speed) {
  2041. cmd->convert_arg = boardtype.ai_speed;
  2042. err++;
  2043. }
  2044. if (cmd->convert_arg > devpriv->clock_ns * 0xffff) {
  2045. cmd->convert_arg = devpriv->clock_ns * 0xffff;
  2046. err++;
  2047. }
  2048. }
  2049. } else if (cmd->convert_src == TRIG_EXT) {
  2050. /* external trigger */
  2051. unsigned int tmp = CR_CHAN(cmd->convert_arg);
  2052. if (tmp > 16)
  2053. tmp = 16;
  2054. tmp |= (cmd->convert_arg & (CR_ALT_FILTER | CR_INVERT));
  2055. if (cmd->convert_arg != tmp) {
  2056. cmd->convert_arg = tmp;
  2057. err++;
  2058. }
  2059. } else if (cmd->convert_src == TRIG_NOW) {
  2060. if (cmd->convert_arg != 0) {
  2061. cmd->convert_arg = 0;
  2062. err++;
  2063. }
  2064. }
  2065. if (cmd->scan_end_arg != cmd->chanlist_len) {
  2066. cmd->scan_end_arg = cmd->chanlist_len;
  2067. err++;
  2068. }
  2069. if (cmd->stop_src == TRIG_COUNT) {
  2070. unsigned int max_count = 0x01000000;
  2071. if (boardtype.reg_type == ni_reg_611x)
  2072. max_count -= num_adc_stages_611x;
  2073. if (cmd->stop_arg > max_count) {
  2074. cmd->stop_arg = max_count;
  2075. err++;
  2076. }
  2077. if (cmd->stop_arg < 1) {
  2078. cmd->stop_arg = 1;
  2079. err++;
  2080. }
  2081. } else {
  2082. /* TRIG_NONE */
  2083. if (cmd->stop_arg != 0) {
  2084. cmd->stop_arg = 0;
  2085. err++;
  2086. }
  2087. }
  2088. if (err)
  2089. return 3;
  2090. /* step 4: fix up any arguments */
  2091. if (cmd->scan_begin_src == TRIG_TIMER) {
  2092. tmp = cmd->scan_begin_arg;
  2093. cmd->scan_begin_arg =
  2094. ni_timer_to_ns(dev, ni_ns_to_timer(dev,
  2095. cmd->scan_begin_arg,
  2096. cmd->
  2097. flags &
  2098. TRIG_ROUND_MASK));
  2099. if (tmp != cmd->scan_begin_arg)
  2100. err++;
  2101. }
  2102. if (cmd->convert_src == TRIG_TIMER) {
  2103. if ((boardtype.reg_type != ni_reg_611x)
  2104. && (boardtype.reg_type != ni_reg_6143)) {
  2105. tmp = cmd->convert_arg;
  2106. cmd->convert_arg =
  2107. ni_timer_to_ns(dev, ni_ns_to_timer(dev,
  2108. cmd->convert_arg,
  2109. cmd->
  2110. flags &
  2111. TRIG_ROUND_MASK));
  2112. if (tmp != cmd->convert_arg)
  2113. err++;
  2114. if (cmd->scan_begin_src == TRIG_TIMER &&
  2115. cmd->scan_begin_arg <
  2116. cmd->convert_arg * cmd->scan_end_arg) {
  2117. cmd->scan_begin_arg =
  2118. cmd->convert_arg * cmd->scan_end_arg;
  2119. err++;
  2120. }
  2121. }
  2122. }
  2123. if (err)
  2124. return 4;
  2125. return 0;
  2126. }
  2127. static int ni_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
  2128. {
  2129. const struct comedi_cmd *cmd = &s->async->cmd;
  2130. int timer;
  2131. int mode1 = 0; /* mode1 is needed for both stop and convert */
  2132. int mode2 = 0;
  2133. int start_stop_select = 0;
  2134. unsigned int stop_count;
  2135. int interrupt_a_enable = 0;
  2136. MDPRINTK("ni_ai_cmd\n");
  2137. if (dev->irq == 0) {
  2138. comedi_error(dev, "cannot run command without an irq");
  2139. return -EIO;
  2140. }
  2141. ni_clear_ai_fifo(dev);
  2142. ni_load_channelgain_list(dev, cmd->chanlist_len, cmd->chanlist);
  2143. /* start configuration */
  2144. devpriv->stc_writew(dev, AI_Configuration_Start, Joint_Reset_Register);
  2145. /* disable analog triggering for now, since it
  2146. * interferes with the use of pfi0 */
  2147. devpriv->an_trig_etc_reg &= ~Analog_Trigger_Enable;
  2148. devpriv->stc_writew(dev, devpriv->an_trig_etc_reg,
  2149. Analog_Trigger_Etc_Register);
  2150. switch (cmd->start_src) {
  2151. case TRIG_INT:
  2152. case TRIG_NOW:
  2153. devpriv->stc_writew(dev, AI_START2_Select(0) |
  2154. AI_START1_Sync | AI_START1_Edge |
  2155. AI_START1_Select(0),
  2156. AI_Trigger_Select_Register);
  2157. break;
  2158. case TRIG_EXT:
  2159. {
  2160. int chan = CR_CHAN(cmd->start_arg);
  2161. unsigned int bits = AI_START2_Select(0) |
  2162. AI_START1_Sync | AI_START1_Select(chan + 1);
  2163. if (cmd->start_arg & CR_INVERT)
  2164. bits |= AI_START1_Polarity;
  2165. if (cmd->start_arg & CR_EDGE)
  2166. bits |= AI_START1_Edge;
  2167. devpriv->stc_writew(dev, bits,
  2168. AI_Trigger_Select_Register);
  2169. break;
  2170. }
  2171. }
  2172. mode2 &= ~AI_Pre_Trigger;
  2173. mode2 &= ~AI_SC_Initial_Load_Source;
  2174. mode2 &= ~AI_SC_Reload_Mode;
  2175. devpriv->stc_writew(dev, mode2, AI_Mode_2_Register);
  2176. if (cmd->chanlist_len == 1 || (boardtype.reg_type == ni_reg_611x)
  2177. || (boardtype.reg_type == ni_reg_6143)) {
  2178. start_stop_select |= AI_STOP_Polarity;
  2179. start_stop_select |= AI_STOP_Select(31); /* logic low */
  2180. start_stop_select |= AI_STOP_Sync;
  2181. } else {
  2182. start_stop_select |= AI_STOP_Select(19); /* ai configuration memory */
  2183. }
  2184. devpriv->stc_writew(dev, start_stop_select,
  2185. AI_START_STOP_Select_Register);
  2186. devpriv->ai_cmd2 = 0;
  2187. switch (cmd->stop_src) {
  2188. case TRIG_COUNT:
  2189. stop_count = cmd->stop_arg - 1;
  2190. if (boardtype.reg_type == ni_reg_611x) {
  2191. /* have to take 3 stage adc pipeline into account */
  2192. stop_count += num_adc_stages_611x;
  2193. }
  2194. /* stage number of scans */
  2195. devpriv->stc_writel(dev, stop_count, AI_SC_Load_A_Registers);
  2196. mode1 |= AI_Start_Stop | AI_Mode_1_Reserved | AI_Trigger_Once;
  2197. devpriv->stc_writew(dev, mode1, AI_Mode_1_Register);
  2198. /* load SC (Scan Count) */
  2199. devpriv->stc_writew(dev, AI_SC_Load, AI_Command_1_Register);
  2200. devpriv->ai_continuous = 0;
  2201. if (stop_count == 0) {
  2202. devpriv->ai_cmd2 |= AI_End_On_End_Of_Scan;
  2203. interrupt_a_enable |= AI_STOP_Interrupt_Enable;
  2204. /* this is required to get the last sample for chanlist_len > 1, not sure why */
  2205. if (cmd->chanlist_len > 1)
  2206. start_stop_select |=
  2207. AI_STOP_Polarity | AI_STOP_Edge;
  2208. }
  2209. break;
  2210. case TRIG_NONE:
  2211. /* stage number of scans */
  2212. devpriv->stc_writel(dev, 0, AI_SC_Load_A_Registers);
  2213. mode1 |= AI_Start_Stop | AI_Mode_1_Reserved | AI_Continuous;
  2214. devpriv->stc_writew(dev, mode1, AI_Mode_1_Register);
  2215. /* load SC (Scan Count) */
  2216. devpriv->stc_writew(dev, AI_SC_Load, AI_Command_1_Register);
  2217. devpriv->ai_continuous = 1;
  2218. break;
  2219. }
  2220. switch (cmd->scan_begin_src) {
  2221. case TRIG_TIMER:
  2222. /*
  2223. stop bits for non 611x boards
  2224. AI_SI_Special_Trigger_Delay=0
  2225. AI_Pre_Trigger=0
  2226. AI_START_STOP_Select_Register:
  2227. AI_START_Polarity=0 (?) rising edge
  2228. AI_START_Edge=1 edge triggered
  2229. AI_START_Sync=1 (?)
  2230. AI_START_Select=0 SI_TC
  2231. AI_STOP_Polarity=0 rising edge
  2232. AI_STOP_Edge=0 level
  2233. AI_STOP_Sync=1
  2234. AI_STOP_Select=19 external pin (configuration mem)
  2235. */
  2236. start_stop_select |= AI_START_Edge | AI_START_Sync;
  2237. devpriv->stc_writew(dev, start_stop_select,
  2238. AI_START_STOP_Select_Register);
  2239. mode2 |= AI_SI_Reload_Mode(0);
  2240. /* AI_SI_Initial_Load_Source=A */
  2241. mode2 &= ~AI_SI_Initial_Load_Source;
  2242. /* mode2 |= AI_SC_Reload_Mode; */
  2243. devpriv->stc_writew(dev, mode2, AI_Mode_2_Register);
  2244. /* load SI */
  2245. timer = ni_ns_to_timer(dev, cmd->scan_begin_arg,
  2246. TRIG_ROUND_NEAREST);
  2247. devpriv->stc_writel(dev, timer, AI_SI_Load_A_Registers);
  2248. devpriv->stc_writew(dev, AI_SI_Load, AI_Command_1_Register);
  2249. break;
  2250. case TRIG_EXT:
  2251. if (cmd->scan_begin_arg & CR_EDGE)
  2252. start_stop_select |= AI_START_Edge;
  2253. /* AI_START_Polarity==1 is falling edge */
  2254. if (cmd->scan_begin_arg & CR_INVERT)
  2255. start_stop_select |= AI_START_Polarity;
  2256. if (cmd->scan_begin_src != cmd->convert_src ||
  2257. (cmd->scan_begin_arg & ~CR_EDGE) !=
  2258. (cmd->convert_arg & ~CR_EDGE))
  2259. start_stop_select |= AI_START_Sync;
  2260. start_stop_select |=
  2261. AI_START_Select(1 + CR_CHAN(cmd->scan_begin_arg));
  2262. devpriv->stc_writew(dev, start_stop_select,
  2263. AI_START_STOP_Select_Register);
  2264. break;
  2265. }
  2266. switch (cmd->convert_src) {
  2267. case TRIG_TIMER:
  2268. case TRIG_NOW:
  2269. if (cmd->convert_arg == 0 || cmd->convert_src == TRIG_NOW)
  2270. timer = 1;
  2271. else
  2272. timer = ni_ns_to_timer(dev, cmd->convert_arg,
  2273. TRIG_ROUND_NEAREST);
  2274. devpriv->stc_writew(dev, 1, AI_SI2_Load_A_Register); /* 0,0 does not work. */
  2275. devpriv->stc_writew(dev, timer, AI_SI2_Load_B_Register);
  2276. /* AI_SI2_Reload_Mode = alternate */
  2277. /* AI_SI2_Initial_Load_Source = A */
  2278. mode2 &= ~AI_SI2_Initial_Load_Source;
  2279. mode2 |= AI_SI2_Reload_Mode;
  2280. devpriv->stc_writew(dev, mode2, AI_Mode_2_Register);
  2281. /* AI_SI2_Load */
  2282. devpriv->stc_writew(dev, AI_SI2_Load, AI_Command_1_Register);
  2283. mode2 |= AI_SI2_Reload_Mode; /* alternate */
  2284. mode2 |= AI_SI2_Initial_Load_Source; /* B */
  2285. devpriv->stc_writew(dev, mode2, AI_Mode_2_Register);
  2286. break;
  2287. case TRIG_EXT:
  2288. mode1 |= AI_CONVERT_Source_Select(1 + cmd->convert_arg);
  2289. if ((cmd->convert_arg & CR_INVERT) == 0)
  2290. mode1 |= AI_CONVERT_Source_Polarity;
  2291. devpriv->stc_writew(dev, mode1, AI_Mode_1_Register);
  2292. mode2 |= AI_Start_Stop_Gate_Enable | AI_SC_Gate_Enable;
  2293. devpriv->stc_writew(dev, mode2, AI_Mode_2_Register);
  2294. break;
  2295. }
  2296. if (dev->irq) {
  2297. /* interrupt on FIFO, errors, SC_TC */
  2298. interrupt_a_enable |= AI_Error_Interrupt_Enable |
  2299. AI_SC_TC_Interrupt_Enable;
  2300. #ifndef PCIDMA
  2301. interrupt_a_enable |= AI_FIFO_Interrupt_Enable;
  2302. #endif
  2303. if (cmd->flags & TRIG_WAKE_EOS
  2304. || (devpriv->ai_cmd2 & AI_End_On_End_Of_Scan)) {
  2305. /* wake on end-of-scan */
  2306. devpriv->aimode = AIMODE_SCAN;
  2307. } else {
  2308. devpriv->aimode = AIMODE_HALF_FULL;
  2309. }
  2310. switch (devpriv->aimode) {
  2311. case AIMODE_HALF_FULL:
  2312. /*generate FIFO interrupts and DMA requests on half-full */
  2313. #ifdef PCIDMA
  2314. devpriv->stc_writew(dev, AI_FIFO_Mode_HF_to_E,
  2315. AI_Mode_3_Register);
  2316. #else
  2317. devpriv->stc_writew(dev, AI_FIFO_Mode_HF,
  2318. AI_Mode_3_Register);
  2319. #endif
  2320. break;
  2321. case AIMODE_SAMPLE:
  2322. /*generate FIFO interrupts on non-empty */
  2323. devpriv->stc_writew(dev, AI_FIFO_Mode_NE,
  2324. AI_Mode_3_Register);
  2325. break;
  2326. case AIMODE_SCAN:
  2327. #ifdef PCIDMA
  2328. devpriv->stc_writew(dev, AI_FIFO_Mode_NE,
  2329. AI_Mode_3_Register);
  2330. #else
  2331. devpriv->stc_writew(dev, AI_FIFO_Mode_HF,
  2332. AI_Mode_3_Register);
  2333. #endif
  2334. interrupt_a_enable |= AI_STOP_Interrupt_Enable;
  2335. break;
  2336. default:
  2337. break;
  2338. }
  2339. devpriv->stc_writew(dev, AI_Error_Interrupt_Ack | AI_STOP_Interrupt_Ack | AI_START_Interrupt_Ack | AI_START2_Interrupt_Ack | AI_START1_Interrupt_Ack | AI_SC_TC_Interrupt_Ack | AI_SC_TC_Error_Confirm, Interrupt_A_Ack_Register); /* clear interrupts */
  2340. ni_set_bits(dev, Interrupt_A_Enable_Register,
  2341. interrupt_a_enable, 1);
  2342. MDPRINTK("Interrupt_A_Enable_Register = 0x%04x\n",
  2343. devpriv->int_a_enable_reg);
  2344. } else {
  2345. /* interrupt on nothing */
  2346. ni_set_bits(dev, Interrupt_A_Enable_Register, ~0, 0);
  2347. /* XXX start polling if necessary */
  2348. MDPRINTK("interrupting on nothing\n");
  2349. }
  2350. /* end configuration */
  2351. devpriv->stc_writew(dev, AI_Configuration_End, Joint_Reset_Register);
  2352. switch (cmd->scan_begin_src) {
  2353. case TRIG_TIMER:
  2354. devpriv->stc_writew(dev,
  2355. AI_SI2_Arm | AI_SI_Arm | AI_DIV_Arm |
  2356. AI_SC_Arm, AI_Command_1_Register);
  2357. break;
  2358. case TRIG_EXT:
  2359. /* XXX AI_SI_Arm? */
  2360. devpriv->stc_writew(dev,
  2361. AI_SI2_Arm | AI_SI_Arm | AI_DIV_Arm |
  2362. AI_SC_Arm, AI_Command_1_Register);
  2363. break;
  2364. }
  2365. #ifdef PCIDMA
  2366. {
  2367. int retval = ni_ai_setup_MITE_dma(dev);
  2368. if (retval)
  2369. return retval;
  2370. }
  2371. /* mite_dump_regs(devpriv->mite); */
  2372. #endif
  2373. switch (cmd->start_src) {
  2374. case TRIG_NOW:
  2375. /* AI_START1_Pulse */
  2376. devpriv->stc_writew(dev, AI_START1_Pulse | devpriv->ai_cmd2,
  2377. AI_Command_2_Register);
  2378. s->async->inttrig = NULL;
  2379. break;
  2380. case TRIG_EXT:
  2381. s->async->inttrig = NULL;
  2382. break;
  2383. case TRIG_INT:
  2384. s->async->inttrig = &ni_ai_inttrig;
  2385. break;
  2386. }
  2387. MDPRINTK("exit ni_ai_cmd\n");
  2388. return 0;
  2389. }
  2390. static int ni_ai_inttrig(struct comedi_device *dev, struct comedi_subdevice *s,
  2391. unsigned int trignum)
  2392. {
  2393. if (trignum != 0)
  2394. return -EINVAL;
  2395. devpriv->stc_writew(dev, AI_START1_Pulse | devpriv->ai_cmd2,
  2396. AI_Command_2_Register);
  2397. s->async->inttrig = NULL;
  2398. return 1;
  2399. }
  2400. static int ni_ai_config_analog_trig(struct comedi_device *dev,
  2401. struct comedi_subdevice *s,
  2402. struct comedi_insn *insn,
  2403. unsigned int *data);
  2404. static int ni_ai_insn_config(struct comedi_device *dev,
  2405. struct comedi_subdevice *s,
  2406. struct comedi_insn *insn, unsigned int *data)
  2407. {
  2408. if (insn->n < 1)
  2409. return -EINVAL;
  2410. switch (data[0]) {
  2411. case INSN_CONFIG_ANALOG_TRIG:
  2412. return ni_ai_config_analog_trig(dev, s, insn, data);
  2413. case INSN_CONFIG_ALT_SOURCE:
  2414. if (boardtype.reg_type & ni_reg_m_series_mask) {
  2415. if (data[1] & ~(MSeries_AI_Bypass_Cal_Sel_Pos_Mask |
  2416. MSeries_AI_Bypass_Cal_Sel_Neg_Mask |
  2417. MSeries_AI_Bypass_Mode_Mux_Mask |
  2418. MSeries_AO_Bypass_AO_Cal_Sel_Mask)) {
  2419. return -EINVAL;
  2420. }
  2421. devpriv->ai_calib_source = data[1];
  2422. } else if (boardtype.reg_type == ni_reg_6143) {
  2423. unsigned int calib_source;
  2424. calib_source = data[1] & 0xf;
  2425. if (calib_source > 0xF)
  2426. return -EINVAL;
  2427. devpriv->ai_calib_source = calib_source;
  2428. ni_writew(calib_source, Calibration_Channel_6143);
  2429. } else {
  2430. unsigned int calib_source;
  2431. unsigned int calib_source_adjust;
  2432. calib_source = data[1] & 0xf;
  2433. calib_source_adjust = (data[1] >> 4) & 0xff;
  2434. if (calib_source >= 8)
  2435. return -EINVAL;
  2436. devpriv->ai_calib_source = calib_source;
  2437. if (boardtype.reg_type == ni_reg_611x) {
  2438. ni_writeb(calib_source_adjust,
  2439. Cal_Gain_Select_611x);
  2440. }
  2441. }
  2442. return 2;
  2443. default:
  2444. break;
  2445. }
  2446. return -EINVAL;
  2447. }
  2448. static int ni_ai_config_analog_trig(struct comedi_device *dev,
  2449. struct comedi_subdevice *s,
  2450. struct comedi_insn *insn,
  2451. unsigned int *data)
  2452. {
  2453. unsigned int a, b, modebits;
  2454. int err = 0;
  2455. /* data[1] is flags
  2456. * data[2] is analog line
  2457. * data[3] is set level
  2458. * data[4] is reset level */
  2459. if (!boardtype.has_analog_trig)
  2460. return -EINVAL;
  2461. if ((data[1] & 0xffff0000) != COMEDI_EV_SCAN_BEGIN) {
  2462. data[1] &= (COMEDI_EV_SCAN_BEGIN | 0xffff);
  2463. err++;
  2464. }
  2465. if (data[2] >= boardtype.n_adchan) {
  2466. data[2] = boardtype.n_adchan - 1;
  2467. err++;
  2468. }
  2469. if (data[3] > 255) { /* a */
  2470. data[3] = 255;
  2471. err++;
  2472. }
  2473. if (data[4] > 255) { /* b */
  2474. data[4] = 255;
  2475. err++;
  2476. }
  2477. /*
  2478. * 00 ignore
  2479. * 01 set
  2480. * 10 reset
  2481. *
  2482. * modes:
  2483. * 1 level: +b- +a-
  2484. * high mode 00 00 01 10
  2485. * low mode 00 00 10 01
  2486. * 2 level: (a<b)
  2487. * hysteresis low mode 10 00 00 01
  2488. * hysteresis high mode 01 00 00 10
  2489. * middle mode 10 01 01 10
  2490. */
  2491. a = data[3];
  2492. b = data[4];
  2493. modebits = data[1] & 0xff;
  2494. if (modebits & 0xf0) {
  2495. /* two level mode */
  2496. if (b < a) {
  2497. /* swap order */
  2498. a = data[4];
  2499. b = data[3];
  2500. modebits =
  2501. ((data[1] & 0xf) << 4) | ((data[1] & 0xf0) >> 4);
  2502. }
  2503. devpriv->atrig_low = a;
  2504. devpriv->atrig_high = b;
  2505. switch (modebits) {
  2506. case 0x81: /* low hysteresis mode */
  2507. devpriv->atrig_mode = 6;
  2508. break;
  2509. case 0x42: /* high hysteresis mode */
  2510. devpriv->atrig_mode = 3;
  2511. break;
  2512. case 0x96: /* middle window mode */
  2513. devpriv->atrig_mode = 2;
  2514. break;
  2515. default:
  2516. data[1] &= ~0xff;
  2517. err++;
  2518. }
  2519. } else {
  2520. /* one level mode */
  2521. if (b != 0) {
  2522. data[4] = 0;
  2523. err++;
  2524. }
  2525. switch (modebits) {
  2526. case 0x06: /* high window mode */
  2527. devpriv->atrig_high = a;
  2528. devpriv->atrig_mode = 0;
  2529. break;
  2530. case 0x09: /* low window mode */
  2531. devpriv->atrig_low = a;
  2532. devpriv->atrig_mode = 1;
  2533. break;
  2534. default:
  2535. data[1] &= ~0xff;
  2536. err++;
  2537. }
  2538. }
  2539. if (err)
  2540. return -EAGAIN;
  2541. return 5;
  2542. }
  2543. /* munge data from unsigned to 2's complement for analog output bipolar modes */
  2544. static void ni_ao_munge(struct comedi_device *dev, struct comedi_subdevice *s,
  2545. void *data, unsigned int num_bytes,
  2546. unsigned int chan_index)
  2547. {
  2548. struct comedi_async *async = s->async;
  2549. unsigned int range;
  2550. unsigned int i;
  2551. unsigned int offset;
  2552. unsigned int length = num_bytes / sizeof(short);
  2553. short *array = data;
  2554. offset = 1 << (boardtype.aobits - 1);
  2555. for (i = 0; i < length; i++) {
  2556. range = CR_RANGE(async->cmd.chanlist[chan_index]);
  2557. if (boardtype.ao_unipolar == 0 || (range & 1) == 0)
  2558. array[i] -= offset;
  2559. #ifdef PCIDMA
  2560. array[i] = cpu_to_le16(array[i]);
  2561. #endif
  2562. chan_index++;
  2563. chan_index %= async->cmd.chanlist_len;
  2564. }
  2565. }
  2566. static int ni_m_series_ao_config_chanlist(struct comedi_device *dev,
  2567. struct comedi_subdevice *s,
  2568. unsigned int chanspec[],
  2569. unsigned int n_chans, int timed)
  2570. {
  2571. unsigned int range;
  2572. unsigned int chan;
  2573. unsigned int conf;
  2574. int i;
  2575. int invert = 0;
  2576. if (timed) {
  2577. for (i = 0; i < boardtype.n_aochan; ++i) {
  2578. devpriv->ao_conf[i] &= ~MSeries_AO_Update_Timed_Bit;
  2579. ni_writeb(devpriv->ao_conf[i],
  2580. M_Offset_AO_Config_Bank(i));
  2581. ni_writeb(0xf, M_Offset_AO_Waveform_Order(i));
  2582. }
  2583. }
  2584. for (i = 0; i < n_chans; i++) {
  2585. const struct comedi_krange *krange;
  2586. chan = CR_CHAN(chanspec[i]);
  2587. range = CR_RANGE(chanspec[i]);
  2588. krange = s->range_table->range + range;
  2589. invert = 0;
  2590. conf = 0;
  2591. switch (krange->max - krange->min) {
  2592. case 20000000:
  2593. conf |= MSeries_AO_DAC_Reference_10V_Internal_Bits;
  2594. ni_writeb(0, M_Offset_AO_Reference_Attenuation(chan));
  2595. break;
  2596. case 10000000:
  2597. conf |= MSeries_AO_DAC_Reference_5V_Internal_Bits;
  2598. ni_writeb(0, M_Offset_AO_Reference_Attenuation(chan));
  2599. break;
  2600. case 4000000:
  2601. conf |= MSeries_AO_DAC_Reference_10V_Internal_Bits;
  2602. ni_writeb(MSeries_Attenuate_x5_Bit,
  2603. M_Offset_AO_Reference_Attenuation(chan));
  2604. break;
  2605. case 2000000:
  2606. conf |= MSeries_AO_DAC_Reference_5V_Internal_Bits;
  2607. ni_writeb(MSeries_Attenuate_x5_Bit,
  2608. M_Offset_AO_Reference_Attenuation(chan));
  2609. break;
  2610. default:
  2611. printk("%s: bug! unhandled ao reference voltage\n",
  2612. __func__);
  2613. break;
  2614. }
  2615. switch (krange->max + krange->min) {
  2616. case 0:
  2617. conf |= MSeries_AO_DAC_Offset_0V_Bits;
  2618. break;
  2619. case 10000000:
  2620. conf |= MSeries_AO_DAC_Offset_5V_Bits;
  2621. break;
  2622. default:
  2623. printk("%s: bug! unhandled ao offset voltage\n",
  2624. __func__);
  2625. break;
  2626. }
  2627. if (timed)
  2628. conf |= MSeries_AO_Update_Timed_Bit;
  2629. ni_writeb(conf, M_Offset_AO_Config_Bank(chan));
  2630. devpriv->ao_conf[chan] = conf;
  2631. ni_writeb(i, M_Offset_AO_Waveform_Order(chan));
  2632. }
  2633. return invert;
  2634. }
  2635. static int ni_old_ao_config_chanlist(struct comedi_device *dev,
  2636. struct comedi_subdevice *s,
  2637. unsigned int chanspec[],
  2638. unsigned int n_chans)
  2639. {
  2640. unsigned int range;
  2641. unsigned int chan;
  2642. unsigned int conf;
  2643. int i;
  2644. int invert = 0;
  2645. for (i = 0; i < n_chans; i++) {
  2646. chan = CR_CHAN(chanspec[i]);
  2647. range = CR_RANGE(chanspec[i]);
  2648. conf = AO_Channel(chan);
  2649. if (boardtype.ao_unipolar) {
  2650. if ((range & 1) == 0) {
  2651. conf |= AO_Bipolar;
  2652. invert = (1 << (boardtype.aobits - 1));
  2653. } else {
  2654. invert = 0;
  2655. }
  2656. if (range & 2)
  2657. conf |= AO_Ext_Ref;
  2658. } else {
  2659. conf |= AO_Bipolar;
  2660. invert = (1 << (boardtype.aobits - 1));
  2661. }
  2662. /* not all boards can deglitch, but this shouldn't hurt */
  2663. if (chanspec[i] & CR_DEGLITCH)
  2664. conf |= AO_Deglitch;
  2665. /* analog reference */
  2666. /* AREF_OTHER connects AO ground to AI ground, i think */
  2667. conf |= (CR_AREF(chanspec[i]) ==
  2668. AREF_OTHER) ? AO_Ground_Ref : 0;
  2669. ni_writew(conf, AO_Configuration);
  2670. devpriv->ao_conf[chan] = conf;
  2671. }
  2672. return invert;
  2673. }
  2674. static int ni_ao_config_chanlist(struct comedi_device *dev,
  2675. struct comedi_subdevice *s,
  2676. unsigned int chanspec[], unsigned int n_chans,
  2677. int timed)
  2678. {
  2679. if (boardtype.reg_type & ni_reg_m_series_mask)
  2680. return ni_m_series_ao_config_chanlist(dev, s, chanspec, n_chans,
  2681. timed);
  2682. else
  2683. return ni_old_ao_config_chanlist(dev, s, chanspec, n_chans);
  2684. }
  2685. static int ni_ao_insn_read(struct comedi_device *dev,
  2686. struct comedi_subdevice *s, struct comedi_insn *insn,
  2687. unsigned int *data)
  2688. {
  2689. data[0] = devpriv->ao[CR_CHAN(insn->chanspec)];
  2690. return 1;
  2691. }
  2692. static int ni_ao_insn_write(struct comedi_device *dev,
  2693. struct comedi_subdevice *s,
  2694. struct comedi_insn *insn, unsigned int *data)
  2695. {
  2696. unsigned int chan = CR_CHAN(insn->chanspec);
  2697. unsigned int invert;
  2698. invert = ni_ao_config_chanlist(dev, s, &insn->chanspec, 1, 0);
  2699. devpriv->ao[chan] = data[0];
  2700. if (boardtype.reg_type & ni_reg_m_series_mask) {
  2701. ni_writew(data[0], M_Offset_DAC_Direct_Data(chan));
  2702. } else
  2703. ni_writew(data[0] ^ invert,
  2704. (chan) ? DAC1_Direct_Data : DAC0_Direct_Data);
  2705. return 1;
  2706. }
  2707. static int ni_ao_insn_write_671x(struct comedi_device *dev,
  2708. struct comedi_subdevice *s,
  2709. struct comedi_insn *insn, unsigned int *data)
  2710. {
  2711. unsigned int chan = CR_CHAN(insn->chanspec);
  2712. unsigned int invert;
  2713. ao_win_out(1 << chan, AO_Immediate_671x);
  2714. invert = 1 << (boardtype.aobits - 1);
  2715. ni_ao_config_chanlist(dev, s, &insn->chanspec, 1, 0);
  2716. devpriv->ao[chan] = data[0];
  2717. ao_win_out(data[0] ^ invert, DACx_Direct_Data_671x(chan));
  2718. return 1;
  2719. }
  2720. static int ni_ao_insn_config(struct comedi_device *dev,
  2721. struct comedi_subdevice *s,
  2722. struct comedi_insn *insn, unsigned int *data)
  2723. {
  2724. switch (data[0]) {
  2725. case INSN_CONFIG_GET_HARDWARE_BUFFER_SIZE:
  2726. switch (data[1]) {
  2727. case COMEDI_OUTPUT:
  2728. data[2] = 1 + boardtype.ao_fifo_depth * sizeof(short);
  2729. if (devpriv->mite)
  2730. data[2] += devpriv->mite->fifo_size;
  2731. break;
  2732. case COMEDI_INPUT:
  2733. data[2] = 0;
  2734. break;
  2735. default:
  2736. return -EINVAL;
  2737. break;
  2738. }
  2739. return 0;
  2740. default:
  2741. break;
  2742. }
  2743. return -EINVAL;
  2744. }
  2745. static int ni_ao_inttrig(struct comedi_device *dev, struct comedi_subdevice *s,
  2746. unsigned int trignum)
  2747. {
  2748. int ret;
  2749. int interrupt_b_bits;
  2750. int i;
  2751. static const int timeout = 1000;
  2752. if (trignum != 0)
  2753. return -EINVAL;
  2754. /* Null trig at beginning prevent ao start trigger from executing more than
  2755. once per command (and doing things like trying to allocate the ao dma channel
  2756. multiple times) */
  2757. s->async->inttrig = NULL;
  2758. ni_set_bits(dev, Interrupt_B_Enable_Register,
  2759. AO_FIFO_Interrupt_Enable | AO_Error_Interrupt_Enable, 0);
  2760. interrupt_b_bits = AO_Error_Interrupt_Enable;
  2761. #ifdef PCIDMA
  2762. devpriv->stc_writew(dev, 1, DAC_FIFO_Clear);
  2763. if (boardtype.reg_type & ni_reg_6xxx_mask)
  2764. ni_ao_win_outl(dev, 0x6, AO_FIFO_Offset_Load_611x);
  2765. ret = ni_ao_setup_MITE_dma(dev);
  2766. if (ret)
  2767. return ret;
  2768. ret = ni_ao_wait_for_dma_load(dev);
  2769. if (ret < 0)
  2770. return ret;
  2771. #else
  2772. ret = ni_ao_prep_fifo(dev, s);
  2773. if (ret == 0)
  2774. return -EPIPE;
  2775. interrupt_b_bits |= AO_FIFO_Interrupt_Enable;
  2776. #endif
  2777. devpriv->stc_writew(dev, devpriv->ao_mode3 | AO_Not_An_UPDATE,
  2778. AO_Mode_3_Register);
  2779. devpriv->stc_writew(dev, devpriv->ao_mode3, AO_Mode_3_Register);
  2780. /* wait for DACs to be loaded */
  2781. for (i = 0; i < timeout; i++) {
  2782. udelay(1);
  2783. if ((devpriv->stc_readw(dev,
  2784. Joint_Status_2_Register) &
  2785. AO_TMRDACWRs_In_Progress_St) == 0)
  2786. break;
  2787. }
  2788. if (i == timeout) {
  2789. comedi_error(dev,
  2790. "timed out waiting for AO_TMRDACWRs_In_Progress_St to clear");
  2791. return -EIO;
  2792. }
  2793. /* stc manual says we are need to clear error interrupt after AO_TMRDACWRs_In_Progress_St clears */
  2794. devpriv->stc_writew(dev, AO_Error_Interrupt_Ack,
  2795. Interrupt_B_Ack_Register);
  2796. ni_set_bits(dev, Interrupt_B_Enable_Register, interrupt_b_bits, 1);
  2797. devpriv->stc_writew(dev,
  2798. devpriv->ao_cmd1 | AO_UI_Arm | AO_UC_Arm | AO_BC_Arm
  2799. | AO_DAC1_Update_Mode | AO_DAC0_Update_Mode,
  2800. AO_Command_1_Register);
  2801. devpriv->stc_writew(dev, devpriv->ao_cmd2 | AO_START1_Pulse,
  2802. AO_Command_2_Register);
  2803. return 0;
  2804. }
  2805. static int ni_ao_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
  2806. {
  2807. const struct comedi_cmd *cmd = &s->async->cmd;
  2808. int bits;
  2809. int i;
  2810. unsigned trigvar;
  2811. if (dev->irq == 0) {
  2812. comedi_error(dev, "cannot run command without an irq");
  2813. return -EIO;
  2814. }
  2815. devpriv->stc_writew(dev, AO_Configuration_Start, Joint_Reset_Register);
  2816. devpriv->stc_writew(dev, AO_Disarm, AO_Command_1_Register);
  2817. if (boardtype.reg_type & ni_reg_6xxx_mask) {
  2818. ao_win_out(CLEAR_WG, AO_Misc_611x);
  2819. bits = 0;
  2820. for (i = 0; i < cmd->chanlist_len; i++) {
  2821. int chan;
  2822. chan = CR_CHAN(cmd->chanlist[i]);
  2823. bits |= 1 << chan;
  2824. ao_win_out(chan, AO_Waveform_Generation_611x);
  2825. }
  2826. ao_win_out(bits, AO_Timed_611x);
  2827. }
  2828. ni_ao_config_chanlist(dev, s, cmd->chanlist, cmd->chanlist_len, 1);
  2829. if (cmd->stop_src == TRIG_NONE) {
  2830. devpriv->ao_mode1 |= AO_Continuous;
  2831. devpriv->ao_mode1 &= ~AO_Trigger_Once;
  2832. } else {
  2833. devpriv->ao_mode1 &= ~AO_Continuous;
  2834. devpriv->ao_mode1 |= AO_Trigger_Once;
  2835. }
  2836. devpriv->stc_writew(dev, devpriv->ao_mode1, AO_Mode_1_Register);
  2837. switch (cmd->start_src) {
  2838. case TRIG_INT:
  2839. case TRIG_NOW:
  2840. devpriv->ao_trigger_select &=
  2841. ~(AO_START1_Polarity | AO_START1_Select(-1));
  2842. devpriv->ao_trigger_select |= AO_START1_Edge | AO_START1_Sync;
  2843. devpriv->stc_writew(dev, devpriv->ao_trigger_select,
  2844. AO_Trigger_Select_Register);
  2845. break;
  2846. case TRIG_EXT:
  2847. devpriv->ao_trigger_select =
  2848. AO_START1_Select(CR_CHAN(cmd->start_arg) + 1);
  2849. if (cmd->start_arg & CR_INVERT)
  2850. devpriv->ao_trigger_select |= AO_START1_Polarity; /* 0=active high, 1=active low. see daq-stc 3-24 (p186) */
  2851. if (cmd->start_arg & CR_EDGE)
  2852. devpriv->ao_trigger_select |= AO_START1_Edge; /* 0=edge detection disabled, 1=enabled */
  2853. devpriv->stc_writew(dev, devpriv->ao_trigger_select,
  2854. AO_Trigger_Select_Register);
  2855. break;
  2856. default:
  2857. BUG();
  2858. break;
  2859. }
  2860. devpriv->ao_mode3 &= ~AO_Trigger_Length;
  2861. devpriv->stc_writew(dev, devpriv->ao_mode3, AO_Mode_3_Register);
  2862. devpriv->stc_writew(dev, devpriv->ao_mode1, AO_Mode_1_Register);
  2863. devpriv->ao_mode2 &= ~AO_BC_Initial_Load_Source;
  2864. devpriv->stc_writew(dev, devpriv->ao_mode2, AO_Mode_2_Register);
  2865. if (cmd->stop_src == TRIG_NONE) {
  2866. devpriv->stc_writel(dev, 0xffffff, AO_BC_Load_A_Register);
  2867. } else {
  2868. devpriv->stc_writel(dev, 0, AO_BC_Load_A_Register);
  2869. }
  2870. devpriv->stc_writew(dev, AO_BC_Load, AO_Command_1_Register);
  2871. devpriv->ao_mode2 &= ~AO_UC_Initial_Load_Source;
  2872. devpriv->stc_writew(dev, devpriv->ao_mode2, AO_Mode_2_Register);
  2873. switch (cmd->stop_src) {
  2874. case TRIG_COUNT:
  2875. if (boardtype.reg_type & ni_reg_m_series_mask) {
  2876. /* this is how the NI example code does it for m-series boards, verified correct with 6259 */
  2877. devpriv->stc_writel(dev, cmd->stop_arg - 1,
  2878. AO_UC_Load_A_Register);
  2879. devpriv->stc_writew(dev, AO_UC_Load,
  2880. AO_Command_1_Register);
  2881. } else {
  2882. devpriv->stc_writel(dev, cmd->stop_arg,
  2883. AO_UC_Load_A_Register);
  2884. devpriv->stc_writew(dev, AO_UC_Load,
  2885. AO_Command_1_Register);
  2886. devpriv->stc_writel(dev, cmd->stop_arg - 1,
  2887. AO_UC_Load_A_Register);
  2888. }
  2889. break;
  2890. case TRIG_NONE:
  2891. devpriv->stc_writel(dev, 0xffffff, AO_UC_Load_A_Register);
  2892. devpriv->stc_writew(dev, AO_UC_Load, AO_Command_1_Register);
  2893. devpriv->stc_writel(dev, 0xffffff, AO_UC_Load_A_Register);
  2894. break;
  2895. default:
  2896. devpriv->stc_writel(dev, 0, AO_UC_Load_A_Register);
  2897. devpriv->stc_writew(dev, AO_UC_Load, AO_Command_1_Register);
  2898. devpriv->stc_writel(dev, cmd->stop_arg, AO_UC_Load_A_Register);
  2899. }
  2900. devpriv->ao_mode1 &=
  2901. ~(AO_UI_Source_Select(0x1f) | AO_UI_Source_Polarity |
  2902. AO_UPDATE_Source_Select(0x1f) | AO_UPDATE_Source_Polarity);
  2903. switch (cmd->scan_begin_src) {
  2904. case TRIG_TIMER:
  2905. devpriv->ao_cmd2 &= ~AO_BC_Gate_Enable;
  2906. trigvar =
  2907. ni_ns_to_timer(dev, cmd->scan_begin_arg,
  2908. TRIG_ROUND_NEAREST);
  2909. devpriv->stc_writel(dev, 1, AO_UI_Load_A_Register);
  2910. devpriv->stc_writew(dev, AO_UI_Load, AO_Command_1_Register);
  2911. devpriv->stc_writel(dev, trigvar, AO_UI_Load_A_Register);
  2912. break;
  2913. case TRIG_EXT:
  2914. devpriv->ao_mode1 |=
  2915. AO_UPDATE_Source_Select(cmd->scan_begin_arg);
  2916. if (cmd->scan_begin_arg & CR_INVERT)
  2917. devpriv->ao_mode1 |= AO_UPDATE_Source_Polarity;
  2918. devpriv->ao_cmd2 |= AO_BC_Gate_Enable;
  2919. break;
  2920. default:
  2921. BUG();
  2922. break;
  2923. }
  2924. devpriv->stc_writew(dev, devpriv->ao_cmd2, AO_Command_2_Register);
  2925. devpriv->stc_writew(dev, devpriv->ao_mode1, AO_Mode_1_Register);
  2926. devpriv->ao_mode2 &=
  2927. ~(AO_UI_Reload_Mode(3) | AO_UI_Initial_Load_Source);
  2928. devpriv->stc_writew(dev, devpriv->ao_mode2, AO_Mode_2_Register);
  2929. if (cmd->scan_end_arg > 1) {
  2930. devpriv->ao_mode1 |= AO_Multiple_Channels;
  2931. devpriv->stc_writew(dev,
  2932. AO_Number_Of_Channels(cmd->scan_end_arg -
  2933. 1) |
  2934. AO_UPDATE_Output_Select
  2935. (AO_Update_Output_High_Z),
  2936. AO_Output_Control_Register);
  2937. } else {
  2938. unsigned bits;
  2939. devpriv->ao_mode1 &= ~AO_Multiple_Channels;
  2940. bits = AO_UPDATE_Output_Select(AO_Update_Output_High_Z);
  2941. if (boardtype.
  2942. reg_type & (ni_reg_m_series_mask | ni_reg_6xxx_mask)) {
  2943. bits |= AO_Number_Of_Channels(0);
  2944. } else {
  2945. bits |=
  2946. AO_Number_Of_Channels(CR_CHAN(cmd->chanlist[0]));
  2947. }
  2948. devpriv->stc_writew(dev, bits, AO_Output_Control_Register);
  2949. }
  2950. devpriv->stc_writew(dev, devpriv->ao_mode1, AO_Mode_1_Register);
  2951. devpriv->stc_writew(dev, AO_DAC0_Update_Mode | AO_DAC1_Update_Mode,
  2952. AO_Command_1_Register);
  2953. devpriv->ao_mode3 |= AO_Stop_On_Overrun_Error;
  2954. devpriv->stc_writew(dev, devpriv->ao_mode3, AO_Mode_3_Register);
  2955. devpriv->ao_mode2 &= ~AO_FIFO_Mode_Mask;
  2956. #ifdef PCIDMA
  2957. devpriv->ao_mode2 |= AO_FIFO_Mode_HF_to_F;
  2958. #else
  2959. devpriv->ao_mode2 |= AO_FIFO_Mode_HF;
  2960. #endif
  2961. devpriv->ao_mode2 &= ~AO_FIFO_Retransmit_Enable;
  2962. devpriv->stc_writew(dev, devpriv->ao_mode2, AO_Mode_2_Register);
  2963. bits = AO_BC_Source_Select | AO_UPDATE_Pulse_Width |
  2964. AO_TMRDACWR_Pulse_Width;
  2965. if (boardtype.ao_fifo_depth)
  2966. bits |= AO_FIFO_Enable;
  2967. else
  2968. bits |= AO_DMA_PIO_Control;
  2969. #if 0
  2970. /* F Hess: windows driver does not set AO_Number_Of_DAC_Packages bit for 6281,
  2971. verified with bus analyzer. */
  2972. if (boardtype.reg_type & ni_reg_m_series_mask)
  2973. bits |= AO_Number_Of_DAC_Packages;
  2974. #endif
  2975. devpriv->stc_writew(dev, bits, AO_Personal_Register);
  2976. /* enable sending of ao dma requests */
  2977. devpriv->stc_writew(dev, AO_AOFREQ_Enable, AO_Start_Select_Register);
  2978. devpriv->stc_writew(dev, AO_Configuration_End, Joint_Reset_Register);
  2979. if (cmd->stop_src == TRIG_COUNT) {
  2980. devpriv->stc_writew(dev, AO_BC_TC_Interrupt_Ack,
  2981. Interrupt_B_Ack_Register);
  2982. ni_set_bits(dev, Interrupt_B_Enable_Register,
  2983. AO_BC_TC_Interrupt_Enable, 1);
  2984. }
  2985. s->async->inttrig = &ni_ao_inttrig;
  2986. return 0;
  2987. }
  2988. static int ni_ao_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s,
  2989. struct comedi_cmd *cmd)
  2990. {
  2991. int err = 0;
  2992. int tmp;
  2993. /* step 1: make sure trigger sources are trivially valid */
  2994. if ((cmd->flags & CMDF_WRITE) == 0) {
  2995. cmd->flags |= CMDF_WRITE;
  2996. }
  2997. tmp = cmd->start_src;
  2998. cmd->start_src &= TRIG_INT | TRIG_EXT;
  2999. if (!cmd->start_src || tmp != cmd->start_src)
  3000. err++;
  3001. tmp = cmd->scan_begin_src;
  3002. cmd->scan_begin_src &= TRIG_TIMER | TRIG_EXT;
  3003. if (!cmd->scan_begin_src || tmp != cmd->scan_begin_src)
  3004. err++;
  3005. tmp = cmd->convert_src;
  3006. cmd->convert_src &= TRIG_NOW;
  3007. if (!cmd->convert_src || tmp != cmd->convert_src)
  3008. err++;
  3009. tmp = cmd->scan_end_src;
  3010. cmd->scan_end_src &= TRIG_COUNT;
  3011. if (!cmd->scan_end_src || tmp != cmd->scan_end_src)
  3012. err++;
  3013. tmp = cmd->stop_src;
  3014. cmd->stop_src &= TRIG_COUNT | TRIG_NONE;
  3015. if (!cmd->stop_src || tmp != cmd->stop_src)
  3016. err++;
  3017. if (err)
  3018. return 1;
  3019. /* step 2: make sure trigger sources are unique and mutually compatible */
  3020. if (cmd->stop_src != TRIG_COUNT && cmd->stop_src != TRIG_NONE)
  3021. err++;
  3022. if (err)
  3023. return 2;
  3024. /* step 3: make sure arguments are trivially compatible */
  3025. if (cmd->start_src == TRIG_EXT) {
  3026. /* external trigger */
  3027. unsigned int tmp = CR_CHAN(cmd->start_arg);
  3028. if (tmp > 18)
  3029. tmp = 18;
  3030. tmp |= (cmd->start_arg & (CR_INVERT | CR_EDGE));
  3031. if (cmd->start_arg != tmp) {
  3032. cmd->start_arg = tmp;
  3033. err++;
  3034. }
  3035. } else {
  3036. if (cmd->start_arg != 0) {
  3037. /* true for both TRIG_NOW and TRIG_INT */
  3038. cmd->start_arg = 0;
  3039. err++;
  3040. }
  3041. }
  3042. if (cmd->scan_begin_src == TRIG_TIMER) {
  3043. if (cmd->scan_begin_arg < boardtype.ao_speed) {
  3044. cmd->scan_begin_arg = boardtype.ao_speed;
  3045. err++;
  3046. }
  3047. if (cmd->scan_begin_arg > devpriv->clock_ns * 0xffffff) { /* XXX check */
  3048. cmd->scan_begin_arg = devpriv->clock_ns * 0xffffff;
  3049. err++;
  3050. }
  3051. }
  3052. if (cmd->convert_arg != 0) {
  3053. cmd->convert_arg = 0;
  3054. err++;
  3055. }
  3056. if (cmd->scan_end_arg != cmd->chanlist_len) {
  3057. cmd->scan_end_arg = cmd->chanlist_len;
  3058. err++;
  3059. }
  3060. if (cmd->stop_src == TRIG_COUNT) { /* XXX check */
  3061. if (cmd->stop_arg > 0x00ffffff) {
  3062. cmd->stop_arg = 0x00ffffff;
  3063. err++;
  3064. }
  3065. } else {
  3066. /* TRIG_NONE */
  3067. if (cmd->stop_arg != 0) {
  3068. cmd->stop_arg = 0;
  3069. err++;
  3070. }
  3071. }
  3072. if (err)
  3073. return 3;
  3074. /* step 4: fix up any arguments */
  3075. if (cmd->scan_begin_src == TRIG_TIMER) {
  3076. tmp = cmd->scan_begin_arg;
  3077. cmd->scan_begin_arg =
  3078. ni_timer_to_ns(dev, ni_ns_to_timer(dev,
  3079. cmd->scan_begin_arg,
  3080. cmd->
  3081. flags &
  3082. TRIG_ROUND_MASK));
  3083. if (tmp != cmd->scan_begin_arg)
  3084. err++;
  3085. }
  3086. if (err)
  3087. return 4;
  3088. /* step 5: fix up chanlist */
  3089. if (err)
  3090. return 5;
  3091. return 0;
  3092. }
  3093. static int ni_ao_reset(struct comedi_device *dev, struct comedi_subdevice *s)
  3094. {
  3095. /* devpriv->ao0p=0x0000; */
  3096. /* ni_writew(devpriv->ao0p,AO_Configuration); */
  3097. /* devpriv->ao1p=AO_Channel(1); */
  3098. /* ni_writew(devpriv->ao1p,AO_Configuration); */
  3099. ni_release_ao_mite_channel(dev);
  3100. devpriv->stc_writew(dev, AO_Configuration_Start, Joint_Reset_Register);
  3101. devpriv->stc_writew(dev, AO_Disarm, AO_Command_1_Register);
  3102. ni_set_bits(dev, Interrupt_B_Enable_Register, ~0, 0);
  3103. devpriv->stc_writew(dev, AO_BC_Source_Select, AO_Personal_Register);
  3104. devpriv->stc_writew(dev, 0x3f98, Interrupt_B_Ack_Register);
  3105. devpriv->stc_writew(dev, AO_BC_Source_Select | AO_UPDATE_Pulse_Width |
  3106. AO_TMRDACWR_Pulse_Width, AO_Personal_Register);
  3107. devpriv->stc_writew(dev, 0, AO_Output_Control_Register);
  3108. devpriv->stc_writew(dev, 0, AO_Start_Select_Register);
  3109. devpriv->ao_cmd1 = 0;
  3110. devpriv->stc_writew(dev, devpriv->ao_cmd1, AO_Command_1_Register);
  3111. devpriv->ao_cmd2 = 0;
  3112. devpriv->stc_writew(dev, devpriv->ao_cmd2, AO_Command_2_Register);
  3113. devpriv->ao_mode1 = 0;
  3114. devpriv->stc_writew(dev, devpriv->ao_mode1, AO_Mode_1_Register);
  3115. devpriv->ao_mode2 = 0;
  3116. devpriv->stc_writew(dev, devpriv->ao_mode2, AO_Mode_2_Register);
  3117. if (boardtype.reg_type & ni_reg_m_series_mask)
  3118. devpriv->ao_mode3 = AO_Last_Gate_Disable;
  3119. else
  3120. devpriv->ao_mode3 = 0;
  3121. devpriv->stc_writew(dev, devpriv->ao_mode3, AO_Mode_3_Register);
  3122. devpriv->ao_trigger_select = 0;
  3123. devpriv->stc_writew(dev, devpriv->ao_trigger_select,
  3124. AO_Trigger_Select_Register);
  3125. if (boardtype.reg_type & ni_reg_6xxx_mask) {
  3126. unsigned immediate_bits = 0;
  3127. unsigned i;
  3128. for (i = 0; i < s->n_chan; ++i) {
  3129. immediate_bits |= 1 << i;
  3130. }
  3131. ao_win_out(immediate_bits, AO_Immediate_671x);
  3132. ao_win_out(CLEAR_WG, AO_Misc_611x);
  3133. }
  3134. devpriv->stc_writew(dev, AO_Configuration_End, Joint_Reset_Register);
  3135. return 0;
  3136. }
  3137. /* digital io */
  3138. static int ni_dio_insn_config(struct comedi_device *dev,
  3139. struct comedi_subdevice *s,
  3140. struct comedi_insn *insn, unsigned int *data)
  3141. {
  3142. #ifdef DEBUG_DIO
  3143. printk("ni_dio_insn_config() chan=%d io=%d\n",
  3144. CR_CHAN(insn->chanspec), data[0]);
  3145. #endif
  3146. switch (data[0]) {
  3147. case INSN_CONFIG_DIO_OUTPUT:
  3148. s->io_bits |= 1 << CR_CHAN(insn->chanspec);
  3149. break;
  3150. case INSN_CONFIG_DIO_INPUT:
  3151. s->io_bits &= ~(1 << CR_CHAN(insn->chanspec));
  3152. break;
  3153. case INSN_CONFIG_DIO_QUERY:
  3154. data[1] =
  3155. (s->
  3156. io_bits & (1 << CR_CHAN(insn->chanspec))) ? COMEDI_OUTPUT :
  3157. COMEDI_INPUT;
  3158. return insn->n;
  3159. break;
  3160. default:
  3161. return -EINVAL;
  3162. }
  3163. devpriv->dio_control &= ~DIO_Pins_Dir_Mask;
  3164. devpriv->dio_control |= DIO_Pins_Dir(s->io_bits);
  3165. devpriv->stc_writew(dev, devpriv->dio_control, DIO_Control_Register);
  3166. return 1;
  3167. }
  3168. static int ni_dio_insn_bits(struct comedi_device *dev,
  3169. struct comedi_subdevice *s,
  3170. struct comedi_insn *insn, unsigned int *data)
  3171. {
  3172. #ifdef DEBUG_DIO
  3173. printk("ni_dio_insn_bits() mask=0x%x bits=0x%x\n", data[0], data[1]);
  3174. #endif
  3175. if (insn->n != 2)
  3176. return -EINVAL;
  3177. if (data[0]) {
  3178. /* Perform check to make sure we're not using the
  3179. serial part of the dio */
  3180. if ((data[0] & (DIO_SDIN | DIO_SDOUT))
  3181. && devpriv->serial_interval_ns)
  3182. return -EBUSY;
  3183. s->state &= ~data[0];
  3184. s->state |= (data[0] & data[1]);
  3185. devpriv->dio_output &= ~DIO_Parallel_Data_Mask;
  3186. devpriv->dio_output |= DIO_Parallel_Data_Out(s->state);
  3187. devpriv->stc_writew(dev, devpriv->dio_output,
  3188. DIO_Output_Register);
  3189. }
  3190. data[1] = devpriv->stc_readw(dev, DIO_Parallel_Input_Register);
  3191. return 2;
  3192. }
  3193. static int ni_m_series_dio_insn_config(struct comedi_device *dev,
  3194. struct comedi_subdevice *s,
  3195. struct comedi_insn *insn,
  3196. unsigned int *data)
  3197. {
  3198. #ifdef DEBUG_DIO
  3199. printk("ni_m_series_dio_insn_config() chan=%d io=%d\n",
  3200. CR_CHAN(insn->chanspec), data[0]);
  3201. #endif
  3202. switch (data[0]) {
  3203. case INSN_CONFIG_DIO_OUTPUT:
  3204. s->io_bits |= 1 << CR_CHAN(insn->chanspec);
  3205. break;
  3206. case INSN_CONFIG_DIO_INPUT:
  3207. s->io_bits &= ~(1 << CR_CHAN(insn->chanspec));
  3208. break;
  3209. case INSN_CONFIG_DIO_QUERY:
  3210. data[1] =
  3211. (s->
  3212. io_bits & (1 << CR_CHAN(insn->chanspec))) ? COMEDI_OUTPUT :
  3213. COMEDI_INPUT;
  3214. return insn->n;
  3215. break;
  3216. default:
  3217. return -EINVAL;
  3218. }
  3219. ni_writel(s->io_bits, M_Offset_DIO_Direction);
  3220. return 1;
  3221. }
  3222. static int ni_m_series_dio_insn_bits(struct comedi_device *dev,
  3223. struct comedi_subdevice *s,
  3224. struct comedi_insn *insn,
  3225. unsigned int *data)
  3226. {
  3227. #ifdef DEBUG_DIO
  3228. printk("ni_m_series_dio_insn_bits() mask=0x%x bits=0x%x\n", data[0],
  3229. data[1]);
  3230. #endif
  3231. if (insn->n != 2)
  3232. return -EINVAL;
  3233. if (data[0]) {
  3234. s->state &= ~data[0];
  3235. s->state |= (data[0] & data[1]);
  3236. ni_writel(s->state, M_Offset_Static_Digital_Output);
  3237. }
  3238. data[1] = ni_readl(M_Offset_Static_Digital_Input);
  3239. return 2;
  3240. }
  3241. static int ni_cdio_cmdtest(struct comedi_device *dev,
  3242. struct comedi_subdevice *s, struct comedi_cmd *cmd)
  3243. {
  3244. int err = 0;
  3245. int tmp;
  3246. int sources;
  3247. unsigned i;
  3248. /* step 1: make sure trigger sources are trivially valid */
  3249. tmp = cmd->start_src;
  3250. sources = TRIG_INT;
  3251. cmd->start_src &= sources;
  3252. if (!cmd->start_src || tmp != cmd->start_src)
  3253. err++;
  3254. tmp = cmd->scan_begin_src;
  3255. cmd->scan_begin_src &= TRIG_EXT;
  3256. if (!cmd->scan_begin_src || tmp != cmd->scan_begin_src)
  3257. err++;
  3258. tmp = cmd->convert_src;
  3259. cmd->convert_src &= TRIG_NOW;
  3260. if (!cmd->convert_src || tmp != cmd->convert_src)
  3261. err++;
  3262. tmp = cmd->scan_end_src;
  3263. cmd->scan_end_src &= TRIG_COUNT;
  3264. if (!cmd->scan_end_src || tmp != cmd->scan_end_src)
  3265. err++;
  3266. tmp = cmd->stop_src;
  3267. cmd->stop_src &= TRIG_NONE;
  3268. if (!cmd->stop_src || tmp != cmd->stop_src)
  3269. err++;
  3270. if (err)
  3271. return 1;
  3272. /* step 2: make sure trigger sources are unique... */
  3273. if (cmd->start_src != TRIG_INT)
  3274. err++;
  3275. if (cmd->scan_begin_src != TRIG_EXT)
  3276. err++;
  3277. if (cmd->convert_src != TRIG_NOW)
  3278. err++;
  3279. if (cmd->stop_src != TRIG_NONE)
  3280. err++;
  3281. /* ... and mutually compatible */
  3282. if (err)
  3283. return 2;
  3284. /* step 3: make sure arguments are trivially compatible */
  3285. if (cmd->start_src == TRIG_INT) {
  3286. if (cmd->start_arg != 0) {
  3287. cmd->start_arg = 0;
  3288. err++;
  3289. }
  3290. }
  3291. if (cmd->scan_begin_src == TRIG_EXT) {
  3292. tmp = cmd->scan_begin_arg;
  3293. tmp &= CR_PACK_FLAGS(CDO_Sample_Source_Select_Mask, 0, 0,
  3294. CR_INVERT);
  3295. if (tmp != cmd->scan_begin_arg) {
  3296. err++;
  3297. }
  3298. }
  3299. if (cmd->convert_src == TRIG_NOW) {
  3300. if (cmd->convert_arg) {
  3301. cmd->convert_arg = 0;
  3302. err++;
  3303. }
  3304. }
  3305. if (cmd->scan_end_arg != cmd->chanlist_len) {
  3306. cmd->scan_end_arg = cmd->chanlist_len;
  3307. err++;
  3308. }
  3309. if (cmd->stop_src == TRIG_NONE) {
  3310. if (cmd->stop_arg != 0) {
  3311. cmd->stop_arg = 0;
  3312. err++;
  3313. }
  3314. }
  3315. if (err)
  3316. return 3;
  3317. /* step 4: fix up any arguments */
  3318. if (err)
  3319. return 4;
  3320. /* step 5: check chanlist */
  3321. for (i = 0; i < cmd->chanlist_len; ++i) {
  3322. if (cmd->chanlist[i] != i)
  3323. err = 1;
  3324. }
  3325. if (err)
  3326. return 5;
  3327. return 0;
  3328. }
  3329. static int ni_cdio_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
  3330. {
  3331. const struct comedi_cmd *cmd = &s->async->cmd;
  3332. unsigned cdo_mode_bits = CDO_FIFO_Mode_Bit | CDO_Halt_On_Error_Bit;
  3333. int retval;
  3334. ni_writel(CDO_Reset_Bit, M_Offset_CDIO_Command);
  3335. switch (cmd->scan_begin_src) {
  3336. case TRIG_EXT:
  3337. cdo_mode_bits |=
  3338. CR_CHAN(cmd->scan_begin_arg) &
  3339. CDO_Sample_Source_Select_Mask;
  3340. break;
  3341. default:
  3342. BUG();
  3343. break;
  3344. }
  3345. if (cmd->scan_begin_arg & CR_INVERT)
  3346. cdo_mode_bits |= CDO_Polarity_Bit;
  3347. ni_writel(cdo_mode_bits, M_Offset_CDO_Mode);
  3348. if (s->io_bits) {
  3349. ni_writel(s->state, M_Offset_CDO_FIFO_Data);
  3350. ni_writel(CDO_SW_Update_Bit, M_Offset_CDIO_Command);
  3351. ni_writel(s->io_bits, M_Offset_CDO_Mask_Enable);
  3352. } else {
  3353. comedi_error(dev,
  3354. "attempted to run digital output command with no lines configured as outputs");
  3355. return -EIO;
  3356. }
  3357. retval = ni_request_cdo_mite_channel(dev);
  3358. if (retval < 0) {
  3359. return retval;
  3360. }
  3361. s->async->inttrig = &ni_cdo_inttrig;
  3362. return 0;
  3363. }
  3364. static int ni_cdo_inttrig(struct comedi_device *dev, struct comedi_subdevice *s,
  3365. unsigned int trignum)
  3366. {
  3367. #ifdef PCIDMA
  3368. unsigned long flags;
  3369. #endif
  3370. int retval = 0;
  3371. unsigned i;
  3372. const unsigned timeout = 1000;
  3373. s->async->inttrig = NULL;
  3374. /* read alloc the entire buffer */
  3375. comedi_buf_read_alloc(s->async, s->async->prealloc_bufsz);
  3376. #ifdef PCIDMA
  3377. spin_lock_irqsave(&devpriv->mite_channel_lock, flags);
  3378. if (devpriv->cdo_mite_chan) {
  3379. mite_prep_dma(devpriv->cdo_mite_chan, 32, 32);
  3380. mite_dma_arm(devpriv->cdo_mite_chan);
  3381. } else {
  3382. comedi_error(dev, "BUG: no cdo mite channel?");
  3383. retval = -EIO;
  3384. }
  3385. spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
  3386. if (retval < 0)
  3387. return retval;
  3388. #endif
  3389. /*
  3390. * XXX not sure what interrupt C group does
  3391. * ni_writeb(Interrupt_Group_C_Enable_Bit,
  3392. * M_Offset_Interrupt_C_Enable); wait for dma to fill output fifo
  3393. */
  3394. for (i = 0; i < timeout; ++i) {
  3395. if (ni_readl(M_Offset_CDIO_Status) & CDO_FIFO_Full_Bit)
  3396. break;
  3397. udelay(10);
  3398. }
  3399. if (i == timeout) {
  3400. comedi_error(dev, "dma failed to fill cdo fifo!");
  3401. ni_cdio_cancel(dev, s);
  3402. return -EIO;
  3403. }
  3404. ni_writel(CDO_Arm_Bit | CDO_Error_Interrupt_Enable_Set_Bit |
  3405. CDO_Empty_FIFO_Interrupt_Enable_Set_Bit,
  3406. M_Offset_CDIO_Command);
  3407. return retval;
  3408. }
  3409. static int ni_cdio_cancel(struct comedi_device *dev, struct comedi_subdevice *s)
  3410. {
  3411. ni_writel(CDO_Disarm_Bit | CDO_Error_Interrupt_Enable_Clear_Bit |
  3412. CDO_Empty_FIFO_Interrupt_Enable_Clear_Bit |
  3413. CDO_FIFO_Request_Interrupt_Enable_Clear_Bit,
  3414. M_Offset_CDIO_Command);
  3415. /*
  3416. * XXX not sure what interrupt C group does ni_writeb(0,
  3417. * M_Offset_Interrupt_C_Enable);
  3418. */
  3419. ni_writel(0, M_Offset_CDO_Mask_Enable);
  3420. ni_release_cdo_mite_channel(dev);
  3421. return 0;
  3422. }
  3423. static void handle_cdio_interrupt(struct comedi_device *dev)
  3424. {
  3425. unsigned cdio_status;
  3426. struct comedi_subdevice *s = dev->subdevices + NI_DIO_SUBDEV;
  3427. #ifdef PCIDMA
  3428. unsigned long flags;
  3429. #endif
  3430. if ((boardtype.reg_type & ni_reg_m_series_mask) == 0) {
  3431. return;
  3432. }
  3433. #ifdef PCIDMA
  3434. spin_lock_irqsave(&devpriv->mite_channel_lock, flags);
  3435. if (devpriv->cdo_mite_chan) {
  3436. unsigned cdo_mite_status =
  3437. mite_get_status(devpriv->cdo_mite_chan);
  3438. if (cdo_mite_status & CHSR_LINKC) {
  3439. writel(CHOR_CLRLC,
  3440. devpriv->mite->mite_io_addr +
  3441. MITE_CHOR(devpriv->cdo_mite_chan->channel));
  3442. }
  3443. mite_sync_output_dma(devpriv->cdo_mite_chan, s->async);
  3444. }
  3445. spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
  3446. #endif
  3447. cdio_status = ni_readl(M_Offset_CDIO_Status);
  3448. if (cdio_status & (CDO_Overrun_Bit | CDO_Underflow_Bit)) {
  3449. /* printk("cdio error: statux=0x%x\n", cdio_status); */
  3450. ni_writel(CDO_Error_Interrupt_Confirm_Bit, M_Offset_CDIO_Command); /* XXX just guessing this is needed and does something useful */
  3451. s->async->events |= COMEDI_CB_OVERFLOW;
  3452. }
  3453. if (cdio_status & CDO_FIFO_Empty_Bit) {
  3454. /* printk("cdio fifo empty\n"); */
  3455. ni_writel(CDO_Empty_FIFO_Interrupt_Enable_Clear_Bit,
  3456. M_Offset_CDIO_Command);
  3457. /* s->async->events |= COMEDI_CB_EOA; */
  3458. }
  3459. ni_event(dev, s);
  3460. }
  3461. static int ni_serial_insn_config(struct comedi_device *dev,
  3462. struct comedi_subdevice *s,
  3463. struct comedi_insn *insn, unsigned int *data)
  3464. {
  3465. int err = insn->n;
  3466. unsigned char byte_out, byte_in = 0;
  3467. if (insn->n != 2)
  3468. return -EINVAL;
  3469. switch (data[0]) {
  3470. case INSN_CONFIG_SERIAL_CLOCK:
  3471. #ifdef DEBUG_DIO
  3472. printk("SPI serial clock Config cd\n", data[1]);
  3473. #endif
  3474. devpriv->serial_hw_mode = 1;
  3475. devpriv->dio_control |= DIO_HW_Serial_Enable;
  3476. if (data[1] == SERIAL_DISABLED) {
  3477. devpriv->serial_hw_mode = 0;
  3478. devpriv->dio_control &= ~(DIO_HW_Serial_Enable |
  3479. DIO_Software_Serial_Control);
  3480. data[1] = SERIAL_DISABLED;
  3481. devpriv->serial_interval_ns = data[1];
  3482. } else if (data[1] <= SERIAL_600NS) {
  3483. /* Warning: this clock speed is too fast to reliably
  3484. control SCXI. */
  3485. devpriv->dio_control &= ~DIO_HW_Serial_Timebase;
  3486. devpriv->clock_and_fout |= Slow_Internal_Timebase;
  3487. devpriv->clock_and_fout &= ~DIO_Serial_Out_Divide_By_2;
  3488. data[1] = SERIAL_600NS;
  3489. devpriv->serial_interval_ns = data[1];
  3490. } else if (data[1] <= SERIAL_1_2US) {
  3491. devpriv->dio_control &= ~DIO_HW_Serial_Timebase;
  3492. devpriv->clock_and_fout |= Slow_Internal_Timebase |
  3493. DIO_Serial_Out_Divide_By_2;
  3494. data[1] = SERIAL_1_2US;
  3495. devpriv->serial_interval_ns = data[1];
  3496. } else if (data[1] <= SERIAL_10US) {
  3497. devpriv->dio_control |= DIO_HW_Serial_Timebase;
  3498. devpriv->clock_and_fout |= Slow_Internal_Timebase |
  3499. DIO_Serial_Out_Divide_By_2;
  3500. /* Note: DIO_Serial_Out_Divide_By_2 only affects
  3501. 600ns/1.2us. If you turn divide_by_2 off with the
  3502. slow clock, you will still get 10us, except then
  3503. all your delays are wrong. */
  3504. data[1] = SERIAL_10US;
  3505. devpriv->serial_interval_ns = data[1];
  3506. } else {
  3507. devpriv->dio_control &= ~(DIO_HW_Serial_Enable |
  3508. DIO_Software_Serial_Control);
  3509. devpriv->serial_hw_mode = 0;
  3510. data[1] = (data[1] / 1000) * 1000;
  3511. devpriv->serial_interval_ns = data[1];
  3512. }
  3513. devpriv->stc_writew(dev, devpriv->dio_control,
  3514. DIO_Control_Register);
  3515. devpriv->stc_writew(dev, devpriv->clock_and_fout,
  3516. Clock_and_FOUT_Register);
  3517. return 1;
  3518. break;
  3519. case INSN_CONFIG_BIDIRECTIONAL_DATA:
  3520. if (devpriv->serial_interval_ns == 0) {
  3521. return -EINVAL;
  3522. }
  3523. byte_out = data[1] & 0xFF;
  3524. if (devpriv->serial_hw_mode) {
  3525. err = ni_serial_hw_readwrite8(dev, s, byte_out,
  3526. &byte_in);
  3527. } else if (devpriv->serial_interval_ns > 0) {
  3528. err = ni_serial_sw_readwrite8(dev, s, byte_out,
  3529. &byte_in);
  3530. } else {
  3531. printk("ni_serial_insn_config: serial disabled!\n");
  3532. return -EINVAL;
  3533. }
  3534. if (err < 0)
  3535. return err;
  3536. data[1] = byte_in & 0xFF;
  3537. return insn->n;
  3538. break;
  3539. default:
  3540. return -EINVAL;
  3541. }
  3542. }
  3543. static int ni_serial_hw_readwrite8(struct comedi_device *dev,
  3544. struct comedi_subdevice *s,
  3545. unsigned char data_out,
  3546. unsigned char *data_in)
  3547. {
  3548. unsigned int status1;
  3549. int err = 0, count = 20;
  3550. #ifdef DEBUG_DIO
  3551. printk("ni_serial_hw_readwrite8: outputting 0x%x\n", data_out);
  3552. #endif
  3553. devpriv->dio_output &= ~DIO_Serial_Data_Mask;
  3554. devpriv->dio_output |= DIO_Serial_Data_Out(data_out);
  3555. devpriv->stc_writew(dev, devpriv->dio_output, DIO_Output_Register);
  3556. status1 = devpriv->stc_readw(dev, Joint_Status_1_Register);
  3557. if (status1 & DIO_Serial_IO_In_Progress_St) {
  3558. err = -EBUSY;
  3559. goto Error;
  3560. }
  3561. devpriv->dio_control |= DIO_HW_Serial_Start;
  3562. devpriv->stc_writew(dev, devpriv->dio_control, DIO_Control_Register);
  3563. devpriv->dio_control &= ~DIO_HW_Serial_Start;
  3564. /* Wait until STC says we're done, but don't loop infinitely. */
  3565. while ((status1 =
  3566. devpriv->stc_readw(dev,
  3567. Joint_Status_1_Register)) &
  3568. DIO_Serial_IO_In_Progress_St) {
  3569. /* Delay one bit per loop */
  3570. udelay((devpriv->serial_interval_ns + 999) / 1000);
  3571. if (--count < 0) {
  3572. printk
  3573. ("ni_serial_hw_readwrite8: SPI serial I/O didn't finish in time!\n");
  3574. err = -ETIME;
  3575. goto Error;
  3576. }
  3577. }
  3578. /* Delay for last bit. This delay is absolutely necessary, because
  3579. DIO_Serial_IO_In_Progress_St goes high one bit too early. */
  3580. udelay((devpriv->serial_interval_ns + 999) / 1000);
  3581. if (data_in != NULL) {
  3582. *data_in = devpriv->stc_readw(dev, DIO_Serial_Input_Register);
  3583. #ifdef DEBUG_DIO
  3584. printk("ni_serial_hw_readwrite8: inputted 0x%x\n", *data_in);
  3585. #endif
  3586. }
  3587. Error:
  3588. devpriv->stc_writew(dev, devpriv->dio_control, DIO_Control_Register);
  3589. return err;
  3590. }
  3591. static int ni_serial_sw_readwrite8(struct comedi_device *dev,
  3592. struct comedi_subdevice *s,
  3593. unsigned char data_out,
  3594. unsigned char *data_in)
  3595. {
  3596. unsigned char mask, input = 0;
  3597. #ifdef DEBUG_DIO
  3598. printk("ni_serial_sw_readwrite8: outputting 0x%x\n", data_out);
  3599. #endif
  3600. /* Wait for one bit before transfer */
  3601. udelay((devpriv->serial_interval_ns + 999) / 1000);
  3602. for (mask = 0x80; mask; mask >>= 1) {
  3603. /* Output current bit; note that we cannot touch s->state
  3604. because it is a per-subdevice field, and serial is
  3605. a separate subdevice from DIO. */
  3606. devpriv->dio_output &= ~DIO_SDOUT;
  3607. if (data_out & mask) {
  3608. devpriv->dio_output |= DIO_SDOUT;
  3609. }
  3610. devpriv->stc_writew(dev, devpriv->dio_output,
  3611. DIO_Output_Register);
  3612. /* Assert SDCLK (active low, inverted), wait for half of
  3613. the delay, deassert SDCLK, and wait for the other half. */
  3614. devpriv->dio_control |= DIO_Software_Serial_Control;
  3615. devpriv->stc_writew(dev, devpriv->dio_control,
  3616. DIO_Control_Register);
  3617. udelay((devpriv->serial_interval_ns + 999) / 2000);
  3618. devpriv->dio_control &= ~DIO_Software_Serial_Control;
  3619. devpriv->stc_writew(dev, devpriv->dio_control,
  3620. DIO_Control_Register);
  3621. udelay((devpriv->serial_interval_ns + 999) / 2000);
  3622. /* Input current bit */
  3623. if (devpriv->stc_readw(dev,
  3624. DIO_Parallel_Input_Register) & DIO_SDIN)
  3625. {
  3626. /* printk("DIO_P_I_R: 0x%x\n", devpriv->stc_readw(dev, DIO_Parallel_Input_Register)); */
  3627. input |= mask;
  3628. }
  3629. }
  3630. #ifdef DEBUG_DIO
  3631. printk("ni_serial_sw_readwrite8: inputted 0x%x\n", input);
  3632. #endif
  3633. if (data_in)
  3634. *data_in = input;
  3635. return 0;
  3636. }
  3637. static void mio_common_detach(struct comedi_device *dev)
  3638. {
  3639. if (dev->private) {
  3640. if (devpriv->counter_dev) {
  3641. ni_gpct_device_destroy(devpriv->counter_dev);
  3642. }
  3643. }
  3644. if (dev->subdevices && boardtype.has_8255)
  3645. subdev_8255_cleanup(dev, dev->subdevices + NI_8255_DIO_SUBDEV);
  3646. }
  3647. static void init_ao_67xx(struct comedi_device *dev, struct comedi_subdevice *s)
  3648. {
  3649. int i;
  3650. for (i = 0; i < s->n_chan; i++) {
  3651. ni_ao_win_outw(dev, AO_Channel(i) | 0x0,
  3652. AO_Configuration_2_67xx);
  3653. }
  3654. ao_win_out(0x0, AO_Later_Single_Point_Updates);
  3655. }
  3656. static unsigned ni_gpct_to_stc_register(enum ni_gpct_register reg)
  3657. {
  3658. unsigned stc_register;
  3659. switch (reg) {
  3660. case NITIO_G0_Autoincrement_Reg:
  3661. stc_register = G_Autoincrement_Register(0);
  3662. break;
  3663. case NITIO_G1_Autoincrement_Reg:
  3664. stc_register = G_Autoincrement_Register(1);
  3665. break;
  3666. case NITIO_G0_Command_Reg:
  3667. stc_register = G_Command_Register(0);
  3668. break;
  3669. case NITIO_G1_Command_Reg:
  3670. stc_register = G_Command_Register(1);
  3671. break;
  3672. case NITIO_G0_HW_Save_Reg:
  3673. stc_register = G_HW_Save_Register(0);
  3674. break;
  3675. case NITIO_G1_HW_Save_Reg:
  3676. stc_register = G_HW_Save_Register(1);
  3677. break;
  3678. case NITIO_G0_SW_Save_Reg:
  3679. stc_register = G_Save_Register(0);
  3680. break;
  3681. case NITIO_G1_SW_Save_Reg:
  3682. stc_register = G_Save_Register(1);
  3683. break;
  3684. case NITIO_G0_Mode_Reg:
  3685. stc_register = G_Mode_Register(0);
  3686. break;
  3687. case NITIO_G1_Mode_Reg:
  3688. stc_register = G_Mode_Register(1);
  3689. break;
  3690. case NITIO_G0_LoadA_Reg:
  3691. stc_register = G_Load_A_Register(0);
  3692. break;
  3693. case NITIO_G1_LoadA_Reg:
  3694. stc_register = G_Load_A_Register(1);
  3695. break;
  3696. case NITIO_G0_LoadB_Reg:
  3697. stc_register = G_Load_B_Register(0);
  3698. break;
  3699. case NITIO_G1_LoadB_Reg:
  3700. stc_register = G_Load_B_Register(1);
  3701. break;
  3702. case NITIO_G0_Input_Select_Reg:
  3703. stc_register = G_Input_Select_Register(0);
  3704. break;
  3705. case NITIO_G1_Input_Select_Reg:
  3706. stc_register = G_Input_Select_Register(1);
  3707. break;
  3708. case NITIO_G01_Status_Reg:
  3709. stc_register = G_Status_Register;
  3710. break;
  3711. case NITIO_G01_Joint_Reset_Reg:
  3712. stc_register = Joint_Reset_Register;
  3713. break;
  3714. case NITIO_G01_Joint_Status1_Reg:
  3715. stc_register = Joint_Status_1_Register;
  3716. break;
  3717. case NITIO_G01_Joint_Status2_Reg:
  3718. stc_register = Joint_Status_2_Register;
  3719. break;
  3720. case NITIO_G0_Interrupt_Acknowledge_Reg:
  3721. stc_register = Interrupt_A_Ack_Register;
  3722. break;
  3723. case NITIO_G1_Interrupt_Acknowledge_Reg:
  3724. stc_register = Interrupt_B_Ack_Register;
  3725. break;
  3726. case NITIO_G0_Status_Reg:
  3727. stc_register = AI_Status_1_Register;
  3728. break;
  3729. case NITIO_G1_Status_Reg:
  3730. stc_register = AO_Status_1_Register;
  3731. break;
  3732. case NITIO_G0_Interrupt_Enable_Reg:
  3733. stc_register = Interrupt_A_Enable_Register;
  3734. break;
  3735. case NITIO_G1_Interrupt_Enable_Reg:
  3736. stc_register = Interrupt_B_Enable_Register;
  3737. break;
  3738. default:
  3739. printk("%s: unhandled register 0x%x in switch.\n",
  3740. __func__, reg);
  3741. BUG();
  3742. return 0;
  3743. break;
  3744. }
  3745. return stc_register;
  3746. }
  3747. static void ni_gpct_write_register(struct ni_gpct *counter, unsigned bits,
  3748. enum ni_gpct_register reg)
  3749. {
  3750. struct comedi_device *dev = counter->counter_dev->dev;
  3751. unsigned stc_register;
  3752. /* bits in the join reset register which are relevant to counters */
  3753. static const unsigned gpct_joint_reset_mask = G0_Reset | G1_Reset;
  3754. static const unsigned gpct_interrupt_a_enable_mask =
  3755. G0_Gate_Interrupt_Enable | G0_TC_Interrupt_Enable;
  3756. static const unsigned gpct_interrupt_b_enable_mask =
  3757. G1_Gate_Interrupt_Enable | G1_TC_Interrupt_Enable;
  3758. switch (reg) {
  3759. /* m-series-only registers */
  3760. case NITIO_G0_Counting_Mode_Reg:
  3761. ni_writew(bits, M_Offset_G0_Counting_Mode);
  3762. break;
  3763. case NITIO_G1_Counting_Mode_Reg:
  3764. ni_writew(bits, M_Offset_G1_Counting_Mode);
  3765. break;
  3766. case NITIO_G0_Second_Gate_Reg:
  3767. ni_writew(bits, M_Offset_G0_Second_Gate);
  3768. break;
  3769. case NITIO_G1_Second_Gate_Reg:
  3770. ni_writew(bits, M_Offset_G1_Second_Gate);
  3771. break;
  3772. case NITIO_G0_DMA_Config_Reg:
  3773. ni_writew(bits, M_Offset_G0_DMA_Config);
  3774. break;
  3775. case NITIO_G1_DMA_Config_Reg:
  3776. ni_writew(bits, M_Offset_G1_DMA_Config);
  3777. break;
  3778. case NITIO_G0_ABZ_Reg:
  3779. ni_writew(bits, M_Offset_G0_MSeries_ABZ);
  3780. break;
  3781. case NITIO_G1_ABZ_Reg:
  3782. ni_writew(bits, M_Offset_G1_MSeries_ABZ);
  3783. break;
  3784. /* 32 bit registers */
  3785. case NITIO_G0_LoadA_Reg:
  3786. case NITIO_G1_LoadA_Reg:
  3787. case NITIO_G0_LoadB_Reg:
  3788. case NITIO_G1_LoadB_Reg:
  3789. stc_register = ni_gpct_to_stc_register(reg);
  3790. devpriv->stc_writel(dev, bits, stc_register);
  3791. break;
  3792. /* 16 bit registers */
  3793. case NITIO_G0_Interrupt_Enable_Reg:
  3794. BUG_ON(bits & ~gpct_interrupt_a_enable_mask);
  3795. ni_set_bitfield(dev, Interrupt_A_Enable_Register,
  3796. gpct_interrupt_a_enable_mask, bits);
  3797. break;
  3798. case NITIO_G1_Interrupt_Enable_Reg:
  3799. BUG_ON(bits & ~gpct_interrupt_b_enable_mask);
  3800. ni_set_bitfield(dev, Interrupt_B_Enable_Register,
  3801. gpct_interrupt_b_enable_mask, bits);
  3802. break;
  3803. case NITIO_G01_Joint_Reset_Reg:
  3804. BUG_ON(bits & ~gpct_joint_reset_mask);
  3805. /* fall-through */
  3806. default:
  3807. stc_register = ni_gpct_to_stc_register(reg);
  3808. devpriv->stc_writew(dev, bits, stc_register);
  3809. }
  3810. }
  3811. static unsigned ni_gpct_read_register(struct ni_gpct *counter,
  3812. enum ni_gpct_register reg)
  3813. {
  3814. struct comedi_device *dev = counter->counter_dev->dev;
  3815. unsigned stc_register;
  3816. switch (reg) {
  3817. /* m-series only registers */
  3818. case NITIO_G0_DMA_Status_Reg:
  3819. return ni_readw(M_Offset_G0_DMA_Status);
  3820. break;
  3821. case NITIO_G1_DMA_Status_Reg:
  3822. return ni_readw(M_Offset_G1_DMA_Status);
  3823. break;
  3824. /* 32 bit registers */
  3825. case NITIO_G0_HW_Save_Reg:
  3826. case NITIO_G1_HW_Save_Reg:
  3827. case NITIO_G0_SW_Save_Reg:
  3828. case NITIO_G1_SW_Save_Reg:
  3829. stc_register = ni_gpct_to_stc_register(reg);
  3830. return devpriv->stc_readl(dev, stc_register);
  3831. break;
  3832. /* 16 bit registers */
  3833. default:
  3834. stc_register = ni_gpct_to_stc_register(reg);
  3835. return devpriv->stc_readw(dev, stc_register);
  3836. break;
  3837. }
  3838. return 0;
  3839. }
  3840. static int ni_freq_out_insn_read(struct comedi_device *dev,
  3841. struct comedi_subdevice *s,
  3842. struct comedi_insn *insn, unsigned int *data)
  3843. {
  3844. data[0] = devpriv->clock_and_fout & FOUT_Divider_mask;
  3845. return 1;
  3846. }
  3847. static int ni_freq_out_insn_write(struct comedi_device *dev,
  3848. struct comedi_subdevice *s,
  3849. struct comedi_insn *insn, unsigned int *data)
  3850. {
  3851. devpriv->clock_and_fout &= ~FOUT_Enable;
  3852. devpriv->stc_writew(dev, devpriv->clock_and_fout,
  3853. Clock_and_FOUT_Register);
  3854. devpriv->clock_and_fout &= ~FOUT_Divider_mask;
  3855. devpriv->clock_and_fout |= FOUT_Divider(data[0]);
  3856. devpriv->clock_and_fout |= FOUT_Enable;
  3857. devpriv->stc_writew(dev, devpriv->clock_and_fout,
  3858. Clock_and_FOUT_Register);
  3859. return insn->n;
  3860. }
  3861. static int ni_set_freq_out_clock(struct comedi_device *dev,
  3862. unsigned int clock_source)
  3863. {
  3864. switch (clock_source) {
  3865. case NI_FREQ_OUT_TIMEBASE_1_DIV_2_CLOCK_SRC:
  3866. devpriv->clock_and_fout &= ~FOUT_Timebase_Select;
  3867. break;
  3868. case NI_FREQ_OUT_TIMEBASE_2_CLOCK_SRC:
  3869. devpriv->clock_and_fout |= FOUT_Timebase_Select;
  3870. break;
  3871. default:
  3872. return -EINVAL;
  3873. }
  3874. devpriv->stc_writew(dev, devpriv->clock_and_fout,
  3875. Clock_and_FOUT_Register);
  3876. return 3;
  3877. }
  3878. static void ni_get_freq_out_clock(struct comedi_device *dev,
  3879. unsigned int *clock_source,
  3880. unsigned int *clock_period_ns)
  3881. {
  3882. if (devpriv->clock_and_fout & FOUT_Timebase_Select) {
  3883. *clock_source = NI_FREQ_OUT_TIMEBASE_2_CLOCK_SRC;
  3884. *clock_period_ns = TIMEBASE_2_NS;
  3885. } else {
  3886. *clock_source = NI_FREQ_OUT_TIMEBASE_1_DIV_2_CLOCK_SRC;
  3887. *clock_period_ns = TIMEBASE_1_NS * 2;
  3888. }
  3889. }
  3890. static int ni_freq_out_insn_config(struct comedi_device *dev,
  3891. struct comedi_subdevice *s,
  3892. struct comedi_insn *insn, unsigned int *data)
  3893. {
  3894. switch (data[0]) {
  3895. case INSN_CONFIG_SET_CLOCK_SRC:
  3896. return ni_set_freq_out_clock(dev, data[1]);
  3897. break;
  3898. case INSN_CONFIG_GET_CLOCK_SRC:
  3899. ni_get_freq_out_clock(dev, &data[1], &data[2]);
  3900. return 3;
  3901. default:
  3902. break;
  3903. }
  3904. return -EINVAL;
  3905. }
  3906. static int ni_alloc_private(struct comedi_device *dev)
  3907. {
  3908. int ret;
  3909. ret = alloc_private(dev, sizeof(struct ni_private));
  3910. if (ret < 0)
  3911. return ret;
  3912. spin_lock_init(&devpriv->window_lock);
  3913. spin_lock_init(&devpriv->soft_reg_copy_lock);
  3914. spin_lock_init(&devpriv->mite_channel_lock);
  3915. return 0;
  3916. };
  3917. static int ni_E_init(struct comedi_device *dev, struct comedi_devconfig *it)
  3918. {
  3919. struct comedi_subdevice *s;
  3920. unsigned j;
  3921. enum ni_gpct_variant counter_variant;
  3922. if (boardtype.n_aochan > MAX_N_AO_CHAN) {
  3923. printk("bug! boardtype.n_aochan > MAX_N_AO_CHAN\n");
  3924. return -EINVAL;
  3925. }
  3926. if (alloc_subdevices(dev, NI_NUM_SUBDEVICES) < 0)
  3927. return -ENOMEM;
  3928. /* analog input subdevice */
  3929. s = dev->subdevices + NI_AI_SUBDEV;
  3930. dev->read_subdev = s;
  3931. if (boardtype.n_adchan) {
  3932. s->type = COMEDI_SUBD_AI;
  3933. s->subdev_flags =
  3934. SDF_READABLE | SDF_DIFF | SDF_DITHER | SDF_CMD_READ;
  3935. if (boardtype.reg_type != ni_reg_611x)
  3936. s->subdev_flags |= SDF_GROUND | SDF_COMMON | SDF_OTHER;
  3937. if (boardtype.adbits > 16)
  3938. s->subdev_flags |= SDF_LSAMPL;
  3939. if (boardtype.reg_type & ni_reg_m_series_mask)
  3940. s->subdev_flags |= SDF_SOFT_CALIBRATED;
  3941. s->n_chan = boardtype.n_adchan;
  3942. s->len_chanlist = 512;
  3943. s->maxdata = (1 << boardtype.adbits) - 1;
  3944. s->range_table = ni_range_lkup[boardtype.gainlkup];
  3945. s->insn_read = &ni_ai_insn_read;
  3946. s->insn_config = &ni_ai_insn_config;
  3947. s->do_cmdtest = &ni_ai_cmdtest;
  3948. s->do_cmd = &ni_ai_cmd;
  3949. s->cancel = &ni_ai_reset;
  3950. s->poll = &ni_ai_poll;
  3951. s->munge = &ni_ai_munge;
  3952. #ifdef PCIDMA
  3953. s->async_dma_dir = DMA_FROM_DEVICE;
  3954. #endif
  3955. } else {
  3956. s->type = COMEDI_SUBD_UNUSED;
  3957. }
  3958. /* analog output subdevice */
  3959. s = dev->subdevices + NI_AO_SUBDEV;
  3960. if (boardtype.n_aochan) {
  3961. s->type = COMEDI_SUBD_AO;
  3962. s->subdev_flags = SDF_WRITABLE | SDF_DEGLITCH | SDF_GROUND;
  3963. if (boardtype.reg_type & ni_reg_m_series_mask)
  3964. s->subdev_flags |= SDF_SOFT_CALIBRATED;
  3965. s->n_chan = boardtype.n_aochan;
  3966. s->maxdata = (1 << boardtype.aobits) - 1;
  3967. s->range_table = boardtype.ao_range_table;
  3968. s->insn_read = &ni_ao_insn_read;
  3969. if (boardtype.reg_type & ni_reg_6xxx_mask) {
  3970. s->insn_write = &ni_ao_insn_write_671x;
  3971. } else {
  3972. s->insn_write = &ni_ao_insn_write;
  3973. }
  3974. s->insn_config = &ni_ao_insn_config;
  3975. #ifdef PCIDMA
  3976. if (boardtype.n_aochan) {
  3977. s->async_dma_dir = DMA_TO_DEVICE;
  3978. #else
  3979. if (boardtype.ao_fifo_depth) {
  3980. #endif
  3981. dev->write_subdev = s;
  3982. s->subdev_flags |= SDF_CMD_WRITE;
  3983. s->do_cmd = &ni_ao_cmd;
  3984. s->do_cmdtest = &ni_ao_cmdtest;
  3985. s->len_chanlist = boardtype.n_aochan;
  3986. if ((boardtype.reg_type & ni_reg_m_series_mask) == 0)
  3987. s->munge = ni_ao_munge;
  3988. }
  3989. s->cancel = &ni_ao_reset;
  3990. } else {
  3991. s->type = COMEDI_SUBD_UNUSED;
  3992. }
  3993. if ((boardtype.reg_type & ni_reg_67xx_mask))
  3994. init_ao_67xx(dev, s);
  3995. /* digital i/o subdevice */
  3996. s = dev->subdevices + NI_DIO_SUBDEV;
  3997. s->type = COMEDI_SUBD_DIO;
  3998. s->subdev_flags = SDF_WRITABLE | SDF_READABLE;
  3999. s->maxdata = 1;
  4000. s->io_bits = 0; /* all bits input */
  4001. s->range_table = &range_digital;
  4002. s->n_chan = boardtype.num_p0_dio_channels;
  4003. if (boardtype.reg_type & ni_reg_m_series_mask) {
  4004. s->subdev_flags |=
  4005. SDF_LSAMPL | SDF_CMD_WRITE /* | SDF_CMD_READ */ ;
  4006. s->insn_bits = &ni_m_series_dio_insn_bits;
  4007. s->insn_config = &ni_m_series_dio_insn_config;
  4008. s->do_cmd = &ni_cdio_cmd;
  4009. s->do_cmdtest = &ni_cdio_cmdtest;
  4010. s->cancel = &ni_cdio_cancel;
  4011. s->async_dma_dir = DMA_BIDIRECTIONAL;
  4012. s->len_chanlist = s->n_chan;
  4013. ni_writel(CDO_Reset_Bit | CDI_Reset_Bit, M_Offset_CDIO_Command);
  4014. ni_writel(s->io_bits, M_Offset_DIO_Direction);
  4015. } else {
  4016. s->insn_bits = &ni_dio_insn_bits;
  4017. s->insn_config = &ni_dio_insn_config;
  4018. devpriv->dio_control = DIO_Pins_Dir(s->io_bits);
  4019. ni_writew(devpriv->dio_control, DIO_Control_Register);
  4020. }
  4021. /* 8255 device */
  4022. s = dev->subdevices + NI_8255_DIO_SUBDEV;
  4023. if (boardtype.has_8255) {
  4024. subdev_8255_init(dev, s, ni_8255_callback, (unsigned long)dev);
  4025. } else {
  4026. s->type = COMEDI_SUBD_UNUSED;
  4027. }
  4028. /* formerly general purpose counter/timer device, but no longer used */
  4029. s = dev->subdevices + NI_UNUSED_SUBDEV;
  4030. s->type = COMEDI_SUBD_UNUSED;
  4031. /* calibration subdevice -- ai and ao */
  4032. s = dev->subdevices + NI_CALIBRATION_SUBDEV;
  4033. s->type = COMEDI_SUBD_CALIB;
  4034. if (boardtype.reg_type & ni_reg_m_series_mask) {
  4035. /* internal PWM analog output used for AI nonlinearity calibration */
  4036. s->subdev_flags = SDF_INTERNAL;
  4037. s->insn_config = &ni_m_series_pwm_config;
  4038. s->n_chan = 1;
  4039. s->maxdata = 0;
  4040. ni_writel(0x0, M_Offset_Cal_PWM);
  4041. } else if (boardtype.reg_type == ni_reg_6143) {
  4042. /* internal PWM analog output used for AI nonlinearity calibration */
  4043. s->subdev_flags = SDF_INTERNAL;
  4044. s->insn_config = &ni_6143_pwm_config;
  4045. s->n_chan = 1;
  4046. s->maxdata = 0;
  4047. } else {
  4048. s->subdev_flags = SDF_WRITABLE | SDF_INTERNAL;
  4049. s->insn_read = &ni_calib_insn_read;
  4050. s->insn_write = &ni_calib_insn_write;
  4051. caldac_setup(dev, s);
  4052. }
  4053. /* EEPROM */
  4054. s = dev->subdevices + NI_EEPROM_SUBDEV;
  4055. s->type = COMEDI_SUBD_MEMORY;
  4056. s->subdev_flags = SDF_READABLE | SDF_INTERNAL;
  4057. s->maxdata = 0xff;
  4058. if (boardtype.reg_type & ni_reg_m_series_mask) {
  4059. s->n_chan = M_SERIES_EEPROM_SIZE;
  4060. s->insn_read = &ni_m_series_eeprom_insn_read;
  4061. } else {
  4062. s->n_chan = 512;
  4063. s->insn_read = &ni_eeprom_insn_read;
  4064. }
  4065. /* PFI */
  4066. s = dev->subdevices + NI_PFI_DIO_SUBDEV;
  4067. s->type = COMEDI_SUBD_DIO;
  4068. s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL;
  4069. if (boardtype.reg_type & ni_reg_m_series_mask) {
  4070. unsigned i;
  4071. s->n_chan = 16;
  4072. ni_writew(s->state, M_Offset_PFI_DO);
  4073. for (i = 0; i < NUM_PFI_OUTPUT_SELECT_REGS; ++i) {
  4074. ni_writew(devpriv->pfi_output_select_reg[i],
  4075. M_Offset_PFI_Output_Select(i + 1));
  4076. }
  4077. } else {
  4078. s->n_chan = 10;
  4079. }
  4080. s->maxdata = 1;
  4081. if (boardtype.reg_type & ni_reg_m_series_mask) {
  4082. s->insn_bits = &ni_pfi_insn_bits;
  4083. }
  4084. s->insn_config = &ni_pfi_insn_config;
  4085. ni_set_bits(dev, IO_Bidirection_Pin_Register, ~0, 0);
  4086. /* cs5529 calibration adc */
  4087. s = dev->subdevices + NI_CS5529_CALIBRATION_SUBDEV;
  4088. if (boardtype.reg_type & ni_reg_67xx_mask) {
  4089. s->type = COMEDI_SUBD_AI;
  4090. s->subdev_flags = SDF_READABLE | SDF_DIFF | SDF_INTERNAL;
  4091. /* one channel for each analog output channel */
  4092. s->n_chan = boardtype.n_aochan;
  4093. s->maxdata = (1 << 16) - 1;
  4094. s->range_table = &range_unknown; /* XXX */
  4095. s->insn_read = cs5529_ai_insn_read;
  4096. s->insn_config = NULL;
  4097. init_cs5529(dev);
  4098. } else {
  4099. s->type = COMEDI_SUBD_UNUSED;
  4100. }
  4101. /* Serial */
  4102. s = dev->subdevices + NI_SERIAL_SUBDEV;
  4103. s->type = COMEDI_SUBD_SERIAL;
  4104. s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL;
  4105. s->n_chan = 1;
  4106. s->maxdata = 0xff;
  4107. s->insn_config = ni_serial_insn_config;
  4108. devpriv->serial_interval_ns = 0;
  4109. devpriv->serial_hw_mode = 0;
  4110. /* RTSI */
  4111. s = dev->subdevices + NI_RTSI_SUBDEV;
  4112. s->type = COMEDI_SUBD_DIO;
  4113. s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL;
  4114. s->n_chan = 8;
  4115. s->maxdata = 1;
  4116. s->insn_bits = ni_rtsi_insn_bits;
  4117. s->insn_config = ni_rtsi_insn_config;
  4118. ni_rtsi_init(dev);
  4119. if (boardtype.reg_type & ni_reg_m_series_mask) {
  4120. counter_variant = ni_gpct_variant_m_series;
  4121. } else {
  4122. counter_variant = ni_gpct_variant_e_series;
  4123. }
  4124. devpriv->counter_dev = ni_gpct_device_construct(dev,
  4125. &ni_gpct_write_register,
  4126. &ni_gpct_read_register,
  4127. counter_variant,
  4128. NUM_GPCT);
  4129. /* General purpose counters */
  4130. for (j = 0; j < NUM_GPCT; ++j) {
  4131. s = dev->subdevices + NI_GPCT_SUBDEV(j);
  4132. s->type = COMEDI_SUBD_COUNTER;
  4133. s->subdev_flags =
  4134. SDF_READABLE | SDF_WRITABLE | SDF_LSAMPL | SDF_CMD_READ
  4135. /* | SDF_CMD_WRITE */ ;
  4136. s->n_chan = 3;
  4137. if (boardtype.reg_type & ni_reg_m_series_mask)
  4138. s->maxdata = 0xffffffff;
  4139. else
  4140. s->maxdata = 0xffffff;
  4141. s->insn_read = &ni_gpct_insn_read;
  4142. s->insn_write = &ni_gpct_insn_write;
  4143. s->insn_config = &ni_gpct_insn_config;
  4144. s->do_cmd = &ni_gpct_cmd;
  4145. s->len_chanlist = 1;
  4146. s->do_cmdtest = &ni_gpct_cmdtest;
  4147. s->cancel = &ni_gpct_cancel;
  4148. s->async_dma_dir = DMA_BIDIRECTIONAL;
  4149. s->private = &devpriv->counter_dev->counters[j];
  4150. devpriv->counter_dev->counters[j].chip_index = 0;
  4151. devpriv->counter_dev->counters[j].counter_index = j;
  4152. ni_tio_init_counter(&devpriv->counter_dev->counters[j]);
  4153. }
  4154. /* Frequency output */
  4155. s = dev->subdevices + NI_FREQ_OUT_SUBDEV;
  4156. s->type = COMEDI_SUBD_COUNTER;
  4157. s->subdev_flags = SDF_READABLE | SDF_WRITABLE;
  4158. s->n_chan = 1;
  4159. s->maxdata = 0xf;
  4160. s->insn_read = &ni_freq_out_insn_read;
  4161. s->insn_write = &ni_freq_out_insn_write;
  4162. s->insn_config = &ni_freq_out_insn_config;
  4163. /* ai configuration */
  4164. ni_ai_reset(dev, dev->subdevices + NI_AI_SUBDEV);
  4165. if ((boardtype.reg_type & ni_reg_6xxx_mask) == 0) {
  4166. /* BEAM is this needed for PCI-6143 ?? */
  4167. devpriv->clock_and_fout =
  4168. Slow_Internal_Time_Divide_By_2 |
  4169. Slow_Internal_Timebase |
  4170. Clock_To_Board_Divide_By_2 |
  4171. Clock_To_Board |
  4172. AI_Output_Divide_By_2 | AO_Output_Divide_By_2;
  4173. } else {
  4174. devpriv->clock_and_fout =
  4175. Slow_Internal_Time_Divide_By_2 |
  4176. Slow_Internal_Timebase |
  4177. Clock_To_Board_Divide_By_2 | Clock_To_Board;
  4178. }
  4179. devpriv->stc_writew(dev, devpriv->clock_and_fout,
  4180. Clock_and_FOUT_Register);
  4181. /* analog output configuration */
  4182. ni_ao_reset(dev, dev->subdevices + NI_AO_SUBDEV);
  4183. if (dev->irq) {
  4184. devpriv->stc_writew(dev,
  4185. (IRQ_POLARITY ? Interrupt_Output_Polarity :
  4186. 0) | (Interrupt_Output_On_3_Pins & 0) |
  4187. Interrupt_A_Enable | Interrupt_B_Enable |
  4188. Interrupt_A_Output_Select(interrupt_pin
  4189. (dev->irq)) |
  4190. Interrupt_B_Output_Select(interrupt_pin
  4191. (dev->irq)),
  4192. Interrupt_Control_Register);
  4193. }
  4194. /* DMA setup */
  4195. ni_writeb(devpriv->ai_ao_select_reg, AI_AO_Select);
  4196. ni_writeb(devpriv->g0_g1_select_reg, G0_G1_Select);
  4197. if (boardtype.reg_type & ni_reg_6xxx_mask) {
  4198. ni_writeb(0, Magic_611x);
  4199. } else if (boardtype.reg_type & ni_reg_m_series_mask) {
  4200. int channel;
  4201. for (channel = 0; channel < boardtype.n_aochan; ++channel) {
  4202. ni_writeb(0xf, M_Offset_AO_Waveform_Order(channel));
  4203. ni_writeb(0x0,
  4204. M_Offset_AO_Reference_Attenuation(channel));
  4205. }
  4206. ni_writeb(0x0, M_Offset_AO_Calibration);
  4207. }
  4208. printk("\n");
  4209. return 0;
  4210. }
  4211. static int ni_8255_callback(int dir, int port, int data, unsigned long arg)
  4212. {
  4213. struct comedi_device *dev = (struct comedi_device *)arg;
  4214. if (dir) {
  4215. ni_writeb(data, Port_A + 2 * port);
  4216. return 0;
  4217. } else {
  4218. return ni_readb(Port_A + 2 * port);
  4219. }
  4220. }
  4221. /*
  4222. presents the EEPROM as a subdevice
  4223. */
  4224. static int ni_eeprom_insn_read(struct comedi_device *dev,
  4225. struct comedi_subdevice *s,
  4226. struct comedi_insn *insn, unsigned int *data)
  4227. {
  4228. data[0] = ni_read_eeprom(dev, CR_CHAN(insn->chanspec));
  4229. return 1;
  4230. }
  4231. /*
  4232. reads bytes out of eeprom
  4233. */
  4234. static int ni_read_eeprom(struct comedi_device *dev, int addr)
  4235. {
  4236. int bit;
  4237. int bitstring;
  4238. bitstring = 0x0300 | ((addr & 0x100) << 3) | (addr & 0xff);
  4239. ni_writeb(0x04, Serial_Command);
  4240. for (bit = 0x8000; bit; bit >>= 1) {
  4241. ni_writeb(0x04 | ((bit & bitstring) ? 0x02 : 0),
  4242. Serial_Command);
  4243. ni_writeb(0x05 | ((bit & bitstring) ? 0x02 : 0),
  4244. Serial_Command);
  4245. }
  4246. bitstring = 0;
  4247. for (bit = 0x80; bit; bit >>= 1) {
  4248. ni_writeb(0x04, Serial_Command);
  4249. ni_writeb(0x05, Serial_Command);
  4250. bitstring |= ((ni_readb(XXX_Status) & PROMOUT) ? bit : 0);
  4251. }
  4252. ni_writeb(0x00, Serial_Command);
  4253. return bitstring;
  4254. }
  4255. static int ni_m_series_eeprom_insn_read(struct comedi_device *dev,
  4256. struct comedi_subdevice *s,
  4257. struct comedi_insn *insn,
  4258. unsigned int *data)
  4259. {
  4260. data[0] = devpriv->eeprom_buffer[CR_CHAN(insn->chanspec)];
  4261. return 1;
  4262. }
  4263. static int ni_get_pwm_config(struct comedi_device *dev, unsigned int *data)
  4264. {
  4265. data[1] = devpriv->pwm_up_count * devpriv->clock_ns;
  4266. data[2] = devpriv->pwm_down_count * devpriv->clock_ns;
  4267. return 3;
  4268. }
  4269. static int ni_m_series_pwm_config(struct comedi_device *dev,
  4270. struct comedi_subdevice *s,
  4271. struct comedi_insn *insn, unsigned int *data)
  4272. {
  4273. unsigned up_count, down_count;
  4274. switch (data[0]) {
  4275. case INSN_CONFIG_PWM_OUTPUT:
  4276. switch (data[1]) {
  4277. case TRIG_ROUND_NEAREST:
  4278. up_count =
  4279. (data[2] +
  4280. devpriv->clock_ns / 2) / devpriv->clock_ns;
  4281. break;
  4282. case TRIG_ROUND_DOWN:
  4283. up_count = data[2] / devpriv->clock_ns;
  4284. break;
  4285. case TRIG_ROUND_UP:
  4286. up_count =
  4287. (data[2] + devpriv->clock_ns -
  4288. 1) / devpriv->clock_ns;
  4289. break;
  4290. default:
  4291. return -EINVAL;
  4292. break;
  4293. }
  4294. switch (data[3]) {
  4295. case TRIG_ROUND_NEAREST:
  4296. down_count =
  4297. (data[4] +
  4298. devpriv->clock_ns / 2) / devpriv->clock_ns;
  4299. break;
  4300. case TRIG_ROUND_DOWN:
  4301. down_count = data[4] / devpriv->clock_ns;
  4302. break;
  4303. case TRIG_ROUND_UP:
  4304. down_count =
  4305. (data[4] + devpriv->clock_ns -
  4306. 1) / devpriv->clock_ns;
  4307. break;
  4308. default:
  4309. return -EINVAL;
  4310. break;
  4311. }
  4312. if (up_count * devpriv->clock_ns != data[2] ||
  4313. down_count * devpriv->clock_ns != data[4]) {
  4314. data[2] = up_count * devpriv->clock_ns;
  4315. data[4] = down_count * devpriv->clock_ns;
  4316. return -EAGAIN;
  4317. }
  4318. ni_writel(MSeries_Cal_PWM_High_Time_Bits(up_count) |
  4319. MSeries_Cal_PWM_Low_Time_Bits(down_count),
  4320. M_Offset_Cal_PWM);
  4321. devpriv->pwm_up_count = up_count;
  4322. devpriv->pwm_down_count = down_count;
  4323. return 5;
  4324. break;
  4325. case INSN_CONFIG_GET_PWM_OUTPUT:
  4326. return ni_get_pwm_config(dev, data);
  4327. break;
  4328. default:
  4329. return -EINVAL;
  4330. break;
  4331. }
  4332. return 0;
  4333. }
  4334. static int ni_6143_pwm_config(struct comedi_device *dev,
  4335. struct comedi_subdevice *s,
  4336. struct comedi_insn *insn, unsigned int *data)
  4337. {
  4338. unsigned up_count, down_count;
  4339. switch (data[0]) {
  4340. case INSN_CONFIG_PWM_OUTPUT:
  4341. switch (data[1]) {
  4342. case TRIG_ROUND_NEAREST:
  4343. up_count =
  4344. (data[2] +
  4345. devpriv->clock_ns / 2) / devpriv->clock_ns;
  4346. break;
  4347. case TRIG_ROUND_DOWN:
  4348. up_count = data[2] / devpriv->clock_ns;
  4349. break;
  4350. case TRIG_ROUND_UP:
  4351. up_count =
  4352. (data[2] + devpriv->clock_ns -
  4353. 1) / devpriv->clock_ns;
  4354. break;
  4355. default:
  4356. return -EINVAL;
  4357. break;
  4358. }
  4359. switch (data[3]) {
  4360. case TRIG_ROUND_NEAREST:
  4361. down_count =
  4362. (data[4] +
  4363. devpriv->clock_ns / 2) / devpriv->clock_ns;
  4364. break;
  4365. case TRIG_ROUND_DOWN:
  4366. down_count = data[4] / devpriv->clock_ns;
  4367. break;
  4368. case TRIG_ROUND_UP:
  4369. down_count =
  4370. (data[4] + devpriv->clock_ns -
  4371. 1) / devpriv->clock_ns;
  4372. break;
  4373. default:
  4374. return -EINVAL;
  4375. break;
  4376. }
  4377. if (up_count * devpriv->clock_ns != data[2] ||
  4378. down_count * devpriv->clock_ns != data[4]) {
  4379. data[2] = up_count * devpriv->clock_ns;
  4380. data[4] = down_count * devpriv->clock_ns;
  4381. return -EAGAIN;
  4382. }
  4383. ni_writel(up_count, Calibration_HighTime_6143);
  4384. devpriv->pwm_up_count = up_count;
  4385. ni_writel(down_count, Calibration_LowTime_6143);
  4386. devpriv->pwm_down_count = down_count;
  4387. return 5;
  4388. break;
  4389. case INSN_CONFIG_GET_PWM_OUTPUT:
  4390. return ni_get_pwm_config(dev, data);
  4391. default:
  4392. return -EINVAL;
  4393. break;
  4394. }
  4395. return 0;
  4396. }
  4397. static void ni_write_caldac(struct comedi_device *dev, int addr, int val);
  4398. /*
  4399. calibration subdevice
  4400. */
  4401. static int ni_calib_insn_write(struct comedi_device *dev,
  4402. struct comedi_subdevice *s,
  4403. struct comedi_insn *insn, unsigned int *data)
  4404. {
  4405. ni_write_caldac(dev, CR_CHAN(insn->chanspec), data[0]);
  4406. return 1;
  4407. }
  4408. static int ni_calib_insn_read(struct comedi_device *dev,
  4409. struct comedi_subdevice *s,
  4410. struct comedi_insn *insn, unsigned int *data)
  4411. {
  4412. data[0] = devpriv->caldacs[CR_CHAN(insn->chanspec)];
  4413. return 1;
  4414. }
  4415. static int pack_mb88341(int addr, int val, int *bitstring);
  4416. static int pack_dac8800(int addr, int val, int *bitstring);
  4417. static int pack_dac8043(int addr, int val, int *bitstring);
  4418. static int pack_ad8522(int addr, int val, int *bitstring);
  4419. static int pack_ad8804(int addr, int val, int *bitstring);
  4420. static int pack_ad8842(int addr, int val, int *bitstring);
  4421. struct caldac_struct {
  4422. int n_chans;
  4423. int n_bits;
  4424. int (*packbits) (int, int, int *);
  4425. };
  4426. static struct caldac_struct caldacs[] = {
  4427. [mb88341] = {12, 8, pack_mb88341},
  4428. [dac8800] = {8, 8, pack_dac8800},
  4429. [dac8043] = {1, 12, pack_dac8043},
  4430. [ad8522] = {2, 12, pack_ad8522},
  4431. [ad8804] = {12, 8, pack_ad8804},
  4432. [ad8842] = {8, 8, pack_ad8842},
  4433. [ad8804_debug] = {16, 8, pack_ad8804},
  4434. };
  4435. static void caldac_setup(struct comedi_device *dev, struct comedi_subdevice *s)
  4436. {
  4437. int i, j;
  4438. int n_dacs;
  4439. int n_chans = 0;
  4440. int n_bits;
  4441. int diffbits = 0;
  4442. int type;
  4443. int chan;
  4444. type = boardtype.caldac[0];
  4445. if (type == caldac_none)
  4446. return;
  4447. n_bits = caldacs[type].n_bits;
  4448. for (i = 0; i < 3; i++) {
  4449. type = boardtype.caldac[i];
  4450. if (type == caldac_none)
  4451. break;
  4452. if (caldacs[type].n_bits != n_bits)
  4453. diffbits = 1;
  4454. n_chans += caldacs[type].n_chans;
  4455. }
  4456. n_dacs = i;
  4457. s->n_chan = n_chans;
  4458. if (diffbits) {
  4459. unsigned int *maxdata_list;
  4460. if (n_chans > MAX_N_CALDACS) {
  4461. printk("BUG! MAX_N_CALDACS too small\n");
  4462. }
  4463. s->maxdata_list = maxdata_list = devpriv->caldac_maxdata_list;
  4464. chan = 0;
  4465. for (i = 0; i < n_dacs; i++) {
  4466. type = boardtype.caldac[i];
  4467. for (j = 0; j < caldacs[type].n_chans; j++) {
  4468. maxdata_list[chan] =
  4469. (1 << caldacs[type].n_bits) - 1;
  4470. chan++;
  4471. }
  4472. }
  4473. for (chan = 0; chan < s->n_chan; chan++)
  4474. ni_write_caldac(dev, i, s->maxdata_list[i] / 2);
  4475. } else {
  4476. type = boardtype.caldac[0];
  4477. s->maxdata = (1 << caldacs[type].n_bits) - 1;
  4478. for (chan = 0; chan < s->n_chan; chan++)
  4479. ni_write_caldac(dev, i, s->maxdata / 2);
  4480. }
  4481. }
  4482. static void ni_write_caldac(struct comedi_device *dev, int addr, int val)
  4483. {
  4484. unsigned int loadbit = 0, bits = 0, bit, bitstring = 0;
  4485. int i;
  4486. int type;
  4487. /* printk("ni_write_caldac: chan=%d val=%d\n",addr,val); */
  4488. if (devpriv->caldacs[addr] == val)
  4489. return;
  4490. devpriv->caldacs[addr] = val;
  4491. for (i = 0; i < 3; i++) {
  4492. type = boardtype.caldac[i];
  4493. if (type == caldac_none)
  4494. break;
  4495. if (addr < caldacs[type].n_chans) {
  4496. bits = caldacs[type].packbits(addr, val, &bitstring);
  4497. loadbit = SerDacLd(i);
  4498. /* printk("caldac: using i=%d addr=%d %x\n",i,addr,bitstring); */
  4499. break;
  4500. }
  4501. addr -= caldacs[type].n_chans;
  4502. }
  4503. for (bit = 1 << (bits - 1); bit; bit >>= 1) {
  4504. ni_writeb(((bit & bitstring) ? 0x02 : 0), Serial_Command);
  4505. udelay(1);
  4506. ni_writeb(1 | ((bit & bitstring) ? 0x02 : 0), Serial_Command);
  4507. udelay(1);
  4508. }
  4509. ni_writeb(loadbit, Serial_Command);
  4510. udelay(1);
  4511. ni_writeb(0, Serial_Command);
  4512. }
  4513. static int pack_mb88341(int addr, int val, int *bitstring)
  4514. {
  4515. /*
  4516. Fujitsu MB 88341
  4517. Note that address bits are reversed. Thanks to
  4518. Ingo Keen for noticing this.
  4519. Note also that the 88341 expects address values from
  4520. 1-12, whereas we use channel numbers 0-11. The NI
  4521. docs use 1-12, also, so be careful here.
  4522. */
  4523. addr++;
  4524. *bitstring = ((addr & 0x1) << 11) |
  4525. ((addr & 0x2) << 9) |
  4526. ((addr & 0x4) << 7) | ((addr & 0x8) << 5) | (val & 0xff);
  4527. return 12;
  4528. }
  4529. static int pack_dac8800(int addr, int val, int *bitstring)
  4530. {
  4531. *bitstring = ((addr & 0x7) << 8) | (val & 0xff);
  4532. return 11;
  4533. }
  4534. static int pack_dac8043(int addr, int val, int *bitstring)
  4535. {
  4536. *bitstring = val & 0xfff;
  4537. return 12;
  4538. }
  4539. static int pack_ad8522(int addr, int val, int *bitstring)
  4540. {
  4541. *bitstring = (val & 0xfff) | (addr ? 0xc000 : 0xa000);
  4542. return 16;
  4543. }
  4544. static int pack_ad8804(int addr, int val, int *bitstring)
  4545. {
  4546. *bitstring = ((addr & 0xf) << 8) | (val & 0xff);
  4547. return 12;
  4548. }
  4549. static int pack_ad8842(int addr, int val, int *bitstring)
  4550. {
  4551. *bitstring = ((addr + 1) << 8) | (val & 0xff);
  4552. return 12;
  4553. }
  4554. #if 0
  4555. /*
  4556. * Read the GPCTs current value.
  4557. */
  4558. static int GPCT_G_Watch(struct comedi_device *dev, int chan)
  4559. {
  4560. unsigned int hi1, hi2, lo;
  4561. devpriv->gpct_command[chan] &= ~G_Save_Trace;
  4562. devpriv->stc_writew(dev, devpriv->gpct_command[chan],
  4563. G_Command_Register(chan));
  4564. devpriv->gpct_command[chan] |= G_Save_Trace;
  4565. devpriv->stc_writew(dev, devpriv->gpct_command[chan],
  4566. G_Command_Register(chan));
  4567. /* This procedure is used because the two registers cannot
  4568. * be read atomically. */
  4569. do {
  4570. hi1 = devpriv->stc_readw(dev, G_Save_Register_High(chan));
  4571. lo = devpriv->stc_readw(dev, G_Save_Register_Low(chan));
  4572. hi2 = devpriv->stc_readw(dev, G_Save_Register_High(chan));
  4573. } while (hi1 != hi2);
  4574. return (hi1 << 16) | lo;
  4575. }
  4576. static void GPCT_Reset(struct comedi_device *dev, int chan)
  4577. {
  4578. int temp_ack_reg = 0;
  4579. /* printk("GPCT_Reset..."); */
  4580. devpriv->gpct_cur_operation[chan] = GPCT_RESET;
  4581. switch (chan) {
  4582. case 0:
  4583. devpriv->stc_writew(dev, G0_Reset, Joint_Reset_Register);
  4584. ni_set_bits(dev, Interrupt_A_Enable_Register,
  4585. G0_TC_Interrupt_Enable, 0);
  4586. ni_set_bits(dev, Interrupt_A_Enable_Register,
  4587. G0_Gate_Interrupt_Enable, 0);
  4588. temp_ack_reg |= G0_Gate_Error_Confirm;
  4589. temp_ack_reg |= G0_TC_Error_Confirm;
  4590. temp_ack_reg |= G0_TC_Interrupt_Ack;
  4591. temp_ack_reg |= G0_Gate_Interrupt_Ack;
  4592. devpriv->stc_writew(dev, temp_ack_reg,
  4593. Interrupt_A_Ack_Register);
  4594. /* problem...this interferes with the other ctr... */
  4595. devpriv->an_trig_etc_reg |= GPFO_0_Output_Enable;
  4596. devpriv->stc_writew(dev, devpriv->an_trig_etc_reg,
  4597. Analog_Trigger_Etc_Register);
  4598. break;
  4599. case 1:
  4600. devpriv->stc_writew(dev, G1_Reset, Joint_Reset_Register);
  4601. ni_set_bits(dev, Interrupt_B_Enable_Register,
  4602. G1_TC_Interrupt_Enable, 0);
  4603. ni_set_bits(dev, Interrupt_B_Enable_Register,
  4604. G0_Gate_Interrupt_Enable, 0);
  4605. temp_ack_reg |= G1_Gate_Error_Confirm;
  4606. temp_ack_reg |= G1_TC_Error_Confirm;
  4607. temp_ack_reg |= G1_TC_Interrupt_Ack;
  4608. temp_ack_reg |= G1_Gate_Interrupt_Ack;
  4609. devpriv->stc_writew(dev, temp_ack_reg,
  4610. Interrupt_B_Ack_Register);
  4611. devpriv->an_trig_etc_reg |= GPFO_1_Output_Enable;
  4612. devpriv->stc_writew(dev, devpriv->an_trig_etc_reg,
  4613. Analog_Trigger_Etc_Register);
  4614. break;
  4615. }
  4616. devpriv->gpct_mode[chan] = 0;
  4617. devpriv->gpct_input_select[chan] = 0;
  4618. devpriv->gpct_command[chan] = 0;
  4619. devpriv->gpct_command[chan] |= G_Synchronized_Gate;
  4620. devpriv->stc_writew(dev, devpriv->gpct_mode[chan],
  4621. G_Mode_Register(chan));
  4622. devpriv->stc_writew(dev, devpriv->gpct_input_select[chan],
  4623. G_Input_Select_Register(chan));
  4624. devpriv->stc_writew(dev, 0, G_Autoincrement_Register(chan));
  4625. /* printk("exit GPCT_Reset\n"); */
  4626. }
  4627. #endif
  4628. static int ni_gpct_insn_config(struct comedi_device *dev,
  4629. struct comedi_subdevice *s,
  4630. struct comedi_insn *insn, unsigned int *data)
  4631. {
  4632. struct ni_gpct *counter = s->private;
  4633. return ni_tio_insn_config(counter, insn, data);
  4634. }
  4635. static int ni_gpct_insn_read(struct comedi_device *dev,
  4636. struct comedi_subdevice *s,
  4637. struct comedi_insn *insn, unsigned int *data)
  4638. {
  4639. struct ni_gpct *counter = s->private;
  4640. return ni_tio_rinsn(counter, insn, data);
  4641. }
  4642. static int ni_gpct_insn_write(struct comedi_device *dev,
  4643. struct comedi_subdevice *s,
  4644. struct comedi_insn *insn, unsigned int *data)
  4645. {
  4646. struct ni_gpct *counter = s->private;
  4647. return ni_tio_winsn(counter, insn, data);
  4648. }
  4649. static int ni_gpct_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
  4650. {
  4651. int retval;
  4652. #ifdef PCIDMA
  4653. struct ni_gpct *counter = s->private;
  4654. /* const struct comedi_cmd *cmd = &s->async->cmd; */
  4655. retval = ni_request_gpct_mite_channel(dev, counter->counter_index,
  4656. COMEDI_INPUT);
  4657. if (retval) {
  4658. comedi_error(dev,
  4659. "no dma channel available for use by counter");
  4660. return retval;
  4661. }
  4662. ni_tio_acknowledge_and_confirm(counter, NULL, NULL, NULL, NULL);
  4663. ni_e_series_enable_second_irq(dev, counter->counter_index, 1);
  4664. retval = ni_tio_cmd(counter, s->async);
  4665. #else
  4666. retval = -ENOTSUPP;
  4667. #endif
  4668. return retval;
  4669. }
  4670. static int ni_gpct_cmdtest(struct comedi_device *dev,
  4671. struct comedi_subdevice *s, struct comedi_cmd *cmd)
  4672. {
  4673. #ifdef PCIDMA
  4674. struct ni_gpct *counter = s->private;
  4675. return ni_tio_cmdtest(counter, cmd);
  4676. #else
  4677. return -ENOTSUPP;
  4678. #endif
  4679. }
  4680. static int ni_gpct_cancel(struct comedi_device *dev, struct comedi_subdevice *s)
  4681. {
  4682. #ifdef PCIDMA
  4683. struct ni_gpct *counter = s->private;
  4684. int retval;
  4685. retval = ni_tio_cancel(counter);
  4686. ni_e_series_enable_second_irq(dev, counter->counter_index, 0);
  4687. ni_release_gpct_mite_channel(dev, counter->counter_index);
  4688. return retval;
  4689. #else
  4690. return 0;
  4691. #endif
  4692. }
  4693. /*
  4694. *
  4695. * Programmable Function Inputs
  4696. *
  4697. */
  4698. static int ni_m_series_set_pfi_routing(struct comedi_device *dev, unsigned chan,
  4699. unsigned source)
  4700. {
  4701. unsigned pfi_reg_index;
  4702. unsigned array_offset;
  4703. if ((source & 0x1f) != source)
  4704. return -EINVAL;
  4705. pfi_reg_index = 1 + chan / 3;
  4706. array_offset = pfi_reg_index - 1;
  4707. devpriv->pfi_output_select_reg[array_offset] &=
  4708. ~MSeries_PFI_Output_Select_Mask(chan);
  4709. devpriv->pfi_output_select_reg[array_offset] |=
  4710. MSeries_PFI_Output_Select_Bits(chan, source);
  4711. ni_writew(devpriv->pfi_output_select_reg[array_offset],
  4712. M_Offset_PFI_Output_Select(pfi_reg_index));
  4713. return 2;
  4714. }
  4715. static int ni_old_set_pfi_routing(struct comedi_device *dev, unsigned chan,
  4716. unsigned source)
  4717. {
  4718. /* pre-m-series boards have fixed signals on pfi pins */
  4719. if (source != ni_old_get_pfi_routing(dev, chan))
  4720. return -EINVAL;
  4721. return 2;
  4722. }
  4723. static int ni_set_pfi_routing(struct comedi_device *dev, unsigned chan,
  4724. unsigned source)
  4725. {
  4726. if (boardtype.reg_type & ni_reg_m_series_mask)
  4727. return ni_m_series_set_pfi_routing(dev, chan, source);
  4728. else
  4729. return ni_old_set_pfi_routing(dev, chan, source);
  4730. }
  4731. static unsigned ni_m_series_get_pfi_routing(struct comedi_device *dev,
  4732. unsigned chan)
  4733. {
  4734. const unsigned array_offset = chan / 3;
  4735. return MSeries_PFI_Output_Select_Source(chan,
  4736. devpriv->
  4737. pfi_output_select_reg
  4738. [array_offset]);
  4739. }
  4740. static unsigned ni_old_get_pfi_routing(struct comedi_device *dev, unsigned chan)
  4741. {
  4742. /* pre-m-series boards have fixed signals on pfi pins */
  4743. switch (chan) {
  4744. case 0:
  4745. return NI_PFI_OUTPUT_AI_START1;
  4746. break;
  4747. case 1:
  4748. return NI_PFI_OUTPUT_AI_START2;
  4749. break;
  4750. case 2:
  4751. return NI_PFI_OUTPUT_AI_CONVERT;
  4752. break;
  4753. case 3:
  4754. return NI_PFI_OUTPUT_G_SRC1;
  4755. break;
  4756. case 4:
  4757. return NI_PFI_OUTPUT_G_GATE1;
  4758. break;
  4759. case 5:
  4760. return NI_PFI_OUTPUT_AO_UPDATE_N;
  4761. break;
  4762. case 6:
  4763. return NI_PFI_OUTPUT_AO_START1;
  4764. break;
  4765. case 7:
  4766. return NI_PFI_OUTPUT_AI_START_PULSE;
  4767. break;
  4768. case 8:
  4769. return NI_PFI_OUTPUT_G_SRC0;
  4770. break;
  4771. case 9:
  4772. return NI_PFI_OUTPUT_G_GATE0;
  4773. break;
  4774. default:
  4775. printk("%s: bug, unhandled case in switch.\n", __func__);
  4776. break;
  4777. }
  4778. return 0;
  4779. }
  4780. static unsigned ni_get_pfi_routing(struct comedi_device *dev, unsigned chan)
  4781. {
  4782. if (boardtype.reg_type & ni_reg_m_series_mask)
  4783. return ni_m_series_get_pfi_routing(dev, chan);
  4784. else
  4785. return ni_old_get_pfi_routing(dev, chan);
  4786. }
  4787. static int ni_config_filter(struct comedi_device *dev, unsigned pfi_channel,
  4788. enum ni_pfi_filter_select filter)
  4789. {
  4790. unsigned bits;
  4791. if ((boardtype.reg_type & ni_reg_m_series_mask) == 0) {
  4792. return -ENOTSUPP;
  4793. }
  4794. bits = ni_readl(M_Offset_PFI_Filter);
  4795. bits &= ~MSeries_PFI_Filter_Select_Mask(pfi_channel);
  4796. bits |= MSeries_PFI_Filter_Select_Bits(pfi_channel, filter);
  4797. ni_writel(bits, M_Offset_PFI_Filter);
  4798. return 0;
  4799. }
  4800. static int ni_pfi_insn_bits(struct comedi_device *dev,
  4801. struct comedi_subdevice *s,
  4802. struct comedi_insn *insn, unsigned int *data)
  4803. {
  4804. if ((boardtype.reg_type & ni_reg_m_series_mask) == 0) {
  4805. return -ENOTSUPP;
  4806. }
  4807. if (data[0]) {
  4808. s->state &= ~data[0];
  4809. s->state |= (data[0] & data[1]);
  4810. ni_writew(s->state, M_Offset_PFI_DO);
  4811. }
  4812. data[1] = ni_readw(M_Offset_PFI_DI);
  4813. return 2;
  4814. }
  4815. static int ni_pfi_insn_config(struct comedi_device *dev,
  4816. struct comedi_subdevice *s,
  4817. struct comedi_insn *insn, unsigned int *data)
  4818. {
  4819. unsigned int chan;
  4820. if (insn->n < 1)
  4821. return -EINVAL;
  4822. chan = CR_CHAN(insn->chanspec);
  4823. switch (data[0]) {
  4824. case COMEDI_OUTPUT:
  4825. ni_set_bits(dev, IO_Bidirection_Pin_Register, 1 << chan, 1);
  4826. break;
  4827. case COMEDI_INPUT:
  4828. ni_set_bits(dev, IO_Bidirection_Pin_Register, 1 << chan, 0);
  4829. break;
  4830. case INSN_CONFIG_DIO_QUERY:
  4831. data[1] =
  4832. (devpriv->io_bidirection_pin_reg & (1 << chan)) ?
  4833. COMEDI_OUTPUT : COMEDI_INPUT;
  4834. return 0;
  4835. break;
  4836. case INSN_CONFIG_SET_ROUTING:
  4837. return ni_set_pfi_routing(dev, chan, data[1]);
  4838. break;
  4839. case INSN_CONFIG_GET_ROUTING:
  4840. data[1] = ni_get_pfi_routing(dev, chan);
  4841. break;
  4842. case INSN_CONFIG_FILTER:
  4843. return ni_config_filter(dev, chan, data[1]);
  4844. break;
  4845. default:
  4846. return -EINVAL;
  4847. }
  4848. return 0;
  4849. }
  4850. /*
  4851. *
  4852. * NI RTSI Bus Functions
  4853. *
  4854. */
  4855. static void ni_rtsi_init(struct comedi_device *dev)
  4856. {
  4857. /* Initialises the RTSI bus signal switch to a default state */
  4858. /* Set clock mode to internal */
  4859. devpriv->clock_and_fout2 = MSeries_RTSI_10MHz_Bit;
  4860. if (ni_set_master_clock(dev, NI_MIO_INTERNAL_CLOCK, 0) < 0) {
  4861. printk("ni_set_master_clock failed, bug?");
  4862. }
  4863. /* default internal lines routing to RTSI bus lines */
  4864. devpriv->rtsi_trig_a_output_reg =
  4865. RTSI_Trig_Output_Bits(0,
  4866. NI_RTSI_OUTPUT_ADR_START1) |
  4867. RTSI_Trig_Output_Bits(1,
  4868. NI_RTSI_OUTPUT_ADR_START2) |
  4869. RTSI_Trig_Output_Bits(2,
  4870. NI_RTSI_OUTPUT_SCLKG) |
  4871. RTSI_Trig_Output_Bits(3, NI_RTSI_OUTPUT_DACUPDN);
  4872. devpriv->stc_writew(dev, devpriv->rtsi_trig_a_output_reg,
  4873. RTSI_Trig_A_Output_Register);
  4874. devpriv->rtsi_trig_b_output_reg =
  4875. RTSI_Trig_Output_Bits(4,
  4876. NI_RTSI_OUTPUT_DA_START1) |
  4877. RTSI_Trig_Output_Bits(5,
  4878. NI_RTSI_OUTPUT_G_SRC0) |
  4879. RTSI_Trig_Output_Bits(6, NI_RTSI_OUTPUT_G_GATE0);
  4880. if (boardtype.reg_type & ni_reg_m_series_mask)
  4881. devpriv->rtsi_trig_b_output_reg |=
  4882. RTSI_Trig_Output_Bits(7, NI_RTSI_OUTPUT_RTSI_OSC);
  4883. devpriv->stc_writew(dev, devpriv->rtsi_trig_b_output_reg,
  4884. RTSI_Trig_B_Output_Register);
  4885. /*
  4886. * Sets the source and direction of the 4 on board lines
  4887. * devpriv->stc_writew(dev, 0x0000, RTSI_Board_Register);
  4888. */
  4889. }
  4890. static int ni_rtsi_insn_bits(struct comedi_device *dev,
  4891. struct comedi_subdevice *s,
  4892. struct comedi_insn *insn, unsigned int *data)
  4893. {
  4894. if (insn->n != 2)
  4895. return -EINVAL;
  4896. data[1] = 0;
  4897. return 2;
  4898. }
  4899. /* Find best multiplier/divider to try and get the PLL running at 80 MHz
  4900. * given an arbitrary frequency input clock */
  4901. static int ni_mseries_get_pll_parameters(unsigned reference_period_ns,
  4902. unsigned *freq_divider,
  4903. unsigned *freq_multiplier,
  4904. unsigned *actual_period_ns)
  4905. {
  4906. unsigned div;
  4907. unsigned best_div = 1;
  4908. static const unsigned max_div = 0x10;
  4909. unsigned mult;
  4910. unsigned best_mult = 1;
  4911. static const unsigned max_mult = 0x100;
  4912. static const unsigned pico_per_nano = 1000;
  4913. const unsigned reference_picosec = reference_period_ns * pico_per_nano;
  4914. /* m-series wants the phased-locked loop to output 80MHz, which is divided by 4 to
  4915. * 20 MHz for most timing clocks */
  4916. static const unsigned target_picosec = 12500;
  4917. static const unsigned fudge_factor_80_to_20Mhz = 4;
  4918. int best_period_picosec = 0;
  4919. for (div = 1; div <= max_div; ++div) {
  4920. for (mult = 1; mult <= max_mult; ++mult) {
  4921. unsigned new_period_ps =
  4922. (reference_picosec * div) / mult;
  4923. if (abs(new_period_ps - target_picosec) <
  4924. abs(best_period_picosec - target_picosec)) {
  4925. best_period_picosec = new_period_ps;
  4926. best_div = div;
  4927. best_mult = mult;
  4928. }
  4929. }
  4930. }
  4931. if (best_period_picosec == 0) {
  4932. printk("%s: bug, failed to find pll parameters\n", __func__);
  4933. return -EIO;
  4934. }
  4935. *freq_divider = best_div;
  4936. *freq_multiplier = best_mult;
  4937. *actual_period_ns =
  4938. (best_period_picosec * fudge_factor_80_to_20Mhz +
  4939. (pico_per_nano / 2)) / pico_per_nano;
  4940. return 0;
  4941. }
  4942. static inline unsigned num_configurable_rtsi_channels(struct comedi_device *dev)
  4943. {
  4944. if (boardtype.reg_type & ni_reg_m_series_mask)
  4945. return 8;
  4946. else
  4947. return 7;
  4948. }
  4949. static int ni_mseries_set_pll_master_clock(struct comedi_device *dev,
  4950. unsigned source, unsigned period_ns)
  4951. {
  4952. static const unsigned min_period_ns = 50;
  4953. static const unsigned max_period_ns = 1000;
  4954. static const unsigned timeout = 1000;
  4955. unsigned pll_control_bits;
  4956. unsigned freq_divider;
  4957. unsigned freq_multiplier;
  4958. unsigned i;
  4959. int retval;
  4960. if (source == NI_MIO_PLL_PXI10_CLOCK)
  4961. period_ns = 100;
  4962. /* these limits are somewhat arbitrary, but NI advertises 1 to 20MHz range so we'll use that */
  4963. if (period_ns < min_period_ns || period_ns > max_period_ns) {
  4964. printk
  4965. ("%s: you must specify an input clock frequency between %i and %i nanosec "
  4966. "for the phased-lock loop.\n", __func__,
  4967. min_period_ns, max_period_ns);
  4968. return -EINVAL;
  4969. }
  4970. devpriv->rtsi_trig_direction_reg &= ~Use_RTSI_Clock_Bit;
  4971. devpriv->stc_writew(dev, devpriv->rtsi_trig_direction_reg,
  4972. RTSI_Trig_Direction_Register);
  4973. pll_control_bits =
  4974. MSeries_PLL_Enable_Bit | MSeries_PLL_VCO_Mode_75_150MHz_Bits;
  4975. devpriv->clock_and_fout2 |=
  4976. MSeries_Timebase1_Select_Bit | MSeries_Timebase3_Select_Bit;
  4977. devpriv->clock_and_fout2 &= ~MSeries_PLL_In_Source_Select_Mask;
  4978. switch (source) {
  4979. case NI_MIO_PLL_PXI_STAR_TRIGGER_CLOCK:
  4980. devpriv->clock_and_fout2 |=
  4981. MSeries_PLL_In_Source_Select_Star_Trigger_Bits;
  4982. retval = ni_mseries_get_pll_parameters(period_ns, &freq_divider,
  4983. &freq_multiplier,
  4984. &devpriv->clock_ns);
  4985. if (retval < 0)
  4986. return retval;
  4987. break;
  4988. case NI_MIO_PLL_PXI10_CLOCK:
  4989. /* pxi clock is 10MHz */
  4990. devpriv->clock_and_fout2 |=
  4991. MSeries_PLL_In_Source_Select_PXI_Clock10;
  4992. retval = ni_mseries_get_pll_parameters(period_ns, &freq_divider,
  4993. &freq_multiplier,
  4994. &devpriv->clock_ns);
  4995. if (retval < 0)
  4996. return retval;
  4997. break;
  4998. default:
  4999. {
  5000. unsigned rtsi_channel;
  5001. static const unsigned max_rtsi_channel = 7;
  5002. for (rtsi_channel = 0; rtsi_channel <= max_rtsi_channel;
  5003. ++rtsi_channel) {
  5004. if (source ==
  5005. NI_MIO_PLL_RTSI_CLOCK(rtsi_channel)) {
  5006. devpriv->clock_and_fout2 |=
  5007. MSeries_PLL_In_Source_Select_RTSI_Bits
  5008. (rtsi_channel);
  5009. break;
  5010. }
  5011. }
  5012. if (rtsi_channel > max_rtsi_channel)
  5013. return -EINVAL;
  5014. retval = ni_mseries_get_pll_parameters(period_ns,
  5015. &freq_divider,
  5016. &freq_multiplier,
  5017. &devpriv->
  5018. clock_ns);
  5019. if (retval < 0)
  5020. return retval;
  5021. }
  5022. break;
  5023. }
  5024. ni_writew(devpriv->clock_and_fout2, M_Offset_Clock_and_Fout2);
  5025. pll_control_bits |=
  5026. MSeries_PLL_Divisor_Bits(freq_divider) |
  5027. MSeries_PLL_Multiplier_Bits(freq_multiplier);
  5028. /* printk("using divider=%i, multiplier=%i for PLL. pll_control_bits = 0x%x\n",
  5029. * freq_divider, freq_multiplier, pll_control_bits); */
  5030. /* printk("clock_ns=%d\n", devpriv->clock_ns); */
  5031. ni_writew(pll_control_bits, M_Offset_PLL_Control);
  5032. devpriv->clock_source = source;
  5033. /* it seems to typically take a few hundred microseconds for PLL to lock */
  5034. for (i = 0; i < timeout; ++i) {
  5035. if (ni_readw(M_Offset_PLL_Status) & MSeries_PLL_Locked_Bit) {
  5036. break;
  5037. }
  5038. udelay(1);
  5039. }
  5040. if (i == timeout) {
  5041. printk
  5042. ("%s: timed out waiting for PLL to lock to reference clock source %i with period %i ns.\n",
  5043. __func__, source, period_ns);
  5044. return -ETIMEDOUT;
  5045. }
  5046. return 3;
  5047. }
  5048. static int ni_set_master_clock(struct comedi_device *dev, unsigned source,
  5049. unsigned period_ns)
  5050. {
  5051. if (source == NI_MIO_INTERNAL_CLOCK) {
  5052. devpriv->rtsi_trig_direction_reg &= ~Use_RTSI_Clock_Bit;
  5053. devpriv->stc_writew(dev, devpriv->rtsi_trig_direction_reg,
  5054. RTSI_Trig_Direction_Register);
  5055. devpriv->clock_ns = TIMEBASE_1_NS;
  5056. if (boardtype.reg_type & ni_reg_m_series_mask) {
  5057. devpriv->clock_and_fout2 &=
  5058. ~(MSeries_Timebase1_Select_Bit |
  5059. MSeries_Timebase3_Select_Bit);
  5060. ni_writew(devpriv->clock_and_fout2,
  5061. M_Offset_Clock_and_Fout2);
  5062. ni_writew(0, M_Offset_PLL_Control);
  5063. }
  5064. devpriv->clock_source = source;
  5065. } else {
  5066. if (boardtype.reg_type & ni_reg_m_series_mask) {
  5067. return ni_mseries_set_pll_master_clock(dev, source,
  5068. period_ns);
  5069. } else {
  5070. if (source == NI_MIO_RTSI_CLOCK) {
  5071. devpriv->rtsi_trig_direction_reg |=
  5072. Use_RTSI_Clock_Bit;
  5073. devpriv->stc_writew(dev,
  5074. devpriv->
  5075. rtsi_trig_direction_reg,
  5076. RTSI_Trig_Direction_Register);
  5077. if (period_ns == 0) {
  5078. printk
  5079. ("%s: we don't handle an unspecified clock period correctly yet, returning error.\n",
  5080. __func__);
  5081. return -EINVAL;
  5082. } else {
  5083. devpriv->clock_ns = period_ns;
  5084. }
  5085. devpriv->clock_source = source;
  5086. } else
  5087. return -EINVAL;
  5088. }
  5089. }
  5090. return 3;
  5091. }
  5092. static int ni_valid_rtsi_output_source(struct comedi_device *dev, unsigned chan,
  5093. unsigned source)
  5094. {
  5095. if (chan >= num_configurable_rtsi_channels(dev)) {
  5096. if (chan == old_RTSI_clock_channel) {
  5097. if (source == NI_RTSI_OUTPUT_RTSI_OSC)
  5098. return 1;
  5099. else {
  5100. printk
  5101. ("%s: invalid source for channel=%i, channel %i is always the RTSI clock for pre-m-series boards.\n",
  5102. __func__, chan, old_RTSI_clock_channel);
  5103. return 0;
  5104. }
  5105. }
  5106. return 0;
  5107. }
  5108. switch (source) {
  5109. case NI_RTSI_OUTPUT_ADR_START1:
  5110. case NI_RTSI_OUTPUT_ADR_START2:
  5111. case NI_RTSI_OUTPUT_SCLKG:
  5112. case NI_RTSI_OUTPUT_DACUPDN:
  5113. case NI_RTSI_OUTPUT_DA_START1:
  5114. case NI_RTSI_OUTPUT_G_SRC0:
  5115. case NI_RTSI_OUTPUT_G_GATE0:
  5116. case NI_RTSI_OUTPUT_RGOUT0:
  5117. case NI_RTSI_OUTPUT_RTSI_BRD_0:
  5118. return 1;
  5119. break;
  5120. case NI_RTSI_OUTPUT_RTSI_OSC:
  5121. if (boardtype.reg_type & ni_reg_m_series_mask)
  5122. return 1;
  5123. else
  5124. return 0;
  5125. break;
  5126. default:
  5127. return 0;
  5128. break;
  5129. }
  5130. }
  5131. static int ni_set_rtsi_routing(struct comedi_device *dev, unsigned chan,
  5132. unsigned source)
  5133. {
  5134. if (ni_valid_rtsi_output_source(dev, chan, source) == 0)
  5135. return -EINVAL;
  5136. if (chan < 4) {
  5137. devpriv->rtsi_trig_a_output_reg &= ~RTSI_Trig_Output_Mask(chan);
  5138. devpriv->rtsi_trig_a_output_reg |=
  5139. RTSI_Trig_Output_Bits(chan, source);
  5140. devpriv->stc_writew(dev, devpriv->rtsi_trig_a_output_reg,
  5141. RTSI_Trig_A_Output_Register);
  5142. } else if (chan < 8) {
  5143. devpriv->rtsi_trig_b_output_reg &= ~RTSI_Trig_Output_Mask(chan);
  5144. devpriv->rtsi_trig_b_output_reg |=
  5145. RTSI_Trig_Output_Bits(chan, source);
  5146. devpriv->stc_writew(dev, devpriv->rtsi_trig_b_output_reg,
  5147. RTSI_Trig_B_Output_Register);
  5148. }
  5149. return 2;
  5150. }
  5151. static unsigned ni_get_rtsi_routing(struct comedi_device *dev, unsigned chan)
  5152. {
  5153. if (chan < 4) {
  5154. return RTSI_Trig_Output_Source(chan,
  5155. devpriv->rtsi_trig_a_output_reg);
  5156. } else if (chan < num_configurable_rtsi_channels(dev)) {
  5157. return RTSI_Trig_Output_Source(chan,
  5158. devpriv->rtsi_trig_b_output_reg);
  5159. } else {
  5160. if (chan == old_RTSI_clock_channel)
  5161. return NI_RTSI_OUTPUT_RTSI_OSC;
  5162. printk("%s: bug! should never get here?\n", __func__);
  5163. return 0;
  5164. }
  5165. }
  5166. static int ni_rtsi_insn_config(struct comedi_device *dev,
  5167. struct comedi_subdevice *s,
  5168. struct comedi_insn *insn, unsigned int *data)
  5169. {
  5170. unsigned int chan = CR_CHAN(insn->chanspec);
  5171. switch (data[0]) {
  5172. case INSN_CONFIG_DIO_OUTPUT:
  5173. if (chan < num_configurable_rtsi_channels(dev)) {
  5174. devpriv->rtsi_trig_direction_reg |=
  5175. RTSI_Output_Bit(chan,
  5176. (boardtype.
  5177. reg_type & ni_reg_m_series_mask) !=
  5178. 0);
  5179. } else if (chan == old_RTSI_clock_channel) {
  5180. devpriv->rtsi_trig_direction_reg |=
  5181. Drive_RTSI_Clock_Bit;
  5182. }
  5183. devpriv->stc_writew(dev, devpriv->rtsi_trig_direction_reg,
  5184. RTSI_Trig_Direction_Register);
  5185. break;
  5186. case INSN_CONFIG_DIO_INPUT:
  5187. if (chan < num_configurable_rtsi_channels(dev)) {
  5188. devpriv->rtsi_trig_direction_reg &=
  5189. ~RTSI_Output_Bit(chan,
  5190. (boardtype.
  5191. reg_type & ni_reg_m_series_mask)
  5192. != 0);
  5193. } else if (chan == old_RTSI_clock_channel) {
  5194. devpriv->rtsi_trig_direction_reg &=
  5195. ~Drive_RTSI_Clock_Bit;
  5196. }
  5197. devpriv->stc_writew(dev, devpriv->rtsi_trig_direction_reg,
  5198. RTSI_Trig_Direction_Register);
  5199. break;
  5200. case INSN_CONFIG_DIO_QUERY:
  5201. if (chan < num_configurable_rtsi_channels(dev)) {
  5202. data[1] =
  5203. (devpriv->rtsi_trig_direction_reg &
  5204. RTSI_Output_Bit(chan,
  5205. (boardtype.reg_type &
  5206. ni_reg_m_series_mask)
  5207. != 0)) ? INSN_CONFIG_DIO_OUTPUT :
  5208. INSN_CONFIG_DIO_INPUT;
  5209. } else if (chan == old_RTSI_clock_channel) {
  5210. data[1] =
  5211. (devpriv->rtsi_trig_direction_reg &
  5212. Drive_RTSI_Clock_Bit)
  5213. ? INSN_CONFIG_DIO_OUTPUT : INSN_CONFIG_DIO_INPUT;
  5214. }
  5215. return 2;
  5216. break;
  5217. case INSN_CONFIG_SET_CLOCK_SRC:
  5218. return ni_set_master_clock(dev, data[1], data[2]);
  5219. break;
  5220. case INSN_CONFIG_GET_CLOCK_SRC:
  5221. data[1] = devpriv->clock_source;
  5222. data[2] = devpriv->clock_ns;
  5223. return 3;
  5224. break;
  5225. case INSN_CONFIG_SET_ROUTING:
  5226. return ni_set_rtsi_routing(dev, chan, data[1]);
  5227. break;
  5228. case INSN_CONFIG_GET_ROUTING:
  5229. data[1] = ni_get_rtsi_routing(dev, chan);
  5230. return 2;
  5231. break;
  5232. default:
  5233. return -EINVAL;
  5234. break;
  5235. }
  5236. return 1;
  5237. }
  5238. static int cs5529_wait_for_idle(struct comedi_device *dev)
  5239. {
  5240. unsigned short status;
  5241. const int timeout = HZ;
  5242. int i;
  5243. for (i = 0; i < timeout; i++) {
  5244. status = ni_ao_win_inw(dev, CAL_ADC_Status_67xx);
  5245. if ((status & CSS_ADC_BUSY) == 0) {
  5246. break;
  5247. }
  5248. set_current_state(TASK_INTERRUPTIBLE);
  5249. if (schedule_timeout(1)) {
  5250. return -EIO;
  5251. }
  5252. }
  5253. /* printk("looped %i times waiting for idle\n", i); */
  5254. if (i == timeout) {
  5255. printk("%s: %s: timeout\n", __FILE__, __func__);
  5256. return -ETIME;
  5257. }
  5258. return 0;
  5259. }
  5260. static void cs5529_command(struct comedi_device *dev, unsigned short value)
  5261. {
  5262. static const int timeout = 100;
  5263. int i;
  5264. ni_ao_win_outw(dev, value, CAL_ADC_Command_67xx);
  5265. /* give time for command to start being serially clocked into cs5529.
  5266. * this insures that the CSS_ADC_BUSY bit will get properly
  5267. * set before we exit this function.
  5268. */
  5269. for (i = 0; i < timeout; i++) {
  5270. if ((ni_ao_win_inw(dev, CAL_ADC_Status_67xx) & CSS_ADC_BUSY))
  5271. break;
  5272. udelay(1);
  5273. }
  5274. /* printk("looped %i times writing command to cs5529\n", i); */
  5275. if (i == timeout) {
  5276. comedi_error(dev, "possible problem - never saw adc go busy?");
  5277. }
  5278. }
  5279. /* write to cs5529 register */
  5280. static void cs5529_config_write(struct comedi_device *dev, unsigned int value,
  5281. unsigned int reg_select_bits)
  5282. {
  5283. ni_ao_win_outw(dev, ((value >> 16) & 0xff),
  5284. CAL_ADC_Config_Data_High_Word_67xx);
  5285. ni_ao_win_outw(dev, (value & 0xffff),
  5286. CAL_ADC_Config_Data_Low_Word_67xx);
  5287. reg_select_bits &= CSCMD_REGISTER_SELECT_MASK;
  5288. cs5529_command(dev, CSCMD_COMMAND | reg_select_bits);
  5289. if (cs5529_wait_for_idle(dev))
  5290. comedi_error(dev, "time or signal in cs5529_config_write()");
  5291. }
  5292. #ifdef NI_CS5529_DEBUG
  5293. /* read from cs5529 register */
  5294. static unsigned int cs5529_config_read(struct comedi_device *dev,
  5295. unsigned int reg_select_bits)
  5296. {
  5297. unsigned int value;
  5298. reg_select_bits &= CSCMD_REGISTER_SELECT_MASK;
  5299. cs5529_command(dev, CSCMD_COMMAND | CSCMD_READ | reg_select_bits);
  5300. if (cs5529_wait_for_idle(dev))
  5301. comedi_error(dev, "timeout or signal in cs5529_config_read()");
  5302. value = (ni_ao_win_inw(dev,
  5303. CAL_ADC_Config_Data_High_Word_67xx) << 16) &
  5304. 0xff0000;
  5305. value |= ni_ao_win_inw(dev, CAL_ADC_Config_Data_Low_Word_67xx) & 0xffff;
  5306. return value;
  5307. }
  5308. #endif
  5309. static int cs5529_do_conversion(struct comedi_device *dev, unsigned short *data)
  5310. {
  5311. int retval;
  5312. unsigned short status;
  5313. cs5529_command(dev, CSCMD_COMMAND | CSCMD_SINGLE_CONVERSION);
  5314. retval = cs5529_wait_for_idle(dev);
  5315. if (retval) {
  5316. comedi_error(dev,
  5317. "timeout or signal in cs5529_do_conversion()");
  5318. return -ETIME;
  5319. }
  5320. status = ni_ao_win_inw(dev, CAL_ADC_Status_67xx);
  5321. if (status & CSS_OSC_DETECT) {
  5322. printk
  5323. ("ni_mio_common: cs5529 conversion error, status CSS_OSC_DETECT\n");
  5324. return -EIO;
  5325. }
  5326. if (status & CSS_OVERRANGE) {
  5327. printk
  5328. ("ni_mio_common: cs5529 conversion error, overrange (ignoring)\n");
  5329. }
  5330. if (data) {
  5331. *data = ni_ao_win_inw(dev, CAL_ADC_Data_67xx);
  5332. /* cs5529 returns 16 bit signed data in bipolar mode */
  5333. *data ^= (1 << 15);
  5334. }
  5335. return 0;
  5336. }
  5337. static int cs5529_ai_insn_read(struct comedi_device *dev,
  5338. struct comedi_subdevice *s,
  5339. struct comedi_insn *insn, unsigned int *data)
  5340. {
  5341. int n, retval;
  5342. unsigned short sample;
  5343. unsigned int channel_select;
  5344. const unsigned int INTERNAL_REF = 0x1000;
  5345. /* Set calibration adc source. Docs lie, reference select bits 8 to 11
  5346. * do nothing. bit 12 seems to chooses internal reference voltage, bit
  5347. * 13 causes the adc input to go overrange (maybe reads external reference?) */
  5348. if (insn->chanspec & CR_ALT_SOURCE)
  5349. channel_select = INTERNAL_REF;
  5350. else
  5351. channel_select = CR_CHAN(insn->chanspec);
  5352. ni_ao_win_outw(dev, channel_select, AO_Calibration_Channel_Select_67xx);
  5353. for (n = 0; n < insn->n; n++) {
  5354. retval = cs5529_do_conversion(dev, &sample);
  5355. if (retval < 0)
  5356. return retval;
  5357. data[n] = sample;
  5358. }
  5359. return insn->n;
  5360. }
  5361. static int init_cs5529(struct comedi_device *dev)
  5362. {
  5363. unsigned int config_bits =
  5364. CSCFG_PORT_MODE | CSCFG_WORD_RATE_2180_CYCLES;
  5365. #if 1
  5366. /* do self-calibration */
  5367. cs5529_config_write(dev, config_bits | CSCFG_SELF_CAL_OFFSET_GAIN,
  5368. CSCMD_CONFIG_REGISTER);
  5369. /* need to force a conversion for calibration to run */
  5370. cs5529_do_conversion(dev, NULL);
  5371. #else
  5372. /* force gain calibration to 1 */
  5373. cs5529_config_write(dev, 0x400000, CSCMD_GAIN_REGISTER);
  5374. cs5529_config_write(dev, config_bits | CSCFG_SELF_CAL_OFFSET,
  5375. CSCMD_CONFIG_REGISTER);
  5376. if (cs5529_wait_for_idle(dev))
  5377. comedi_error(dev, "timeout or signal in init_cs5529()\n");
  5378. #endif
  5379. #ifdef NI_CS5529_DEBUG
  5380. printk("config: 0x%x\n", cs5529_config_read(dev,
  5381. CSCMD_CONFIG_REGISTER));
  5382. printk("gain: 0x%x\n", cs5529_config_read(dev, CSCMD_GAIN_REGISTER));
  5383. printk("offset: 0x%x\n", cs5529_config_read(dev,
  5384. CSCMD_OFFSET_REGISTER));
  5385. #endif
  5386. return 0;
  5387. }