pm_direct.c revision 1.17.4.5 1 1.17.4.5 nathanw /* $NetBSD: pm_direct.c,v 1.17.4.5 2002/11/11 21:59:52 nathanw Exp $ */
2 1.17.4.2 nathanw
3 1.17.4.2 nathanw /*
4 1.17.4.2 nathanw * Copyright (C) 1997 Takashi Hamada
5 1.17.4.2 nathanw * All rights reserved.
6 1.17.4.2 nathanw *
7 1.17.4.2 nathanw * Redistribution and use in source and binary forms, with or without
8 1.17.4.2 nathanw * modification, are permitted provided that the following conditions
9 1.17.4.2 nathanw * are met:
10 1.17.4.2 nathanw * 1. Redistributions of source code must retain the above copyright
11 1.17.4.2 nathanw * notice, this list of conditions and the following disclaimer.
12 1.17.4.2 nathanw * 2. Redistributions in binary form must reproduce the above copyright
13 1.17.4.2 nathanw * notice, this list of conditions and the following disclaimer in the
14 1.17.4.2 nathanw * documentation and/or other materials provided with the distribution.
15 1.17.4.2 nathanw * 3. All advertising materials mentioning features or use of this software
16 1.17.4.2 nathanw * must display the following acknowledgement:
17 1.17.4.2 nathanw * This product includes software developed by Takashi Hamada
18 1.17.4.2 nathanw * 4. The name of the author may not be used to endorse or promote products
19 1.17.4.2 nathanw * derived from this software without specific prior written permission.
20 1.17.4.2 nathanw *
21 1.17.4.2 nathanw * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22 1.17.4.2 nathanw * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23 1.17.4.2 nathanw * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
24 1.17.4.2 nathanw * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
25 1.17.4.2 nathanw * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
26 1.17.4.2 nathanw * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 1.17.4.2 nathanw * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 1.17.4.2 nathanw * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 1.17.4.2 nathanw * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30 1.17.4.2 nathanw * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 1.17.4.2 nathanw */
32 1.17.4.2 nathanw /* From: pm_direct.c 1.3 03/18/98 Takashi Hamada */
33 1.17.4.2 nathanw
34 1.17.4.2 nathanw #include "opt_adb.h"
35 1.17.4.2 nathanw
36 1.17.4.2 nathanw #ifdef DEBUG
37 1.17.4.2 nathanw #ifndef ADB_DEBUG
38 1.17.4.2 nathanw #define ADB_DEBUG
39 1.17.4.2 nathanw #endif
40 1.17.4.2 nathanw #endif
41 1.17.4.2 nathanw
42 1.17.4.2 nathanw /* #define PM_GRAB_SI 1 */
43 1.17.4.2 nathanw
44 1.17.4.2 nathanw #include <sys/types.h>
45 1.17.4.2 nathanw #include <sys/cdefs.h>
46 1.17.4.2 nathanw #include <sys/systm.h>
47 1.17.4.2 nathanw
48 1.17.4.2 nathanw #include <machine/viareg.h>
49 1.17.4.2 nathanw #include <machine/param.h>
50 1.17.4.2 nathanw #include <machine/cpu.h>
51 1.17.4.2 nathanw #include <machine/adbsys.h>
52 1.17.4.2 nathanw
53 1.17.4.2 nathanw #include <mac68k/mac68k/macrom.h>
54 1.17.4.2 nathanw #include <mac68k/dev/adbvar.h>
55 1.17.4.2 nathanw #include <mac68k/dev/pm_direct.h>
56 1.17.4.2 nathanw
57 1.17.4.2 nathanw /* hardware dependent values */
58 1.17.4.2 nathanw extern u_short ADBDelay;
59 1.17.4.2 nathanw extern u_int32_t HwCfgFlags3;
60 1.17.4.2 nathanw extern struct mac68k_machine_S mac68k_machine;
61 1.17.4.2 nathanw
62 1.17.4.2 nathanw
63 1.17.4.2 nathanw /* define the types of the Power Manager */
64 1.17.4.2 nathanw #define PM_HW_UNKNOWN 0x00 /* don't know */
65 1.17.4.2 nathanw #define PM_HW_PB1XX 0x01 /* PowerBook 1XX series */
66 1.17.4.2 nathanw #define PM_HW_PB5XX 0x02 /* PowerBook Duo and 5XX series */
67 1.17.4.2 nathanw
68 1.17.4.2 nathanw /* useful macros */
69 1.17.4.2 nathanw #define PM_SR() via_reg(VIA1, vSR)
70 1.17.4.2 nathanw #define PM_VIA_INTR_ENABLE() via_reg(VIA1, vIER) = 0x90
71 1.17.4.2 nathanw #define PM_VIA_INTR_DISABLE() via_reg(VIA1, vIER) = 0x10
72 1.17.4.2 nathanw #define PM_VIA_CLR_INTR() via_reg(VIA1, vIFR) = 0x90
73 1.17.4.2 nathanw #define PM_SET_STATE_ACKON() via_reg(VIA2, vBufB) |= 0x04
74 1.17.4.2 nathanw #define PM_SET_STATE_ACKOFF() via_reg(VIA2, vBufB) &= ~0x04
75 1.17.4.2 nathanw #define PM_IS_ON (0x02 == (via_reg(VIA2, vBufB) & 0x02))
76 1.17.4.2 nathanw #define PM_IS_OFF (0x00 == (via_reg(VIA2, vBufB) & 0x02))
77 1.17.4.2 nathanw
78 1.17.4.2 nathanw /*
79 1.17.4.2 nathanw * Variables for internal use
80 1.17.4.2 nathanw */
81 1.17.4.2 nathanw int pmHardware = PM_HW_UNKNOWN;
82 1.17.4.2 nathanw u_short pm_existent_ADB_devices = 0x0; /* each bit expresses the existent ADB device */
83 1.17.4.2 nathanw u_int pm_LCD_brightness = 0x0;
84 1.17.4.2 nathanw u_int pm_LCD_contrast = 0x0;
85 1.17.4.2 nathanw u_int pm_counter = 0; /* clock count */
86 1.17.4.2 nathanw
87 1.17.4.2 nathanw /* these values shows that number of data returned after 'send' cmd is sent */
88 1.17.4.2 nathanw char pm_send_cmd_type[] = {
89 1.17.4.2 nathanw 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
90 1.17.4.2 nathanw 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
91 1.17.4.2 nathanw 0x01, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
92 1.17.4.2 nathanw 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
93 1.17.4.2 nathanw 0xff, 0x00, 0x02, 0x01, 0x01, 0xff, 0xff, 0xff,
94 1.17.4.2 nathanw 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
95 1.17.4.2 nathanw 0x04, 0x14, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
96 1.17.4.2 nathanw 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff,
97 1.17.4.2 nathanw 0x01, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
98 1.17.4.2 nathanw 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
99 1.17.4.2 nathanw 0x01, 0x00, 0x02, 0x02, 0xff, 0x01, 0x03, 0x01,
100 1.17.4.2 nathanw 0x00, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
101 1.17.4.2 nathanw 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
102 1.17.4.2 nathanw 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
103 1.17.4.2 nathanw 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff,
104 1.17.4.2 nathanw 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x04, 0x04,
105 1.17.4.2 nathanw 0x04, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff,
106 1.17.4.2 nathanw 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
107 1.17.4.2 nathanw 0x01, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
108 1.17.4.2 nathanw 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
109 1.17.4.2 nathanw 0x02, 0x02, 0x02, 0x04, 0xff, 0x00, 0xff, 0xff,
110 1.17.4.2 nathanw 0x01, 0x01, 0x03, 0x02, 0xff, 0xff, 0xff, 0xff,
111 1.17.4.2 nathanw 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
112 1.17.4.2 nathanw 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
113 1.17.4.2 nathanw 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
114 1.17.4.2 nathanw 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
115 1.17.4.2 nathanw 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
116 1.17.4.2 nathanw 0x01, 0x01, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff,
117 1.17.4.2 nathanw 0xff, 0x04, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff,
118 1.17.4.2 nathanw 0x03, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00,
119 1.17.4.2 nathanw 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
120 1.17.4.2 nathanw 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
121 1.17.4.2 nathanw };
122 1.17.4.2 nathanw
123 1.17.4.2 nathanw /* these values shows that number of data returned after 'receive' cmd is sent */
124 1.17.4.2 nathanw char pm_receive_cmd_type[] = {
125 1.17.4.2 nathanw 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
126 1.17.4.2 nathanw 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
127 1.17.4.2 nathanw 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
128 1.17.4.2 nathanw 0x02, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
129 1.17.4.2 nathanw 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
130 1.17.4.2 nathanw 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
131 1.17.4.2 nathanw 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
132 1.17.4.2 nathanw 0x05, 0x15, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
133 1.17.4.2 nathanw 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
134 1.17.4.2 nathanw 0x02, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
135 1.17.4.2 nathanw 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
136 1.17.4.2 nathanw 0x02, 0x00, 0x03, 0x03, 0xff, 0xff, 0xff, 0xff,
137 1.17.4.2 nathanw 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
138 1.17.4.2 nathanw 0x04, 0x04, 0x03, 0x09, 0xff, 0xff, 0xff, 0xff,
139 1.17.4.2 nathanw 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
140 1.17.4.2 nathanw 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x01,
141 1.17.4.2 nathanw 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
142 1.17.4.2 nathanw 0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
143 1.17.4.2 nathanw 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
144 1.17.4.2 nathanw 0x02, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
145 1.17.4.2 nathanw 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
146 1.17.4.2 nathanw 0x02, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
147 1.17.4.2 nathanw 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
148 1.17.4.2 nathanw 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
149 1.17.4.2 nathanw 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
150 1.17.4.2 nathanw 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
151 1.17.4.2 nathanw 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
152 1.17.4.2 nathanw 0x02, 0x02, 0xff, 0xff, 0x02, 0xff, 0xff, 0xff,
153 1.17.4.2 nathanw 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
154 1.17.4.2 nathanw 0xff, 0xff, 0x02, 0xff, 0xff, 0xff, 0xff, 0x00,
155 1.17.4.2 nathanw 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
156 1.17.4.2 nathanw 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
157 1.17.4.2 nathanw };
158 1.17.4.2 nathanw
159 1.17.4.2 nathanw
160 1.17.4.2 nathanw /*
161 1.17.4.2 nathanw * Define the private functions
162 1.17.4.2 nathanw */
163 1.17.4.2 nathanw
164 1.17.4.2 nathanw /* for debugging */
165 1.17.4.2 nathanw #ifdef ADB_DEBUG
166 1.17.4.2 nathanw void pm_printerr __P((char *, int, int, char *));
167 1.17.4.2 nathanw #endif
168 1.17.4.2 nathanw
169 1.17.4.2 nathanw int pm_wait_busy __P((int));
170 1.17.4.2 nathanw int pm_wait_free __P((int));
171 1.17.4.2 nathanw
172 1.17.4.2 nathanw /* these functions are for the PB1XX series */
173 1.17.4.2 nathanw int pm_receive_pm1 __P((u_char *));
174 1.17.4.2 nathanw int pm_send_pm1 __P((u_char,int));
175 1.17.4.2 nathanw int pm_pmgrop_pm1 __P((PMData *));
176 1.17.4.2 nathanw void pm_intr_pm1 __P((void *));
177 1.17.4.2 nathanw
178 1.17.4.2 nathanw /* these functions are for the PB Duo series and the PB 5XX series */
179 1.17.4.2 nathanw int pm_receive_pm2 __P((u_char *));
180 1.17.4.2 nathanw int pm_send_pm2 __P((u_char));
181 1.17.4.2 nathanw int pm_pmgrop_pm2 __P((PMData *));
182 1.17.4.2 nathanw void pm_intr_pm2 __P((void *));
183 1.17.4.2 nathanw
184 1.17.4.2 nathanw /* this function is MRG-Based (for testing) */
185 1.17.4.2 nathanw int pm_pmgrop_mrg __P((PMData *));
186 1.17.4.2 nathanw
187 1.17.4.2 nathanw /* these functions are called from adb_direct.c */
188 1.17.4.2 nathanw void pm_setup_adb __P((void));
189 1.17.4.2 nathanw void pm_check_adb_devices __P((int));
190 1.17.4.2 nathanw void pm_intr __P((void *));
191 1.17.4.2 nathanw int pm_adb_op __P((u_char *, void *, void *, int));
192 1.17.4.2 nathanw void pm_hw_setup __P((void));
193 1.17.4.2 nathanw
194 1.17.4.2 nathanw /* these functions also use the variables of adb_direct.c */
195 1.17.4.2 nathanw void pm_adb_get_TALK_result __P((PMData *));
196 1.17.4.2 nathanw void pm_adb_get_ADB_data __P((PMData *));
197 1.17.4.2 nathanw void pm_adb_poll_next_device_pm1 __P((PMData *));
198 1.17.4.2 nathanw
199 1.17.4.2 nathanw
200 1.17.4.2 nathanw /*
201 1.17.4.2 nathanw * These variables are in adb_direct.c.
202 1.17.4.2 nathanw */
203 1.17.4.2 nathanw extern u_char *adbBuffer; /* pointer to user data area */
204 1.17.4.2 nathanw extern void *adbCompRout; /* pointer to the completion routine */
205 1.17.4.2 nathanw extern void *adbCompData; /* pointer to the completion routine data */
206 1.17.4.2 nathanw extern int adbWaiting; /* waiting for return data from the device */
207 1.17.4.2 nathanw extern int adbWaitingCmd; /* ADB command we are waiting for */
208 1.17.4.2 nathanw extern int adbStarting; /* doing ADB reinit, so do "polling" differently */
209 1.17.4.2 nathanw
210 1.17.4.2 nathanw #define ADB_MAX_MSG_LENGTH 16
211 1.17.4.2 nathanw #define ADB_MAX_HDR_LENGTH 8
212 1.17.4.2 nathanw struct adbCommand {
213 1.17.4.2 nathanw u_char header[ADB_MAX_HDR_LENGTH]; /* not used yet */
214 1.17.4.2 nathanw u_char data[ADB_MAX_MSG_LENGTH]; /* packet data only */
215 1.17.4.2 nathanw u_char *saveBuf; /* where to save result */
216 1.17.4.2 nathanw u_char *compRout; /* completion routine pointer */
217 1.17.4.2 nathanw u_char *compData; /* completion routine data pointer */
218 1.17.4.2 nathanw u_int cmd; /* the original command for this data */
219 1.17.4.2 nathanw u_int unsol; /* 1 if packet was unsolicited */
220 1.17.4.2 nathanw u_int ack_only; /* 1 for no special processing */
221 1.17.4.2 nathanw };
222 1.17.4.2 nathanw extern void adb_pass_up __P((struct adbCommand *));
223 1.17.4.2 nathanw
224 1.17.4.2 nathanw #ifdef ADB_DEBUG
225 1.17.4.2 nathanw /*
226 1.17.4.2 nathanw * This function dumps contents of the PMData
227 1.17.4.2 nathanw */
228 1.17.4.2 nathanw void
229 1.17.4.2 nathanw pm_printerr(ttl, rval, num, data)
230 1.17.4.2 nathanw char *ttl;
231 1.17.4.2 nathanw int rval;
232 1.17.4.2 nathanw int num;
233 1.17.4.2 nathanw char *data;
234 1.17.4.2 nathanw {
235 1.17.4.2 nathanw int i;
236 1.17.4.2 nathanw
237 1.17.4.2 nathanw printf("pm: %s:%04x %02x ", ttl, rval, num);
238 1.17.4.2 nathanw for (i = 0; i < num; i++)
239 1.17.4.2 nathanw printf("%02x ", data[i]);
240 1.17.4.2 nathanw printf("\n");
241 1.17.4.2 nathanw }
242 1.17.4.2 nathanw #endif
243 1.17.4.2 nathanw
244 1.17.4.2 nathanw
245 1.17.4.2 nathanw
246 1.17.4.2 nathanw /*
247 1.17.4.2 nathanw * Check the hardware type of the Power Manager
248 1.17.4.2 nathanw */
249 1.17.4.2 nathanw void
250 1.17.4.2 nathanw pm_setup_adb()
251 1.17.4.2 nathanw {
252 1.17.4.2 nathanw switch (mac68k_machine.machineid) {
253 1.17.4.2 nathanw case MACH_MACPB140:
254 1.17.4.2 nathanw case MACH_MACPB145:
255 1.17.4.2 nathanw case MACH_MACPB160:
256 1.17.4.2 nathanw case MACH_MACPB165:
257 1.17.4.2 nathanw case MACH_MACPB165C:
258 1.17.4.2 nathanw case MACH_MACPB170:
259 1.17.4.2 nathanw case MACH_MACPB180:
260 1.17.4.2 nathanw case MACH_MACPB180C:
261 1.17.4.2 nathanw pmHardware = PM_HW_PB1XX;
262 1.17.4.2 nathanw break;
263 1.17.4.3 nathanw case MACH_MACPB150:
264 1.17.4.2 nathanw case MACH_MACPB210:
265 1.17.4.2 nathanw case MACH_MACPB230:
266 1.17.4.2 nathanw case MACH_MACPB250:
267 1.17.4.2 nathanw case MACH_MACPB270:
268 1.17.4.2 nathanw case MACH_MACPB280:
269 1.17.4.2 nathanw case MACH_MACPB280C:
270 1.17.4.2 nathanw case MACH_MACPB500:
271 1.17.4.5 nathanw case MACH_MACPB190:
272 1.17.4.5 nathanw case MACH_MACPB190CS:
273 1.17.4.2 nathanw pmHardware = PM_HW_PB5XX;
274 1.17.4.2 nathanw break;
275 1.17.4.2 nathanw default:
276 1.17.4.2 nathanw break;
277 1.17.4.2 nathanw }
278 1.17.4.2 nathanw }
279 1.17.4.2 nathanw
280 1.17.4.2 nathanw
281 1.17.4.2 nathanw /*
282 1.17.4.2 nathanw * Check the existent ADB devices
283 1.17.4.2 nathanw */
284 1.17.4.2 nathanw void
285 1.17.4.2 nathanw pm_check_adb_devices(id)
286 1.17.4.2 nathanw int id;
287 1.17.4.2 nathanw {
288 1.17.4.2 nathanw u_short ed = 0x1;
289 1.17.4.2 nathanw
290 1.17.4.2 nathanw ed <<= id;
291 1.17.4.2 nathanw pm_existent_ADB_devices |= ed;
292 1.17.4.2 nathanw }
293 1.17.4.2 nathanw
294 1.17.4.2 nathanw
295 1.17.4.2 nathanw /*
296 1.17.4.2 nathanw * Wait until PM IC is busy
297 1.17.4.2 nathanw */
298 1.17.4.2 nathanw int
299 1.17.4.2 nathanw pm_wait_busy(delay)
300 1.17.4.2 nathanw int delay;
301 1.17.4.2 nathanw {
302 1.17.4.2 nathanw while (PM_IS_ON) {
303 1.17.4.2 nathanw #ifdef PM_GRAB_SI
304 1.17.4.2 nathanw (void)intr_dispatch(0x70); /* grab any serial interrupts */
305 1.17.4.2 nathanw #endif
306 1.17.4.2 nathanw if ((--delay) < 0)
307 1.17.4.2 nathanw return 1; /* timeout */
308 1.17.4.2 nathanw }
309 1.17.4.2 nathanw return 0;
310 1.17.4.2 nathanw }
311 1.17.4.2 nathanw
312 1.17.4.2 nathanw
313 1.17.4.2 nathanw /*
314 1.17.4.2 nathanw * Wait until PM IC is free
315 1.17.4.2 nathanw */
316 1.17.4.2 nathanw int
317 1.17.4.2 nathanw pm_wait_free(delay)
318 1.17.4.2 nathanw int delay;
319 1.17.4.2 nathanw {
320 1.17.4.2 nathanw while (PM_IS_OFF) {
321 1.17.4.2 nathanw #ifdef PM_GRAB_SI
322 1.17.4.2 nathanw (void)intr_dispatch(0x70); /* grab any serial interrupts */
323 1.17.4.2 nathanw #endif
324 1.17.4.2 nathanw if ((--delay) < 0)
325 1.17.4.2 nathanw return 0; /* timeout */
326 1.17.4.2 nathanw }
327 1.17.4.2 nathanw return 1;
328 1.17.4.2 nathanw }
329 1.17.4.2 nathanw
330 1.17.4.2 nathanw
331 1.17.4.2 nathanw
332 1.17.4.2 nathanw /*
333 1.17.4.2 nathanw * Functions for the PB1XX series
334 1.17.4.2 nathanw */
335 1.17.4.2 nathanw
336 1.17.4.2 nathanw /*
337 1.17.4.2 nathanw * Receive data from PM for the PB1XX series
338 1.17.4.2 nathanw */
339 1.17.4.2 nathanw int
340 1.17.4.2 nathanw pm_receive_pm1(data)
341 1.17.4.2 nathanw u_char *data;
342 1.17.4.2 nathanw {
343 1.17.4.2 nathanw int rval = 0xffffcd34;
344 1.17.4.2 nathanw
345 1.17.4.2 nathanw via_reg(VIA2, vDirA) = 0x00;
346 1.17.4.2 nathanw
347 1.17.4.2 nathanw switch (1) {
348 1.17.4.2 nathanw default:
349 1.17.4.2 nathanw if (pm_wait_busy(0x40) != 0)
350 1.17.4.2 nathanw break; /* timeout */
351 1.17.4.2 nathanw
352 1.17.4.2 nathanw PM_SET_STATE_ACKOFF();
353 1.17.4.2 nathanw *data = via_reg(VIA2, 0x200);
354 1.17.4.2 nathanw
355 1.17.4.2 nathanw rval = 0xffffcd33;
356 1.17.4.2 nathanw if (pm_wait_free(0x40) == 0)
357 1.17.4.2 nathanw break; /* timeout */
358 1.17.4.2 nathanw
359 1.17.4.2 nathanw rval = 0x00;
360 1.17.4.2 nathanw break;
361 1.17.4.2 nathanw }
362 1.17.4.2 nathanw
363 1.17.4.2 nathanw PM_SET_STATE_ACKON();
364 1.17.4.2 nathanw via_reg(VIA2, vDirA) = 0x00;
365 1.17.4.2 nathanw
366 1.17.4.2 nathanw return rval;
367 1.17.4.2 nathanw }
368 1.17.4.2 nathanw
369 1.17.4.2 nathanw
370 1.17.4.2 nathanw
371 1.17.4.2 nathanw /*
372 1.17.4.2 nathanw * Send data to PM for the PB1XX series
373 1.17.4.2 nathanw */
374 1.17.4.2 nathanw int
375 1.17.4.2 nathanw pm_send_pm1(data, timo)
376 1.17.4.2 nathanw u_char data;
377 1.17.4.2 nathanw int timo;
378 1.17.4.2 nathanw {
379 1.17.4.2 nathanw int rval;
380 1.17.4.2 nathanw
381 1.17.4.2 nathanw via_reg(VIA2, vDirA) = 0xff;
382 1.17.4.2 nathanw via_reg(VIA2, 0x200) = data;
383 1.17.4.2 nathanw
384 1.17.4.2 nathanw PM_SET_STATE_ACKOFF();
385 1.17.4.2 nathanw #if 0
386 1.17.4.2 nathanw if (pm_wait_busy(0x400) == 0) {
387 1.17.4.2 nathanw #else
388 1.17.4.2 nathanw if (pm_wait_busy(timo) == 0) {
389 1.17.4.2 nathanw #endif
390 1.17.4.2 nathanw PM_SET_STATE_ACKON();
391 1.17.4.2 nathanw if (pm_wait_free(0x40) != 0)
392 1.17.4.2 nathanw rval = 0x0;
393 1.17.4.2 nathanw else
394 1.17.4.2 nathanw rval = 0xffffcd35;
395 1.17.4.2 nathanw } else {
396 1.17.4.2 nathanw rval = 0xffffcd36;
397 1.17.4.2 nathanw }
398 1.17.4.2 nathanw
399 1.17.4.2 nathanw PM_SET_STATE_ACKON();
400 1.17.4.2 nathanw via_reg(VIA2, vDirA) = 0x00;
401 1.17.4.2 nathanw
402 1.17.4.2 nathanw return rval;
403 1.17.4.2 nathanw }
404 1.17.4.2 nathanw
405 1.17.4.2 nathanw
406 1.17.4.2 nathanw /*
407 1.17.4.2 nathanw * My PMgrOp routine for the PB1XX series
408 1.17.4.2 nathanw */
409 1.17.4.2 nathanw int
410 1.17.4.2 nathanw pm_pmgrop_pm1(pmdata)
411 1.17.4.2 nathanw PMData *pmdata;
412 1.17.4.2 nathanw {
413 1.17.4.2 nathanw int i;
414 1.17.4.2 nathanw int s = 0x81815963;
415 1.17.4.2 nathanw u_char via1_vIER, via1_vDirA;
416 1.17.4.2 nathanw int rval = 0;
417 1.17.4.2 nathanw int num_pm_data = 0;
418 1.17.4.2 nathanw u_char pm_cmd;
419 1.17.4.2 nathanw u_char pm_data;
420 1.17.4.2 nathanw u_char *pm_buf;
421 1.17.4.2 nathanw
422 1.17.4.2 nathanw /* disable all inetrrupts but PM */
423 1.17.4.2 nathanw via1_vIER = via_reg(VIA1, vIER);
424 1.17.4.2 nathanw PM_VIA_INTR_DISABLE();
425 1.17.4.2 nathanw
426 1.17.4.2 nathanw via1_vDirA = via_reg(VIA1, vDirA);
427 1.17.4.2 nathanw
428 1.17.4.2 nathanw switch (pmdata->command) {
429 1.17.4.2 nathanw default:
430 1.17.4.2 nathanw for (i = 0; i < 7; i++) {
431 1.17.4.2 nathanw via_reg(VIA2, vDirA) = 0x00;
432 1.17.4.2 nathanw
433 1.17.4.2 nathanw /* wait until PM is free */
434 1.17.4.2 nathanw if (pm_wait_free(ADBDelay) == 0) { /* timeout */
435 1.17.4.2 nathanw via_reg(VIA2, vDirA) = 0x00;
436 1.17.4.2 nathanw /* restore formar value */
437 1.17.4.2 nathanw via_reg(VIA1, vDirA) = via1_vDirA;
438 1.17.4.2 nathanw via_reg(VIA1, vIER) = via1_vIER;
439 1.17.4.2 nathanw return 0xffffcd38;
440 1.17.4.2 nathanw }
441 1.17.4.2 nathanw
442 1.17.4.2 nathanw switch (mac68k_machine.machineid) {
443 1.17.4.2 nathanw case MACH_MACPB160:
444 1.17.4.2 nathanw case MACH_MACPB165:
445 1.17.4.2 nathanw case MACH_MACPB165C:
446 1.17.4.2 nathanw case MACH_MACPB170:
447 1.17.4.2 nathanw case MACH_MACPB180:
448 1.17.4.2 nathanw case MACH_MACPB180C:
449 1.17.4.2 nathanw {
450 1.17.4.2 nathanw int delay = ADBDelay * 16;
451 1.17.4.2 nathanw
452 1.17.4.2 nathanw via_reg(VIA2, vDirA) = 0x00;
453 1.17.4.2 nathanw while ((via_reg(VIA2, 0x200) == 0x7f) && (delay >= 0))
454 1.17.4.2 nathanw delay--;
455 1.17.4.2 nathanw
456 1.17.4.2 nathanw if (delay < 0) { /* timeout */
457 1.17.4.2 nathanw via_reg(VIA2, vDirA) = 0x00;
458 1.17.4.2 nathanw /* restore formar value */
459 1.17.4.2 nathanw via_reg(VIA1, vIER) = via1_vIER;
460 1.17.4.2 nathanw return 0xffffcd38;
461 1.17.4.2 nathanw }
462 1.17.4.2 nathanw }
463 1.17.4.2 nathanw } /* end switch */
464 1.17.4.2 nathanw
465 1.17.4.2 nathanw s = splhigh();
466 1.17.4.2 nathanw
467 1.17.4.2 nathanw via1_vDirA = via_reg(VIA1, vDirA);
468 1.17.4.2 nathanw via_reg(VIA1, vDirA) &= 0x7f;
469 1.17.4.2 nathanw
470 1.17.4.2 nathanw pm_cmd = (u_char)(pmdata->command & 0xff);
471 1.17.4.2 nathanw if ((rval = pm_send_pm1(pm_cmd, ADBDelay * 8)) == 0)
472 1.17.4.2 nathanw break; /* send command succeeded */
473 1.17.4.2 nathanw
474 1.17.4.2 nathanw via_reg(VIA1, vDirA) = via1_vDirA;
475 1.17.4.2 nathanw splx(s);
476 1.17.4.2 nathanw } /* end for */
477 1.17.4.2 nathanw
478 1.17.4.2 nathanw /* failed to send a command */
479 1.17.4.2 nathanw if (i == 7) {
480 1.17.4.2 nathanw via_reg(VIA2, vDirA) = 0x00;
481 1.17.4.2 nathanw /* restore formar value */
482 1.17.4.2 nathanw via_reg(VIA1, vDirA) = via1_vDirA;
483 1.17.4.2 nathanw via_reg(VIA1, vIER) = via1_vIER;
484 1.17.4.2 nathanw if (s != 0x81815963)
485 1.17.4.2 nathanw splx(s);
486 1.17.4.2 nathanw return 0xffffcd38;
487 1.17.4.2 nathanw }
488 1.17.4.2 nathanw
489 1.17.4.2 nathanw /* send # of PM data */
490 1.17.4.2 nathanw num_pm_data = pmdata->num_data;
491 1.17.4.2 nathanw if ((rval = pm_send_pm1((u_char)(num_pm_data & 0xff), ADBDelay * 8)) != 0)
492 1.17.4.2 nathanw break; /* timeout */
493 1.17.4.2 nathanw
494 1.17.4.2 nathanw /* send PM data */
495 1.17.4.2 nathanw pm_buf = (u_char *)pmdata->s_buf;
496 1.17.4.2 nathanw for (i = 0; i < num_pm_data; i++)
497 1.17.4.2 nathanw if ((rval = pm_send_pm1(pm_buf[i], ADBDelay * 8)) != 0)
498 1.17.4.2 nathanw break; /* timeout */
499 1.17.4.2 nathanw if ((i != num_pm_data) && (num_pm_data != 0))
500 1.17.4.2 nathanw break; /* timeout */
501 1.17.4.2 nathanw
502 1.17.4.2 nathanw /* Will PM IC return data? */
503 1.17.4.2 nathanw if ((pm_cmd & 0x08) == 0) {
504 1.17.4.2 nathanw rval = 0;
505 1.17.4.2 nathanw break; /* no returned data */
506 1.17.4.2 nathanw }
507 1.17.4.2 nathanw
508 1.17.4.2 nathanw rval = 0xffffcd37;
509 1.17.4.2 nathanw if (pm_wait_busy(ADBDelay) != 0)
510 1.17.4.2 nathanw break; /* timeout */
511 1.17.4.2 nathanw
512 1.17.4.2 nathanw /* receive PM command */
513 1.17.4.2 nathanw if ((rval = pm_receive_pm1(&pm_data)) != 0)
514 1.17.4.2 nathanw break;
515 1.17.4.2 nathanw
516 1.17.4.2 nathanw pmdata->command = pm_data;
517 1.17.4.2 nathanw
518 1.17.4.2 nathanw /* receive number of PM data */
519 1.17.4.2 nathanw if ((rval = pm_receive_pm1(&pm_data)) != 0)
520 1.17.4.2 nathanw break; /* timeout */
521 1.17.4.2 nathanw num_pm_data = pm_data;
522 1.17.4.2 nathanw pmdata->num_data = num_pm_data;
523 1.17.4.2 nathanw
524 1.17.4.2 nathanw /* receive PM data */
525 1.17.4.2 nathanw pm_buf = (u_char *)pmdata->r_buf;
526 1.17.4.2 nathanw for (i = 0; i < num_pm_data; i++) {
527 1.17.4.2 nathanw if ((rval = pm_receive_pm1(&pm_data)) != 0)
528 1.17.4.2 nathanw break; /* timeout */
529 1.17.4.2 nathanw pm_buf[i] = pm_data;
530 1.17.4.2 nathanw }
531 1.17.4.2 nathanw
532 1.17.4.2 nathanw rval = 0;
533 1.17.4.2 nathanw }
534 1.17.4.2 nathanw
535 1.17.4.2 nathanw via_reg(VIA2, vDirA) = 0x00;
536 1.17.4.2 nathanw
537 1.17.4.2 nathanw /* restore formar value */
538 1.17.4.2 nathanw via_reg(VIA1, vDirA) = via1_vDirA;
539 1.17.4.2 nathanw via_reg(VIA1, vIER) = via1_vIER;
540 1.17.4.2 nathanw if (s != 0x81815963)
541 1.17.4.2 nathanw splx(s);
542 1.17.4.2 nathanw
543 1.17.4.2 nathanw return rval;
544 1.17.4.2 nathanw }
545 1.17.4.2 nathanw
546 1.17.4.2 nathanw
547 1.17.4.2 nathanw /*
548 1.17.4.2 nathanw * My PM interrupt routine for PB1XX series
549 1.17.4.2 nathanw */
550 1.17.4.2 nathanw void
551 1.17.4.2 nathanw pm_intr_pm1(arg)
552 1.17.4.2 nathanw void *arg;
553 1.17.4.2 nathanw {
554 1.17.4.2 nathanw int s;
555 1.17.4.2 nathanw int rval;
556 1.17.4.2 nathanw PMData pmdata;
557 1.17.4.2 nathanw
558 1.17.4.2 nathanw s = splhigh();
559 1.17.4.2 nathanw
560 1.17.4.2 nathanw PM_VIA_CLR_INTR(); /* clear VIA1 interrupt */
561 1.17.4.2 nathanw
562 1.17.4.2 nathanw /* ask PM what happend */
563 1.17.4.2 nathanw pmdata.command = 0x78;
564 1.17.4.2 nathanw pmdata.num_data = 0;
565 1.17.4.2 nathanw pmdata.data[0] = pmdata.data[1] = 0;
566 1.17.4.2 nathanw pmdata.s_buf = &pmdata.data[2];
567 1.17.4.2 nathanw pmdata.r_buf = &pmdata.data[2];
568 1.17.4.2 nathanw rval = pm_pmgrop_pm1(&pmdata);
569 1.17.4.2 nathanw if (rval != 0) {
570 1.17.4.2 nathanw #ifdef ADB_DEBUG
571 1.17.4.2 nathanw if (adb_debug)
572 1.17.4.2 nathanw printf("pm: PM is not ready. error code=%08x\n", rval);
573 1.17.4.2 nathanw #endif
574 1.17.4.2 nathanw splx(s);
575 1.17.4.2 nathanw }
576 1.17.4.2 nathanw
577 1.17.4.2 nathanw if ((pmdata.data[2] & 0x10) == 0x10) {
578 1.17.4.2 nathanw if ((pmdata.data[2] & 0x0f) == 0) {
579 1.17.4.2 nathanw /* ADB data that were requested by TALK command */
580 1.17.4.2 nathanw pm_adb_get_TALK_result(&pmdata);
581 1.17.4.2 nathanw } else if ((pmdata.data[2] & 0x08) == 0x8) {
582 1.17.4.2 nathanw /* PM is requesting to poll */
583 1.17.4.2 nathanw pm_adb_poll_next_device_pm1(&pmdata);
584 1.17.4.2 nathanw } else if ((pmdata.data[2] & 0x04) == 0x4) {
585 1.17.4.2 nathanw /* ADB device event */
586 1.17.4.2 nathanw pm_adb_get_ADB_data(&pmdata);
587 1.17.4.2 nathanw }
588 1.17.4.2 nathanw } else {
589 1.17.4.2 nathanw #ifdef ADB_DEBUG
590 1.17.4.2 nathanw if (adb_debug)
591 1.17.4.2 nathanw pm_printerr("driver does not supported this event.",
592 1.17.4.2 nathanw rval, pmdata.num_data, pmdata.data);
593 1.17.4.2 nathanw #endif
594 1.17.4.2 nathanw }
595 1.17.4.2 nathanw
596 1.17.4.2 nathanw splx(s);
597 1.17.4.2 nathanw }
598 1.17.4.2 nathanw
599 1.17.4.2 nathanw
600 1.17.4.2 nathanw
601 1.17.4.2 nathanw /*
602 1.17.4.2 nathanw * Functions for the PB Duo series and the PB 5XX series
603 1.17.4.2 nathanw */
604 1.17.4.2 nathanw
605 1.17.4.2 nathanw /*
606 1.17.4.2 nathanw * Receive data from PM for the PB Duo series and the PB 5XX series
607 1.17.4.2 nathanw */
608 1.17.4.2 nathanw int
609 1.17.4.2 nathanw pm_receive_pm2(data)
610 1.17.4.2 nathanw u_char *data;
611 1.17.4.2 nathanw {
612 1.17.4.2 nathanw int i;
613 1.17.4.2 nathanw int rval;
614 1.17.4.2 nathanw
615 1.17.4.2 nathanw rval = 0xffffcd34;
616 1.17.4.2 nathanw
617 1.17.4.2 nathanw switch (1) {
618 1.17.4.2 nathanw default:
619 1.17.4.2 nathanw /* set VIA SR to input mode */
620 1.17.4.2 nathanw via_reg(VIA1, vACR) |= 0x0c;
621 1.17.4.2 nathanw via_reg(VIA1, vACR) &= ~0x10;
622 1.17.4.2 nathanw i = PM_SR();
623 1.17.4.2 nathanw
624 1.17.4.2 nathanw PM_SET_STATE_ACKOFF();
625 1.17.4.2 nathanw if (pm_wait_busy((int)ADBDelay*32) != 0)
626 1.17.4.2 nathanw break; /* timeout */
627 1.17.4.2 nathanw
628 1.17.4.2 nathanw PM_SET_STATE_ACKON();
629 1.17.4.2 nathanw rval = 0xffffcd33;
630 1.17.4.2 nathanw if (pm_wait_free((int)ADBDelay*32) == 0)
631 1.17.4.2 nathanw break; /* timeout */
632 1.17.4.2 nathanw
633 1.17.4.2 nathanw *data = PM_SR();
634 1.17.4.2 nathanw rval = 0;
635 1.17.4.2 nathanw
636 1.17.4.2 nathanw break;
637 1.17.4.2 nathanw }
638 1.17.4.2 nathanw
639 1.17.4.2 nathanw PM_SET_STATE_ACKON();
640 1.17.4.2 nathanw via_reg(VIA1, vACR) |= 0x1c;
641 1.17.4.2 nathanw
642 1.17.4.2 nathanw return rval;
643 1.17.4.2 nathanw }
644 1.17.4.2 nathanw
645 1.17.4.2 nathanw
646 1.17.4.2 nathanw
647 1.17.4.2 nathanw /*
648 1.17.4.2 nathanw * Send data to PM for the PB Duo series and the PB 5XX series
649 1.17.4.2 nathanw */
650 1.17.4.2 nathanw int
651 1.17.4.2 nathanw pm_send_pm2(data)
652 1.17.4.2 nathanw u_char data;
653 1.17.4.2 nathanw {
654 1.17.4.2 nathanw int rval;
655 1.17.4.2 nathanw
656 1.17.4.2 nathanw via_reg(VIA1, vACR) |= 0x1c;
657 1.17.4.2 nathanw PM_SR() = data;
658 1.17.4.2 nathanw
659 1.17.4.2 nathanw PM_SET_STATE_ACKOFF();
660 1.17.4.2 nathanw if (pm_wait_busy((int)ADBDelay*32) == 0) {
661 1.17.4.2 nathanw PM_SET_STATE_ACKON();
662 1.17.4.2 nathanw if (pm_wait_free((int)ADBDelay*32) != 0)
663 1.17.4.2 nathanw rval = 0;
664 1.17.4.2 nathanw else
665 1.17.4.2 nathanw rval = 0xffffcd35;
666 1.17.4.2 nathanw } else {
667 1.17.4.2 nathanw rval = 0xffffcd36;
668 1.17.4.2 nathanw }
669 1.17.4.2 nathanw
670 1.17.4.2 nathanw PM_SET_STATE_ACKON();
671 1.17.4.2 nathanw via_reg(VIA1, vACR) |= 0x1c;
672 1.17.4.2 nathanw
673 1.17.4.2 nathanw return rval;
674 1.17.4.2 nathanw }
675 1.17.4.2 nathanw
676 1.17.4.2 nathanw
677 1.17.4.2 nathanw
678 1.17.4.2 nathanw /*
679 1.17.4.2 nathanw * My PMgrOp routine for the PB Duo series and the PB 5XX series
680 1.17.4.2 nathanw */
681 1.17.4.2 nathanw int
682 1.17.4.2 nathanw pm_pmgrop_pm2(pmdata)
683 1.17.4.2 nathanw PMData *pmdata;
684 1.17.4.2 nathanw {
685 1.17.4.2 nathanw int i;
686 1.17.4.2 nathanw int s;
687 1.17.4.2 nathanw u_char via1_vIER;
688 1.17.4.2 nathanw int rval = 0;
689 1.17.4.2 nathanw int num_pm_data = 0;
690 1.17.4.2 nathanw u_char pm_cmd;
691 1.17.4.2 nathanw short pm_num_rx_data;
692 1.17.4.2 nathanw u_char pm_data;
693 1.17.4.2 nathanw u_char *pm_buf;
694 1.17.4.2 nathanw
695 1.17.4.2 nathanw s = splhigh();
696 1.17.4.2 nathanw
697 1.17.4.2 nathanw /* disable all inetrrupts but PM */
698 1.17.4.2 nathanw via1_vIER = 0x10;
699 1.17.4.2 nathanw via1_vIER &= via_reg(VIA1, vIER);
700 1.17.4.2 nathanw via_reg(VIA1, vIER) = via1_vIER;
701 1.17.4.2 nathanw if (via1_vIER != 0x0)
702 1.17.4.2 nathanw via1_vIER |= 0x80;
703 1.17.4.2 nathanw
704 1.17.4.2 nathanw switch (pmdata->command) {
705 1.17.4.2 nathanw default:
706 1.17.4.2 nathanw /* wait until PM is free */
707 1.17.4.2 nathanw pm_cmd = (u_char)(pmdata->command & 0xff);
708 1.17.4.2 nathanw rval = 0xcd38;
709 1.17.4.2 nathanw if (pm_wait_free(ADBDelay * 4) == 0)
710 1.17.4.2 nathanw break; /* timeout */
711 1.17.4.2 nathanw
712 1.17.4.2 nathanw if (HwCfgFlags3 & 0x00200000) {
713 1.17.4.2 nathanw /* PB 160, PB 165(c), PB 180(c)? */
714 1.17.4.2 nathanw int delay = ADBDelay * 16;
715 1.17.4.2 nathanw
716 1.17.4.2 nathanw via_reg(VIA2, vDirA) = 0x00;
717 1.17.4.2 nathanw while ((via_reg(VIA2, 0x200) == 0x07) &&
718 1.17.4.2 nathanw (delay >= 0))
719 1.17.4.2 nathanw delay--;
720 1.17.4.2 nathanw
721 1.17.4.2 nathanw if (delay < 0) {
722 1.17.4.2 nathanw rval = 0xffffcd38;
723 1.17.4.2 nathanw break; /* timeout */
724 1.17.4.2 nathanw }
725 1.17.4.2 nathanw }
726 1.17.4.2 nathanw
727 1.17.4.2 nathanw /* send PM command */
728 1.17.4.2 nathanw if ((rval = pm_send_pm2((u_char)(pm_cmd & 0xff))))
729 1.17.4.2 nathanw break; /* timeout */
730 1.17.4.2 nathanw
731 1.17.4.2 nathanw /* send number of PM data */
732 1.17.4.2 nathanw num_pm_data = pmdata->num_data;
733 1.17.4.2 nathanw if (HwCfgFlags3 & 0x00020000) { /* PB Duo, PB 5XX */
734 1.17.4.2 nathanw if (pm_send_cmd_type[pm_cmd] < 0) {
735 1.17.4.2 nathanw if ((rval = pm_send_pm2((u_char)(num_pm_data & 0xff))) != 0)
736 1.17.4.2 nathanw break; /* timeout */
737 1.17.4.2 nathanw pmdata->command = 0;
738 1.17.4.2 nathanw }
739 1.17.4.2 nathanw } else { /* PB 1XX series ? */
740 1.17.4.2 nathanw if ((rval = pm_send_pm2((u_char)(num_pm_data & 0xff))) != 0)
741 1.17.4.2 nathanw break; /* timeout */
742 1.17.4.2 nathanw }
743 1.17.4.2 nathanw /* send PM data */
744 1.17.4.2 nathanw pm_buf = (u_char *)pmdata->s_buf;
745 1.17.4.2 nathanw for (i = 0 ; i < num_pm_data; i++)
746 1.17.4.2 nathanw if ((rval = pm_send_pm2(pm_buf[i])) != 0)
747 1.17.4.2 nathanw break; /* timeout */
748 1.17.4.2 nathanw if (i != num_pm_data)
749 1.17.4.2 nathanw break; /* timeout */
750 1.17.4.2 nathanw
751 1.17.4.2 nathanw
752 1.17.4.2 nathanw /* check if PM will send me data */
753 1.17.4.2 nathanw pm_num_rx_data = pm_receive_cmd_type[pm_cmd];
754 1.17.4.2 nathanw pmdata->num_data = pm_num_rx_data;
755 1.17.4.2 nathanw if (pm_num_rx_data == 0) {
756 1.17.4.2 nathanw rval = 0;
757 1.17.4.2 nathanw break; /* no return data */
758 1.17.4.2 nathanw }
759 1.17.4.2 nathanw
760 1.17.4.2 nathanw /* receive PM command */
761 1.17.4.2 nathanw pm_data = pmdata->command;
762 1.17.4.2 nathanw if (HwCfgFlags3 & 0x00020000) { /* PB Duo, PB 5XX */
763 1.17.4.2 nathanw pm_num_rx_data--;
764 1.17.4.2 nathanw if (pm_num_rx_data == 0)
765 1.17.4.2 nathanw if ((rval = pm_receive_pm2(&pm_data)) != 0) {
766 1.17.4.2 nathanw rval = 0xffffcd37;
767 1.17.4.2 nathanw break;
768 1.17.4.2 nathanw }
769 1.17.4.2 nathanw pmdata->command = pm_data;
770 1.17.4.2 nathanw } else { /* PB 1XX series ? */
771 1.17.4.2 nathanw if ((rval = pm_receive_pm2(&pm_data)) != 0) {
772 1.17.4.2 nathanw rval = 0xffffcd37;
773 1.17.4.2 nathanw break;
774 1.17.4.2 nathanw }
775 1.17.4.2 nathanw pmdata->command = pm_data;
776 1.17.4.2 nathanw }
777 1.17.4.2 nathanw
778 1.17.4.2 nathanw /* receive number of PM data */
779 1.17.4.2 nathanw if (HwCfgFlags3 & 0x00020000) { /* PB Duo, PB 5XX */
780 1.17.4.2 nathanw if (pm_num_rx_data < 0) {
781 1.17.4.2 nathanw if ((rval = pm_receive_pm2(&pm_data)) != 0)
782 1.17.4.2 nathanw break; /* timeout */
783 1.17.4.2 nathanw num_pm_data = pm_data;
784 1.17.4.2 nathanw } else
785 1.17.4.2 nathanw num_pm_data = pm_num_rx_data;
786 1.17.4.2 nathanw pmdata->num_data = num_pm_data;
787 1.17.4.2 nathanw } else { /* PB 1XX serias ? */
788 1.17.4.2 nathanw if ((rval = pm_receive_pm2(&pm_data)) != 0)
789 1.17.4.2 nathanw break; /* timeout */
790 1.17.4.2 nathanw num_pm_data = pm_data;
791 1.17.4.2 nathanw pmdata->num_data = num_pm_data;
792 1.17.4.2 nathanw }
793 1.17.4.2 nathanw
794 1.17.4.2 nathanw /* receive PM data */
795 1.17.4.2 nathanw pm_buf = (u_char *)pmdata->r_buf;
796 1.17.4.2 nathanw for (i = 0; i < num_pm_data; i++) {
797 1.17.4.2 nathanw if ((rval = pm_receive_pm2(&pm_data)) != 0)
798 1.17.4.2 nathanw break; /* timeout */
799 1.17.4.2 nathanw pm_buf[i] = pm_data;
800 1.17.4.2 nathanw }
801 1.17.4.2 nathanw
802 1.17.4.2 nathanw rval = 0;
803 1.17.4.2 nathanw }
804 1.17.4.2 nathanw
805 1.17.4.2 nathanw /* restore former value */
806 1.17.4.2 nathanw via_reg(VIA1, vIER) = via1_vIER;
807 1.17.4.2 nathanw splx(s);
808 1.17.4.2 nathanw
809 1.17.4.2 nathanw return rval;
810 1.17.4.2 nathanw }
811 1.17.4.2 nathanw
812 1.17.4.2 nathanw
813 1.17.4.2 nathanw /*
814 1.17.4.2 nathanw * My PM interrupt routine for the PB Duo series and the PB 5XX series
815 1.17.4.2 nathanw */
816 1.17.4.2 nathanw void
817 1.17.4.2 nathanw pm_intr_pm2(arg)
818 1.17.4.2 nathanw void *arg;
819 1.17.4.2 nathanw {
820 1.17.4.2 nathanw int s;
821 1.17.4.2 nathanw int rval;
822 1.17.4.2 nathanw PMData pmdata;
823 1.17.4.2 nathanw
824 1.17.4.2 nathanw s = splhigh();
825 1.17.4.2 nathanw
826 1.17.4.2 nathanw PM_VIA_CLR_INTR(); /* clear VIA1 interrupt */
827 1.17.4.2 nathanw /* ask PM what happend */
828 1.17.4.2 nathanw pmdata.command = 0x78;
829 1.17.4.2 nathanw pmdata.num_data = 0;
830 1.17.4.2 nathanw pmdata.s_buf = &pmdata.data[2];
831 1.17.4.2 nathanw pmdata.r_buf = &pmdata.data[2];
832 1.17.4.2 nathanw rval = pm_pmgrop_pm2(&pmdata);
833 1.17.4.2 nathanw if (rval != 0) {
834 1.17.4.2 nathanw #ifdef ADB_DEBUG
835 1.17.4.2 nathanw if (adb_debug)
836 1.17.4.2 nathanw printf("pm: PM is not ready. error code: %08x\n", rval);
837 1.17.4.2 nathanw #endif
838 1.17.4.2 nathanw splx(s);
839 1.17.4.2 nathanw }
840 1.17.4.2 nathanw
841 1.17.4.2 nathanw switch ((u_int)(pmdata.data[2] & 0xff)) {
842 1.17.4.2 nathanw case 0x00: /* 1 sec interrupt? */
843 1.17.4.2 nathanw break;
844 1.17.4.2 nathanw case 0x80: /* 1 sec interrupt? */
845 1.17.4.2 nathanw pm_counter++;
846 1.17.4.2 nathanw break;
847 1.17.4.2 nathanw case 0x08: /* Brightness/Contrast button on LCD panel */
848 1.17.4.2 nathanw /* get brightness and contrast of the LCD */
849 1.17.4.2 nathanw pm_LCD_brightness = (u_int)pmdata.data[3] & 0xff;
850 1.17.4.2 nathanw pm_LCD_contrast = (u_int)pmdata.data[4] & 0xff;
851 1.17.4.2 nathanw /*
852 1.17.4.2 nathanw pm_printerr("#08", rval, pmdata.num_data, pmdata.data);
853 1.17.4.2 nathanw pmdata.command = 0x33;
854 1.17.4.2 nathanw pmdata.num_data = 1;
855 1.17.4.2 nathanw pmdata.s_buf = pmdata.data;
856 1.17.4.2 nathanw pmdata.r_buf = pmdata.data;
857 1.17.4.2 nathanw pmdata.data[0] = pm_LCD_contrast;
858 1.17.4.2 nathanw rval = pm_pmgrop_pm2(&pmdata);
859 1.17.4.2 nathanw pm_printerr("#33", rval, pmdata.num_data, pmdata.data);
860 1.17.4.2 nathanw */
861 1.17.4.2 nathanw /* this is an experimental code */
862 1.17.4.2 nathanw pmdata.command = 0x41;
863 1.17.4.2 nathanw pmdata.num_data = 1;
864 1.17.4.2 nathanw pmdata.s_buf = pmdata.data;
865 1.17.4.2 nathanw pmdata.r_buf = pmdata.data;
866 1.17.4.2 nathanw pm_LCD_brightness = 0x7f - pm_LCD_brightness / 2;
867 1.17.4.2 nathanw if (pm_LCD_brightness < 0x25)
868 1.17.4.2 nathanw pm_LCD_brightness = 0x25;
869 1.17.4.2 nathanw if (pm_LCD_brightness > 0x5a)
870 1.17.4.2 nathanw pm_LCD_brightness = 0x7f;
871 1.17.4.2 nathanw pmdata.data[0] = pm_LCD_brightness;
872 1.17.4.2 nathanw rval = pm_pmgrop_pm2(&pmdata);
873 1.17.4.2 nathanw break;
874 1.17.4.2 nathanw case 0x10: /* ADB data that were requested by TALK command */
875 1.17.4.2 nathanw case 0x14:
876 1.17.4.2 nathanw pm_adb_get_TALK_result(&pmdata);
877 1.17.4.2 nathanw break;
878 1.17.4.2 nathanw case 0x16: /* ADB device event */
879 1.17.4.2 nathanw case 0x18:
880 1.17.4.2 nathanw case 0x1e:
881 1.17.4.2 nathanw pm_adb_get_ADB_data(&pmdata);
882 1.17.4.2 nathanw break;
883 1.17.4.2 nathanw default:
884 1.17.4.2 nathanw #ifdef ADB_DEBUG
885 1.17.4.2 nathanw if (adb_debug)
886 1.17.4.2 nathanw pm_printerr("driver does not supported this event.",
887 1.17.4.2 nathanw pmdata.data[2], pmdata.num_data,
888 1.17.4.2 nathanw pmdata.data);
889 1.17.4.2 nathanw #endif
890 1.17.4.2 nathanw break;
891 1.17.4.2 nathanw }
892 1.17.4.2 nathanw
893 1.17.4.2 nathanw splx(s);
894 1.17.4.2 nathanw }
895 1.17.4.2 nathanw
896 1.17.4.2 nathanw
897 1.17.4.2 nathanw /*
898 1.17.4.2 nathanw * MRG-based PMgrOp routine
899 1.17.4.2 nathanw */
900 1.17.4.2 nathanw int
901 1.17.4.2 nathanw pm_pmgrop_mrg(pmdata)
902 1.17.4.2 nathanw PMData *pmdata;
903 1.17.4.2 nathanw {
904 1.17.4.2 nathanw u_int32_t rval=0;
905 1.17.4.2 nathanw
906 1.17.4.4 nathanw __asm __volatile(
907 1.17.4.4 nathanw " movl %1,%%a0 \n"
908 1.17.4.4 nathanw " .word 0xa085 \n"
909 1.17.4.4 nathanw " movl %%d0,%0"
910 1.17.4.2 nathanw : "=g" (rval)
911 1.17.4.2 nathanw : "g" (pmdata)
912 1.17.4.2 nathanw : "a0","d0");
913 1.17.4.2 nathanw
914 1.17.4.2 nathanw return rval;
915 1.17.4.2 nathanw }
916 1.17.4.2 nathanw
917 1.17.4.2 nathanw
918 1.17.4.2 nathanw /*
919 1.17.4.2 nathanw * My PMgrOp routine
920 1.17.4.2 nathanw */
921 1.17.4.2 nathanw int
922 1.17.4.2 nathanw pmgrop(pmdata)
923 1.17.4.2 nathanw PMData *pmdata;
924 1.17.4.2 nathanw {
925 1.17.4.2 nathanw switch (pmHardware) {
926 1.17.4.2 nathanw case PM_HW_PB1XX:
927 1.17.4.2 nathanw return (pm_pmgrop_pm1(pmdata));
928 1.17.4.2 nathanw break;
929 1.17.4.2 nathanw case PM_HW_PB5XX:
930 1.17.4.2 nathanw return (pm_pmgrop_pm2(pmdata));
931 1.17.4.2 nathanw break;
932 1.17.4.2 nathanw default:
933 1.17.4.2 nathanw /* return (pmgrop_mrg(pmdata)); */
934 1.17.4.2 nathanw return 1;
935 1.17.4.2 nathanw }
936 1.17.4.2 nathanw }
937 1.17.4.2 nathanw
938 1.17.4.2 nathanw
939 1.17.4.2 nathanw /*
940 1.17.4.2 nathanw * My PM interrupt routine
941 1.17.4.2 nathanw */
942 1.17.4.2 nathanw void
943 1.17.4.2 nathanw pm_intr(arg)
944 1.17.4.2 nathanw void *arg;
945 1.17.4.2 nathanw {
946 1.17.4.2 nathanw switch (pmHardware) {
947 1.17.4.2 nathanw case PM_HW_PB1XX:
948 1.17.4.2 nathanw pm_intr_pm1(arg);
949 1.17.4.2 nathanw break;
950 1.17.4.2 nathanw case PM_HW_PB5XX:
951 1.17.4.2 nathanw pm_intr_pm2(arg);
952 1.17.4.2 nathanw break;
953 1.17.4.2 nathanw default:
954 1.17.4.2 nathanw break;
955 1.17.4.2 nathanw }
956 1.17.4.2 nathanw }
957 1.17.4.2 nathanw
958 1.17.4.2 nathanw
959 1.17.4.2 nathanw void
960 1.17.4.2 nathanw pm_hw_setup()
961 1.17.4.2 nathanw {
962 1.17.4.2 nathanw switch (pmHardware) {
963 1.17.4.2 nathanw case PM_HW_PB1XX:
964 1.17.4.2 nathanw via1_register_irq(4, pm_intr_pm1, (void *)0);
965 1.17.4.2 nathanw PM_VIA_CLR_INTR();
966 1.17.4.2 nathanw break;
967 1.17.4.2 nathanw case PM_HW_PB5XX:
968 1.17.4.2 nathanw via1_register_irq(4, pm_intr_pm2, (void *)0);
969 1.17.4.2 nathanw PM_VIA_CLR_INTR();
970 1.17.4.2 nathanw break;
971 1.17.4.2 nathanw default:
972 1.17.4.2 nathanw break;
973 1.17.4.2 nathanw }
974 1.17.4.2 nathanw }
975 1.17.4.2 nathanw
976 1.17.4.2 nathanw
977 1.17.4.2 nathanw /*
978 1.17.4.2 nathanw * Synchronous ADBOp routine for the Power Manager
979 1.17.4.2 nathanw */
980 1.17.4.2 nathanw int
981 1.17.4.2 nathanw pm_adb_op(buffer, compRout, data, command)
982 1.17.4.2 nathanw u_char *buffer;
983 1.17.4.2 nathanw void *compRout;
984 1.17.4.2 nathanw void *data;
985 1.17.4.2 nathanw int command;
986 1.17.4.2 nathanw {
987 1.17.4.2 nathanw int i;
988 1.17.4.2 nathanw int s;
989 1.17.4.2 nathanw int rval;
990 1.17.4.2 nathanw int delay;
991 1.17.4.2 nathanw PMData pmdata;
992 1.17.4.2 nathanw struct adbCommand packet;
993 1.17.4.2 nathanw
994 1.17.4.2 nathanw if (adbWaiting == 1)
995 1.17.4.2 nathanw return 1;
996 1.17.4.2 nathanw
997 1.17.4.2 nathanw s = splhigh();
998 1.17.4.2 nathanw via_reg(VIA1, vIER) = 0x10;
999 1.17.4.2 nathanw
1000 1.17.4.2 nathanw adbBuffer = buffer;
1001 1.17.4.2 nathanw adbCompRout = compRout;
1002 1.17.4.2 nathanw adbCompData = data;
1003 1.17.4.2 nathanw
1004 1.17.4.2 nathanw pmdata.command = 0x20;
1005 1.17.4.2 nathanw pmdata.s_buf = pmdata.data;
1006 1.17.4.2 nathanw pmdata.r_buf = pmdata.data;
1007 1.17.4.2 nathanw
1008 1.17.4.2 nathanw if ((command & 0xc) == 0x8) { /* if the command is LISTEN, add number of ADB data to number of PM data */
1009 1.17.4.2 nathanw if (buffer != (u_char *)0)
1010 1.17.4.2 nathanw pmdata.num_data = buffer[0] + 3;
1011 1.17.4.2 nathanw } else {
1012 1.17.4.2 nathanw pmdata.num_data = 3;
1013 1.17.4.2 nathanw }
1014 1.17.4.2 nathanw
1015 1.17.4.2 nathanw pmdata.data[0] = (u_char)(command & 0xff);
1016 1.17.4.2 nathanw pmdata.data[1] = 0;
1017 1.17.4.2 nathanw if ((command & 0xc) == 0x8) { /* if the command is LISTEN, copy ADB data to PM buffer */
1018 1.17.4.2 nathanw if ((buffer != (u_char *)0) && (buffer[0] <= 24)) {
1019 1.17.4.2 nathanw pmdata.data[2] = buffer[0]; /* number of data */
1020 1.17.4.2 nathanw for (i = 0; i < buffer[0]; i++)
1021 1.17.4.2 nathanw pmdata.data[3 + i] = buffer[1 + i];
1022 1.17.4.2 nathanw } else
1023 1.17.4.2 nathanw pmdata.data[2] = 0;
1024 1.17.4.2 nathanw } else
1025 1.17.4.2 nathanw pmdata.data[2] = 0;
1026 1.17.4.2 nathanw
1027 1.17.4.2 nathanw if ((command & 0xc) != 0xc) { /* if the command is not TALK */
1028 1.17.4.2 nathanw /* set up stuff fNULLor adb_pass_up */
1029 1.17.4.2 nathanw packet.data[0] = 1 + pmdata.data[2];
1030 1.17.4.2 nathanw packet.data[1] = command;
1031 1.17.4.2 nathanw for (i = 0; i < pmdata.data[2]; i++)
1032 1.17.4.2 nathanw packet.data[i+2] = pmdata.data[i+3];
1033 1.17.4.2 nathanw packet.saveBuf = adbBuffer;
1034 1.17.4.2 nathanw packet.compRout = adbCompRout;
1035 1.17.4.2 nathanw packet.compData = adbCompData;
1036 1.17.4.2 nathanw packet.cmd = command;
1037 1.17.4.2 nathanw packet.unsol = 0;
1038 1.17.4.2 nathanw packet.ack_only = 1;
1039 1.17.4.2 nathanw adb_polling = 1;
1040 1.17.4.2 nathanw adb_pass_up(&packet);
1041 1.17.4.2 nathanw adb_polling = 0;
1042 1.17.4.2 nathanw }
1043 1.17.4.2 nathanw
1044 1.17.4.2 nathanw rval = pmgrop(&pmdata);
1045 1.17.4.2 nathanw if (rval != 0) {
1046 1.17.4.2 nathanw splx(s);
1047 1.17.4.2 nathanw return 1;
1048 1.17.4.2 nathanw }
1049 1.17.4.2 nathanw
1050 1.17.4.2 nathanw adbWaiting = 1;
1051 1.17.4.2 nathanw adbWaitingCmd = command;
1052 1.17.4.2 nathanw
1053 1.17.4.2 nathanw PM_VIA_INTR_ENABLE();
1054 1.17.4.2 nathanw
1055 1.17.4.2 nathanw /* wait until the PM interrupt has occurred */
1056 1.17.4.2 nathanw delay = 0x80000;
1057 1.17.4.2 nathanw while (adbWaiting == 1) {
1058 1.17.4.2 nathanw switch (mac68k_machine.machineid) {
1059 1.17.4.3 nathanw case MACH_MACPB150:
1060 1.17.4.2 nathanw case MACH_MACPB210:
1061 1.17.4.2 nathanw case MACH_MACPB230: /* daishi tested with Duo230 */
1062 1.17.4.2 nathanw case MACH_MACPB250:
1063 1.17.4.2 nathanw case MACH_MACPB270:
1064 1.17.4.2 nathanw case MACH_MACPB280:
1065 1.17.4.2 nathanw case MACH_MACPB280C:
1066 1.17.4.5 nathanw case MACH_MACPB190:
1067 1.17.4.5 nathanw case MACH_MACPB190CS:
1068 1.17.4.2 nathanw pm_intr((void *)0);
1069 1.17.4.2 nathanw break;
1070 1.17.4.2 nathanw default:
1071 1.17.4.2 nathanw if ((via_reg(VIA1, vIFR) & 0x10) == 0x10)
1072 1.17.4.2 nathanw pm_intr((void *)0);
1073 1.17.4.2 nathanw break;
1074 1.17.4.2 nathanw }
1075 1.17.4.2 nathanw #ifdef PM_GRAB_SI
1076 1.17.4.2 nathanw (void)intr_dispatch(0x70); /* grab any serial interrupts */
1077 1.17.4.2 nathanw #endif
1078 1.17.4.2 nathanw if ((--delay) < 0) {
1079 1.17.4.2 nathanw splx(s);
1080 1.17.4.2 nathanw return 1;
1081 1.17.4.2 nathanw }
1082 1.17.4.2 nathanw }
1083 1.17.4.2 nathanw
1084 1.17.4.2 nathanw /* this command enables the interrupt by operating ADB devices */
1085 1.17.4.2 nathanw if (HwCfgFlags3 & 0x00020000) { /* PB Duo series, PB 5XX series */
1086 1.17.4.2 nathanw pmdata.command = 0x20;
1087 1.17.4.2 nathanw pmdata.num_data = 4;
1088 1.17.4.2 nathanw pmdata.s_buf = pmdata.data;
1089 1.17.4.2 nathanw pmdata.r_buf = pmdata.data;
1090 1.17.4.2 nathanw pmdata.data[0] = 0x00;
1091 1.17.4.2 nathanw pmdata.data[1] = 0x86; /* magic spell for awaking the PM */
1092 1.17.4.2 nathanw pmdata.data[2] = 0x00;
1093 1.17.4.2 nathanw pmdata.data[3] = 0x0c; /* each bit may express the existent ADB device */
1094 1.17.4.2 nathanw } else { /* PB 1XX series */
1095 1.17.4.2 nathanw pmdata.command = 0x20;
1096 1.17.4.2 nathanw pmdata.num_data = 3;
1097 1.17.4.2 nathanw pmdata.s_buf = pmdata.data;
1098 1.17.4.2 nathanw pmdata.r_buf = pmdata.data;
1099 1.17.4.2 nathanw pmdata.data[0] = (u_char)(command & 0xf0) | 0xc;
1100 1.17.4.2 nathanw pmdata.data[1] = 0x04;
1101 1.17.4.2 nathanw pmdata.data[2] = 0x00;
1102 1.17.4.2 nathanw }
1103 1.17.4.2 nathanw rval = pmgrop(&pmdata);
1104 1.17.4.2 nathanw
1105 1.17.4.2 nathanw splx(s);
1106 1.17.4.2 nathanw return rval;
1107 1.17.4.2 nathanw }
1108 1.17.4.2 nathanw
1109 1.17.4.2 nathanw
1110 1.17.4.2 nathanw void
1111 1.17.4.2 nathanw pm_adb_get_TALK_result(pmdata)
1112 1.17.4.2 nathanw PMData *pmdata;
1113 1.17.4.2 nathanw {
1114 1.17.4.2 nathanw int i;
1115 1.17.4.2 nathanw struct adbCommand packet;
1116 1.17.4.2 nathanw
1117 1.17.4.2 nathanw /* set up data for adb_pass_up */
1118 1.17.4.2 nathanw packet.data[0] = pmdata->num_data-1;
1119 1.17.4.2 nathanw packet.data[1] = pmdata->data[3];
1120 1.17.4.2 nathanw for (i = 0; i <packet.data[0]-1; i++)
1121 1.17.4.2 nathanw packet.data[i+2] = pmdata->data[i+4];
1122 1.17.4.2 nathanw
1123 1.17.4.2 nathanw packet.saveBuf = adbBuffer;
1124 1.17.4.2 nathanw packet.compRout = adbCompRout;
1125 1.17.4.2 nathanw packet.compData = adbCompData;
1126 1.17.4.2 nathanw packet.unsol = 0;
1127 1.17.4.2 nathanw packet.ack_only = 0;
1128 1.17.4.2 nathanw adb_polling = 1;
1129 1.17.4.2 nathanw adb_pass_up(&packet);
1130 1.17.4.2 nathanw adb_polling = 0;
1131 1.17.4.2 nathanw
1132 1.17.4.2 nathanw adbWaiting = 0;
1133 1.17.4.2 nathanw adbBuffer = (long)0;
1134 1.17.4.2 nathanw adbCompRout = (long)0;
1135 1.17.4.2 nathanw adbCompData = (long)0;
1136 1.17.4.2 nathanw }
1137 1.17.4.2 nathanw
1138 1.17.4.2 nathanw
1139 1.17.4.2 nathanw void
1140 1.17.4.2 nathanw pm_adb_get_ADB_data(pmdata)
1141 1.17.4.2 nathanw PMData *pmdata;
1142 1.17.4.2 nathanw {
1143 1.17.4.2 nathanw int i;
1144 1.17.4.2 nathanw struct adbCommand packet;
1145 1.17.4.2 nathanw
1146 1.17.4.2 nathanw /* set up data for adb_pass_up */
1147 1.17.4.2 nathanw packet.data[0] = pmdata->num_data-1; /* number of raw data */
1148 1.17.4.2 nathanw packet.data[1] = pmdata->data[3]; /* ADB command */
1149 1.17.4.2 nathanw for (i = 0; i <packet.data[0]-1; i++)
1150 1.17.4.2 nathanw packet.data[i+2] = pmdata->data[i+4];
1151 1.17.4.2 nathanw packet.unsol = 1;
1152 1.17.4.2 nathanw packet.ack_only = 0;
1153 1.17.4.2 nathanw adb_pass_up(&packet);
1154 1.17.4.2 nathanw }
1155 1.17.4.2 nathanw
1156 1.17.4.2 nathanw
1157 1.17.4.2 nathanw void
1158 1.17.4.2 nathanw pm_adb_poll_next_device_pm1(pmdata)
1159 1.17.4.2 nathanw PMData *pmdata;
1160 1.17.4.2 nathanw {
1161 1.17.4.2 nathanw int i;
1162 1.17.4.2 nathanw int ndid;
1163 1.17.4.2 nathanw u_short bendid = 0x1;
1164 1.17.4.2 nathanw int rval;
1165 1.17.4.2 nathanw PMData tmp_pmdata;
1166 1.17.4.2 nathanw
1167 1.17.4.2 nathanw /* find another existent ADB device to poll */
1168 1.17.4.2 nathanw for (i = 1; i < 16; i++) {
1169 1.17.4.2 nathanw ndid = (ADB_CMDADDR(pmdata->data[3]) + i) & 0xf;
1170 1.17.4.2 nathanw bendid <<= ndid;
1171 1.17.4.2 nathanw if ((pm_existent_ADB_devices & bendid) != 0)
1172 1.17.4.2 nathanw break;
1173 1.17.4.2 nathanw }
1174 1.17.4.2 nathanw
1175 1.17.4.2 nathanw /* poll the other device */
1176 1.17.4.2 nathanw tmp_pmdata.command = 0x20;
1177 1.17.4.2 nathanw tmp_pmdata.num_data = 3;
1178 1.17.4.2 nathanw tmp_pmdata.s_buf = tmp_pmdata.data;
1179 1.17.4.2 nathanw tmp_pmdata.r_buf = tmp_pmdata.data;
1180 1.17.4.2 nathanw tmp_pmdata.data[0] = (u_char)(ndid << 4) | 0xc;
1181 1.17.4.2 nathanw tmp_pmdata.data[1] = 0x04; /* magic spell for awaking the PM */
1182 1.17.4.2 nathanw tmp_pmdata.data[2] = 0x00;
1183 1.17.4.2 nathanw rval = pmgrop(&tmp_pmdata);
1184 1.17.4.2 nathanw }
1185 1.17.4.2 nathanw
1186 1.17.4.2 nathanw
1187 1.17.4.2 nathanw
1188