via-macii.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:17k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * Device driver for the via ADB on (many) Mac II-class machines
  3.  *
  4.  * Based on the original ADB keyboard handler Copyright (c) 1997 Alan Cox
  5.  * Also derived from code Copyright (C) 1996 Paul Mackerras.
  6.  *
  7.  * With various updates provided over the years by Michael Schmitz,
  8.  * Guideo Koerber and others.
  9.  *
  10.  * Rewrite for Unified ADB by Joshua M. Thompson (funaho@jurai.org)
  11.  *
  12.  * 1999-08-02 (jmt) - Initial rewrite for Unified ADB.
  13.  * 2000-03-29 Tony Mantler <tonym@mac.linux-m68k.org>
  14.  *  - Big overhaul, should actually work now.
  15.  */
  16.  
  17. #include <stdarg.h>
  18. #include <linux/types.h>
  19. #include <linux/errno.h>
  20. #include <linux/kernel.h>
  21. #include <linux/delay.h>
  22. #include <linux/sched.h>
  23. #include <linux/adb.h>
  24. #include <asm/macintosh.h>
  25. #include <asm/macints.h>
  26. #include <asm/machw.h>
  27. #include <asm/mac_via.h>
  28. #include <asm/io.h>
  29. #include <asm/system.h>
  30. #include <asm/init.h>
  31. static volatile unsigned char *via;
  32. /* VIA registers - spaced 0x200 bytes apart */
  33. #define RS 0x200 /* skip between registers */
  34. #define B 0 /* B-side data */
  35. #define A RS /* A-side data */
  36. #define DIRB (2*RS) /* B-side direction (1=output) */
  37. #define DIRA (3*RS) /* A-side direction (1=output) */
  38. #define T1CL (4*RS) /* Timer 1 ctr/latch (low 8 bits) */
  39. #define T1CH (5*RS) /* Timer 1 counter (high 8 bits) */
  40. #define T1LL (6*RS) /* Timer 1 latch (low 8 bits) */
  41. #define T1LH (7*RS) /* Timer 1 latch (high 8 bits) */
  42. #define T2CL (8*RS) /* Timer 2 ctr/latch (low 8 bits) */
  43. #define T2CH (9*RS) /* Timer 2 counter (high 8 bits) */
  44. #define SR (10*RS) /* Shift register */
  45. #define ACR (11*RS) /* Auxiliary control register */
  46. #define PCR (12*RS) /* Peripheral control register */
  47. #define IFR (13*RS) /* Interrupt flag register */
  48. #define IER (14*RS) /* Interrupt enable register */
  49. #define ANH (15*RS) /* A-side data, no handshake */
  50. /* Bits in B data register: all active low */
  51. #define TREQ 0x08 /* Transfer request (input) */
  52. #define TACK 0x10 /* Transfer acknowledge (output) */
  53. #define TIP 0x20 /* Transfer in progress (output) */
  54. #define ST_MASK 0x30 /* mask for selecting ADB state bits */
  55. /* Bits in ACR */
  56. #define SR_CTRL 0x1c /* Shift register control bits */
  57. #define SR_EXT 0x0c /* Shift on external clock */
  58. #define SR_OUT 0x10 /* Shift out if 1 */
  59. /* Bits in IFR and IER */
  60. #define IER_SET 0x80 /* set bits in IER */
  61. #define IER_CLR 0 /* clear bits in IER */
  62. #define SR_INT 0x04 /* Shift register full/empty */
  63. #define SR_DATA 0x08 /* Shift register data */
  64. #define SR_CLOCK 0x10 /* Shift register clock */
  65. /* ADB transaction states according to GMHW */
  66. #define ST_CMD 0x00 /* ADB state: command byte */
  67. #define ST_EVEN 0x10 /* ADB state: even data byte */
  68. #define ST_ODD 0x20 /* ADB state: odd data byte */
  69. #define ST_IDLE 0x30 /* ADB state: idle, nothing to send */
  70. static int  macii_init_via(void);
  71. static void macii_start(void);
  72. static void macii_interrupt(int irq, void *arg, struct pt_regs *regs);
  73. static void macii_retransmit(int);
  74. static void macii_queue_poll(void);
  75. static int macii_probe(void);
  76. static int macii_init(void);
  77. static int macii_send_request(struct adb_request *req, int sync);
  78. static int macii_write(struct adb_request *req);
  79. static int macii_autopoll(int devs);
  80. static void macii_poll(void);
  81. static int macii_reset_bus(void);
  82. struct adb_driver via_macii_driver = {
  83. "Mac II",
  84. macii_probe,
  85. macii_init,
  86. macii_send_request,
  87. macii_autopoll,
  88. macii_poll,
  89. macii_reset_bus
  90. };
  91. static enum macii_state {
  92. idle,
  93. sending,
  94. reading,
  95. read_done,
  96. awaiting_reply
  97. } macii_state;
  98. static int need_poll    = 0;
  99. static int command_byte = 0;
  100. static int last_reply   = 0;
  101. static int last_active  = 0;
  102. static struct adb_request *current_req;
  103. static struct adb_request *last_req;
  104. static struct adb_request *retry_req;
  105. static unsigned char reply_buf[16];
  106. static unsigned char *reply_ptr;
  107. static int reply_len;
  108. static int reading_reply;
  109. static int data_index;
  110. static int first_byte;
  111. static int prefix_len;
  112. static int status = ST_IDLE|TREQ;
  113. static int last_status;
  114. static int driver_running = 0;
  115. /* debug level 10 required for ADB logging (should be && debug_adb, ideally) */
  116. /* Check for MacII style ADB */
  117. static int macii_probe(void)
  118. {
  119. if (macintosh_config->adb_type != MAC_ADB_II) return -ENODEV;
  120. via = via1;
  121. printk("adb: Mac II ADB Driver v1.0 for Unified ADBn");
  122. return 0;
  123. }
  124. /* Initialize the driver */
  125. int macii_init(void)
  126. {
  127. unsigned long flags;
  128. int err;
  129. save_flags(flags);
  130. cli();
  131. err = macii_init_via();
  132. if (err) return err;
  133. err = request_irq(IRQ_MAC_ADB, macii_interrupt, IRQ_FLG_LOCK, "ADB",
  134.     macii_interrupt);
  135. if (err) return err;
  136. macii_state = idle;
  137. restore_flags(flags);
  138. return 0;
  139. }
  140. /* initialize the hardware */
  141. static int macii_init_via(void)
  142. {
  143. unsigned char x;
  144. /* Set the lines up. We want TREQ as input TACK|TIP as output */
  145. via[DIRB] = (via[DIRB] | TACK | TIP) & ~TREQ;
  146. /* Set up state: idle */
  147. via[B] |= ST_IDLE;
  148. last_status = via[B] & (ST_MASK|TREQ);
  149. /* Shift register on input */
  150. via[ACR] = (via[ACR] & ~SR_CTRL) | SR_EXT;
  151. /* Wipe any pending data and int */
  152. x = via[SR];
  153. return 0;
  154. }
  155. /* Send an ADB poll (Talk Register 0 command, tagged on the front of the request queue) */
  156. static void macii_queue_poll(void)
  157. {
  158. static int device = 0;
  159. static int in_poll=0;
  160. static struct adb_request req;
  161. unsigned long flags;
  162. if (in_poll) printk("macii_queue_poll: double poll!n");
  163. in_poll++;
  164. if (++device > 15) device = 1;
  165. adb_request(&req, NULL, ADBREQ_REPLY|ADBREQ_NOSEND, 1,
  166.     ADB_READREG(device, 0));
  167. save_flags(flags);
  168. cli();
  169. req.next = current_req;
  170. current_req = &req;
  171. restore_flags(flags);
  172. macii_start();
  173. in_poll--;
  174. }
  175. /* Send an ADB retransmit (Talk, appended to the request queue) */
  176. static void macii_retransmit(int device)
  177. {
  178. static int in_retransmit = 0;
  179. static struct adb_request rt;
  180. unsigned long flags;
  181. if (in_retransmit) printk("macii_retransmit: double retransmit!n");
  182. in_retransmit++;
  183. adb_request(&rt, NULL, ADBREQ_REPLY|ADBREQ_NOSEND, 1,
  184.     ADB_READREG(device, 0));
  185. save_flags(flags);
  186. cli();
  187. if (current_req != NULL) {
  188. last_req->next = &rt;
  189. last_req = &rt;
  190. } else {
  191. current_req = &rt;
  192. last_req = &rt;
  193. }
  194. if (macii_state == idle) macii_start();
  195. restore_flags(flags);
  196. in_retransmit--;
  197. }
  198. /* Send an ADB request; if sync, poll out the reply 'till it's done */
  199. static int macii_send_request(struct adb_request *req, int sync)
  200. {
  201. int i;
  202. i = macii_write(req);
  203. if (i) return i;
  204. if (sync) {
  205. while (!req->complete) macii_poll();
  206. }
  207. return 0;
  208. }
  209. /* Send an ADB request */
  210. static int macii_write(struct adb_request *req)
  211. {
  212. unsigned long flags;
  213. if (req->nbytes < 2 || req->data[0] != ADB_PACKET || req->nbytes > 15) {
  214. req->complete = 1;
  215. return -EINVAL;
  216. }
  217. req->next = 0;
  218. req->sent = 0;
  219. req->complete = 0;
  220. req->reply_len = 0;
  221. save_flags(flags); cli();
  222. if (current_req != NULL) {
  223. last_req->next = req;
  224. last_req = req;
  225. } else {
  226. current_req = req;
  227. last_req = req;
  228. if (macii_state == idle) macii_start();
  229. }
  230. restore_flags(flags);
  231. return 0;
  232. }
  233. /* Start auto-polling */
  234. static int macii_autopoll(int devs)
  235. {
  236. /* Just ping a random default address */
  237. if (!(current_req || retry_req))
  238. macii_retransmit( (last_active < 16 && last_active > 0) ? last_active : 3);
  239. return 0;
  240. }
  241. /* Prod the chip without interrupts */
  242. static void macii_poll(void)
  243. {
  244. unsigned long flags;
  245. save_flags(flags); cli();
  246. if (via[IFR] & SR_INT) macii_interrupt(0, 0, 0);
  247. restore_flags(flags);
  248. }
  249. /* Reset the bus */
  250. static int macii_reset_bus(void)
  251. {
  252. static struct adb_request req;
  253. /* Command = 0, Address = ignored */
  254. adb_request(&req, NULL, 0, 1, ADB_BUSRESET);
  255. return 0;
  256. }
  257. /* Start sending ADB packet */
  258. static void macii_start(void)
  259. {
  260. unsigned long flags;
  261. struct adb_request *req;
  262. req = current_req;
  263. if (!req) return;
  264. /* assert macii_state == idle */
  265. if (macii_state != idle) {
  266. printk("macii_start: called while driver busy (%p %x %x)!n",
  267. req, macii_state, (uint) via1[B] & (ST_MASK|TREQ));
  268. return;
  269. }
  270. save_flags(flags); cli();
  271. /* 
  272.  * IRQ signaled ?? (means ADB controller wants to send, or might 
  273.  * be end of packet if we were reading)
  274.  */
  275. #if 0 /* FIXME: This is broke broke broke, for some reason */
  276. if ((via[B] & TREQ) == 0) {
  277. printk("macii_start: weird poll stuff. huh?n");
  278. /*
  279.  * FIXME - we need to restart this on a timer
  280.  * or a collision at boot hangs us.
  281.  * Never set macii_state to idle here, or macii_start 
  282.  * won't be called again from send_request!
  283.  * (need to re-check other cases ...)
  284.  */
  285. /*
  286.  * if the interrupt handler set the need_poll
  287.  * flag, it's hopefully a SRQ poll or re-Talk
  288.  * so we try to send here anyway
  289.  */
  290. if (!need_poll) {
  291. if (console_loglevel == 10)
  292. printk("macii_start: device busy - retry %p state %d status %x!n", 
  293. req, macii_state,
  294. (uint) via[B] & (ST_MASK|TREQ));
  295. retry_req = req;
  296. /* set ADB status here ? */
  297. restore_flags(flags);
  298. return;
  299. } else {
  300. need_poll = 0;
  301. }
  302. }
  303. #endif
  304. /*
  305.  * Another retry pending? (sanity check)
  306.  */
  307. if (retry_req) {
  308. retry_req = NULL;
  309. }
  310. /* Now send it. Be careful though, that first byte of the request */
  311. /* is actually ADB_PACKET; the real data begins at index 1!   */
  312. /* store command byte */
  313. command_byte = req->data[1];
  314. /* Output mode */
  315. via[ACR] |= SR_OUT;
  316. /* Load data */
  317. via[SR] = req->data[1];
  318. /* set ADB state to 'command' */
  319. via[B] = (via[B] & ~ST_MASK) | ST_CMD;
  320. macii_state = sending;
  321. data_index = 2;
  322. restore_flags(flags);
  323. }
  324. /*
  325.  * The notorious ADB interrupt handler - does all of the protocol handling, 
  326.  * except for starting new send operations. Relies heavily on the ADB 
  327.  * controller sending and receiving data, thereby generating SR interrupts
  328.  * for us. This means there has to be always activity on the ADB bus, otherwise
  329.  * the whole process dies and has to be re-kicked by sending TALK requests ...
  330.  * CUDA-based Macs seem to solve this with the autopoll option, for MacII-type
  331.  * ADB the problem isn't solved yet (retransmit of the latest active TALK seems
  332.  * a good choice; either on timeout or on a timer interrupt).
  333.  *
  334.  * The basic ADB state machine was left unchanged from the original MacII code
  335.  * by Alan Cox, which was based on the CUDA driver for PowerMac. 
  336.  * The syntax of the ADB status lines seems to be totally different on MacII, 
  337.  * though. MacII uses the states Command -> Even -> Odd -> Even ->...-> Idle for
  338.  * sending, and Idle -> Even -> Odd -> Even ->...-> Idle for receiving. Start 
  339.  * and end of a receive packet are signaled by asserting /IRQ on the interrupt
  340.  * line. Timeouts are signaled by a sequence of 4 0xFF, with /IRQ asserted on 
  341.  * every other byte. SRQ is probably signaled by 3 or more 0xFF tacked on the 
  342.  * end of a packet. (Thanks to Guido Koerber for eavesdropping on the ADB 
  343.  * protocol with a logic analyzer!!)
  344.  *
  345.  * Note: As of 21/10/97, the MacII ADB part works including timeout detection
  346.  * and retransmit (Talk to the last active device).
  347.  */
  348. void macii_interrupt(int irq, void *arg, struct pt_regs *regs)
  349. {
  350. int x, adbdir;
  351. unsigned long flags;
  352. struct adb_request *req;
  353. last_status = status;
  354. /* prevent races due to SCSI enabling ints */
  355. save_flags(flags); cli();
  356. if (driver_running) {
  357. restore_flags(flags);
  358. return;
  359. }
  360. driver_running = 1;
  361. status = via[B] & (ST_MASK|TREQ);
  362. adbdir = via[ACR] & SR_OUT;
  363. switch (macii_state) {
  364. case idle:
  365. x = via[SR];
  366. first_byte = x;
  367. /* set ADB state = even for first data byte */
  368. via[B] = (via[B] & ~ST_MASK) | ST_EVEN;
  369. reply_buf[0] = first_byte; /* was command_byte?? */
  370. reply_ptr = reply_buf + 1;
  371. reply_len = 1;
  372. prefix_len = 1;
  373. reading_reply = 0;
  374. macii_state = reading;
  375. break;
  376. case awaiting_reply:
  377. /* handshake etc. for II ?? */
  378. x = via[SR];
  379. first_byte = x;
  380. /* set ADB state = even for first data byte */
  381. via[B] = (via[B] & ~ST_MASK) | ST_EVEN;
  382. current_req->reply[0] = first_byte;
  383. reply_ptr = current_req->reply + 1;
  384. reply_len = 1;
  385. prefix_len = 1;
  386. reading_reply = 1;
  387. macii_state = reading;
  388. break;
  389. case sending:
  390. req = current_req;
  391. if (data_index >= req->nbytes) {
  392. /* print an error message if a listen command has no data */
  393. if (((command_byte & 0x0C) == 0x08)
  394.  /* && (console_loglevel == 10) */
  395.     && (data_index == 2))
  396. printk("MacII ADB: listen command with no data: %x!n", 
  397. command_byte);
  398. /* reset to shift in */
  399. via[ACR] &= ~SR_OUT;
  400. x = via[SR];
  401. /* set ADB state idle - might get SRQ */
  402. via[B] = (via[B] & ~ST_MASK) | ST_IDLE;
  403. req->sent = 1;
  404. if (req->reply_expected) {
  405. macii_state = awaiting_reply;
  406. } else {
  407. req->complete = 1;
  408. current_req = req->next;
  409. if (req->done) (*req->done)(req);
  410. macii_state = idle;
  411. if (current_req || retry_req)
  412. macii_start();
  413. else
  414. macii_retransmit((command_byte & 0xF0) >> 4);
  415. }
  416. } else {
  417. via[SR] = req->data[data_index++];
  418. if ( (via[B] & ST_MASK) == ST_CMD ) {
  419. /* just sent the command byte, set to EVEN */
  420. via[B] = (via[B] & ~ST_MASK) | ST_EVEN;
  421. } else {
  422. /* invert state bits, toggle ODD/EVEN */
  423. via[B] ^= ST_MASK;
  424. }
  425. }
  426. break;
  427. case reading:
  428. /* timeout / SRQ handling for II hw */
  429. if( (first_byte == 0xFF && (reply_len-prefix_len)==2 
  430.      && memcmp(reply_ptr-2,"xFFxFF",2)==0) || 
  431.     ((reply_len-prefix_len)==3 
  432.      && memcmp(reply_ptr-3,"xFFxFFxFF",3)==0))
  433. {
  434. /*
  435.  * possible timeout (in fact, most probably a 
  436.  * timeout, since SRQ can't be signaled without
  437.  * transfer on the bus).
  438.  * The last three bytes seen were FF, together 
  439.  * with the starting byte (in case we started
  440.  * on 'idle' or 'awaiting_reply') this probably
  441.  * makes four. So this is mostl likely #5!
  442.  * The timeout signal is a pattern 1 0 1 0 0..
  443.  * on /INT, meaning we missed it :-(
  444.  */
  445. x = via[SR];
  446. if (x != 0xFF) printk("MacII ADB: mistaken timeout/SRQ!n");
  447. if ((status & TREQ) == (last_status & TREQ)) {
  448. /* Not a timeout. Unsolicited SRQ? weird. */
  449. /* Terminate the SRQ packet and poll */
  450. need_poll = 1;
  451. }
  452. /* There's no packet to get, so reply is blank */
  453. via[B] ^= ST_MASK;
  454. reply_ptr -= (reply_len-prefix_len);
  455. reply_len = prefix_len;
  456. macii_state = read_done;
  457. break;
  458. } /* end timeout / SRQ handling for II hw. */
  459. if((reply_len-prefix_len)>3
  460. && memcmp(reply_ptr-3,"xFFxFFxFF",3)==0)
  461. {
  462. /* SRQ tacked on data packet */
  463. /* Terminate the packet (SRQ never ends) */
  464. x = via[SR];
  465. macii_state = read_done;
  466. reply_len -= 3;
  467. reply_ptr -= 3;
  468. need_poll = 1;
  469. /* need to continue; next byte not seen else */
  470. } else {
  471. /* Sanity check */
  472. if (reply_len > 15) reply_len = 0;
  473. /* read byte */
  474. x = via[SR];
  475. *reply_ptr = x;
  476. reply_ptr++;
  477. reply_len++;
  478. }
  479. /* The usual handshake ... */
  480. /*
  481.  * NetBSD hints that the next to last byte 
  482.  * is sent with IRQ !! 
  483.  * Guido found out it's the last one (0x0),
  484.  * but IRQ should be asserted already.
  485.  * Problem with timeout detection: First
  486.  * transition to /IRQ might be second 
  487.  * byte of timeout packet! 
  488.  * Timeouts are signaled by 4x FF.
  489.  */
  490. if (((status & TREQ) == 0) && (x == 0x00)) { /* != 0xFF */
  491. /* invert state bits, toggle ODD/EVEN */
  492. via[B] ^= ST_MASK;
  493. /* adjust packet length */
  494. reply_len--;
  495. reply_ptr--;
  496. macii_state = read_done;
  497. } else {
  498. /* not caught: ST_CMD */
  499. /* required for re-entry 'reading'! */
  500. if ((status & ST_MASK) == ST_IDLE) {
  501. /* (in)sanity check - set even */
  502. via[B] = (via[B] & ~ST_MASK) | ST_EVEN;
  503. } else {
  504. /* invert state bits */
  505. via[B] ^= ST_MASK;
  506. }
  507. }
  508. break;
  509. case read_done:
  510. x = via[SR];
  511. if (reading_reply) {
  512. req = current_req;
  513. req->reply_len = reply_ptr - req->reply;
  514. req->complete = 1;
  515. current_req = req->next;
  516. if (req->done) (*req->done)(req);
  517. } else {
  518. adb_input(reply_buf, reply_ptr - reply_buf,
  519.   regs, 0);
  520. }
  521. /*
  522.  * remember this device ID; it's the latest we got a 
  523.  * reply from!
  524.  */
  525. last_reply = command_byte;
  526. last_active = (command_byte & 0xF0) >> 4;
  527. /* SRQ seen before, initiate poll now */
  528. if (need_poll) {
  529. macii_state = idle;
  530. macii_queue_poll();
  531. need_poll = 0;
  532. break;
  533. }
  534. /* set ADB state to idle */
  535. via[B] = (via[B] & ~ST_MASK) | ST_IDLE;
  536. /* /IRQ seen, so the ADB controller has data for us */
  537. if ((via[B] & TREQ) != 0) {
  538. macii_state = reading;
  539. reply_buf[0] = command_byte;
  540. reply_ptr = reply_buf + 1;
  541. reply_len = 1;
  542. prefix_len = 1;
  543. reading_reply = 0;
  544. } else {
  545. /* no IRQ, send next packet or wait */
  546. macii_state = idle;
  547. if (current_req)
  548. macii_start();
  549. else
  550. macii_retransmit(last_active);
  551. }
  552. break;
  553. default:
  554. break;
  555. }
  556. /* reset mutex and interrupts */
  557. driver_running = 0;
  558. restore_flags(flags);
  559. }