* Copyright (c) 1982, 1986 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
* @(#)ad.c 7.2 (Berkeley) 5/12/87
* Data translation AD converter interface -- Bill Reeves
#include "../machine/pte.h"
#define ADWAITPRI (PZERO+1)
int adprobe(), adattach();
struct uba_device
*addinfo
[NAD
];
u_short adstd
[] = { 0770400, 0000000, 0 };
struct uba_driver addriver
=
{ adprobe
, 0, adattach
, 0, adstd
, "ad", addinfo
, 0, 0 };
#define ADUNIT(dev) (minor(dev))
register int br
, cvec
; /* value-result */
register struct addevice
*adaddr
= (struct addevice
*) reg
;
adaddr
->ad_csr
= AD_IENABLE
| AD_START
;
return (sizeof (struct addevice
));
register struct uba_device
*ui
;
if (ADUNIT(dev
) >= NAD
|| (adp
= &ad
[ADUNIT(dev
)])->ad_open
||
(ui
= addinfo
[ADUNIT(dev
)]) == 0 || ui
->ui_alive
== 0)
ad
[ADUNIT(dev
)].ad_open
= 0;
ad
[ADUNIT(dev
)].ad_state
= 0;
adioctl(dev
, cmd
, addr
, flag
)
register struct addevice
*adaddr
=
(struct addevice
*) addinfo
[ADUNIT(dev
)]->ui_addr
;
register struct uba_device
*ui
= addinfo
[ADUNIT(dev
)];
adp
->ad_chan
= (*(int *)addr
)<<8;
adaddr
->ad_csr
= adp
->ad_chan
;
while (i
-- > 0 && (adaddr
->ad_csr
&037400) != adp
->ad_chan
) {
adaddr
->ad_csr
= adp
->ad_chan
;
adaddr
->ad_csr
|= AD_IENABLE
|AD_START
;
while (adp
->ad_state
&ADBUSY
)
sleep((caddr_t
)adp
, ADWAITPRI
);
*(int *)addr
= adp
->ad_softdata
;
return (ENOTTY
); /* Not a legal ioctl cmd. */
register struct addevice
*adaddr
=
(struct addevice
*) addinfo
[ADUNIT(dev
)]->ui_addr
;
register struct ad
*adp
= &ad
[ADUNIT(dev
)];
adp
->ad_softcsr
= adaddr
->ad_csr
;
adp
->ad_softdata
= adaddr
->ad_data
;
if(adp
->ad_state
&ADBUSY
) {
adp
->ad_state
&= ~ADBUSY
;
register struct uba_device
*ui
;
register struct ad
*adp
= ad
;
register struct addevice
*adaddr
;
for(i
= 0; i
< NAD
; i
++, adp
++) {
if((ui
= addinfo
[i
]) == 0 || ui
->ui_alive
== 0 ||
ui
->ui_ubanum
!= uban
|| adp
->ad_open
== 0)
if(adp
->ad_state
&ADBUSY
== 0)
adaddr
= (struct addevice
*) ui
->ui_addr
;
adaddr
->ad_csr
= adp
->ad_chan
|AD_IENABLE
|AD_START
;