| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | Linux for the Q40 | 
 | 2 | ================= | 
 | 3 |  | 
 | 4 | You may try http://www.geocities.com/SiliconValley/Bay/2602/ for | 
 | 5 | some up to date information. Booter and other tools will be also | 
 | 6 | available from this place or ftp.uni-erlangen.de/linux/680x0/q40/ | 
 | 7 | and mirrors. | 
 | 8 |  | 
 | 9 | Hints to documentation usually refer to the linux source tree in | 
 | 10 | /usr/src/linux/Documentation unless URL given. | 
 | 11 |  | 
 | 12 | It seems IRQ unmasking can't be safely done on a Q40. IRQ probing | 
 | 13 | is not implemented - do not try it! (See below) | 
 | 14 |  | 
 | 15 | For a list of kernel command-line options read the documentation for the | 
 | 16 | particular device drivers. | 
 | 17 |  | 
 | 18 | The floppy imposes a very high interrupt load on the CPU, approx 30K/s. | 
 | 19 | When something blocks interrupts (HD) it will lose some of them, so far | 
 | 20 | this is not known to have caused any data loss. On highly loaded systems | 
 | 21 | it can make the floppy very slow or practically stop. Other Q40 OS' simply | 
 | 22 | poll the floppy for this reason - something that can't be done in Linux. | 
 | 23 | Only possible cure is getting a 82072 controller with fifo instead of | 
 | 24 | the 8272A. | 
 | 25 |  | 
 | 26 | drivers used by the Q40, apart from the very obvious (console etc.): | 
 | 27 | 	drivers/char/q40_keyb.c		# use PC keymaps for national keyboards | 
 | 28 | 		     serial.c		# normal PC driver - any speed | 
 | 29 | 	             lp.c		# printer driver | 
 | 30 | 		     genrtc.c		# RTC | 
 | 31 | 		char/joystick/*		# most of this should work, not | 
 | 32 | 				        # in default config.in | 
 | 33 | 	        block/q40ide.c		# startup for ide | 
 | 34 | 		      ide*		# see Documentation/ide.txt | 
 | 35 | 		      floppy.c		# normal PC driver, DMA emu in asm/floppy.h | 
 | 36 | 					# and arch/m68k/kernel/entry.S | 
 | 37 | 					# see drivers/block/README.fd | 
 | 38 | 		net/ne.c | 
 | 39 | 		video/q40fb.c | 
 | 40 | 		parport/* | 
 | 41 | 		sound/dmasound_core.c | 
 | 42 | 		      dmasound_q40.c | 
 | 43 |  | 
 | 44 | Various other PC drivers can be enabled simply by adding them to | 
 | 45 | arch/m68k/config.in, especially 8 bit devices should be without any | 
 | 46 | problems. For cards using 16bit io/mem more care is required, like | 
 | 47 | checking byte order issues, hacking memcpy_*_io etc. | 
 | 48 |  | 
 | 49 |  | 
 | 50 | Debugging | 
 | 51 | ========= | 
 | 52 |  | 
 | 53 | Upon startup the kernel will usually output "ABCQGHIJ" into the SRAM, | 
 | 54 | preceded by the booter signature. This is a trace just in case something | 
 | 55 | went wrong during earliest setup stages of head.S. | 
 | 56 | **Changed** to preserve SRAM contents by default, this is only done when | 
 | 57 | requested - SRAM must start with '%LX$' signature to do this. '-d' option | 
 | 58 | to 'lxx' loader enables this. | 
 | 59 |  | 
 | 60 | SRAM can also be used as additional console device, use debug=mem. | 
 | 61 | This will save kernel startup msgs into SRAM, the screen will display | 
 | 62 | only the penguin - and shell prompt if it gets that far.. | 
 | 63 | Unfortunately only 2000 bytes are available. | 
 | 64 |  | 
 | 65 | Serial console works and can also be used for debugging, see loader_txt | 
 | 66 |  | 
 | 67 | Most problems seem to be caused by fawlty or badly configured io-cards or | 
 | 68 | hard drives anyway. | 
 | 69 | Make sure to configure the parallel port as SPP and remove IRQ/DMA jumpers | 
 | 70 | for first testing. The Q40 does not support DMA and may have trouble with | 
 | 71 | parallel ports version of interrupts. | 
 | 72 |  | 
 | 73 |  | 
 | 74 | Q40 Hardware Description | 
 | 75 | ======================== | 
 | 76 |  | 
 | 77 | This is just an overview, see asm-m68k/* for details ask if you have any | 
 | 78 | questions. | 
 | 79 |  | 
 | 80 | The Q40 consists of a 68040@40 MHz, 1MB video RAM, up to 32MB RAM, AT-style | 
 | 81 | keyboard interface, 1 Programmable LED, 2x8bit DACs and up to 1MB ROM, 1MB | 
 | 82 | shadow ROM. | 
 | 83 | The Q60 has any of 68060 or 68LC060 and up to 128 MB RAM. | 
 | 84 |  | 
 | 85 | Most interfacing like floppy, IDE, serial and parallel ports is done via ISA | 
 | 86 | slots. The ISA io and mem range is mapped (sparse&byteswapped!) into separate | 
 | 87 | regions of the memory. | 
 | 88 | The main interrupt register IIRQ_REG will indicate whether an IRQ was internal | 
 | 89 | or from some ISA devices, EIRQ_REG can distinguish up to 8 ISA IRQs. | 
 | 90 |  | 
 | 91 | The Q40 custom chip is programmable to provide 2 periodic timers: | 
 | 92 | 	- 50 or 200 Hz - level 2, !!THIS CANT BE DISABLED!! | 
 | 93 | 	- 10 or 20 KHz - level 4, used for dma-sound | 
 | 94 |  | 
 | 95 | Linux uses the 200 Hz interrupt for timer and beep by default. | 
 | 96 |  | 
 | 97 |  | 
 | 98 | Interrupts | 
 | 99 | ========== | 
 | 100 |  | 
 | 101 | q40 master chip handles only a subset of level triggered interrupts. | 
 | 102 |  | 
 | 103 | Linux has some requirements wrt interrupt architecture, these are | 
 | 104 | to my knowledge: | 
 | 105 | 	(a) interrupt handler must not be reentered even when sti() is called | 
 | 106 | 	    from within handler | 
 | 107 | 	(b) working enable/disable_irq | 
 | 108 |  | 
 | 109 | Luckily these requirements are only important for drivers shared | 
 | 110 | with other architectures - ide,serial,parallel, ethernet. | 
 | 111 | q40ints.c now contains a trivial hack for (a), (b) is more difficult | 
 | 112 | because only irq's 4-15 can be disabled - and only all of them at once. | 
 | 113 | Thus disable_irq() can effectively block the machine if the driver goes | 
 | 114 | asleep. | 
 | 115 | One thing to keep in mind when hacking around the interrupt code is | 
 | 116 | that there is no way to find out which IRQ caused a request, [EI]IRQ_REG | 
 | 117 | displays current state of the various IRQ lines. | 
 | 118 |  | 
 | 119 | Keyboard | 
 | 120 | ======== | 
 | 121 |  | 
 | 122 | q40 receives AT make/break codes from the keyboard, these are translated to | 
 | 123 | the PC scancodes x86 Linux uses. So by theory every national keyboard should | 
 | 124 | work just by loading the appropriate x86 keytable - see any national-HOWTO. | 
 | 125 |  | 
 | 126 | Unfortunately the AT->PC translation isn't quite trivial and even worse, my | 
 | 127 | documentation of it is absolutely minimal - thus some exotic keys may not | 
 | 128 | behave exactly as expected. | 
 | 129 |  | 
 | 130 | There is still hope that it can be fixed completely though. If you encounter | 
 | 131 | problems, email me ideally this: | 
 | 132 | 	- exact keypress/release sequence | 
 | 133 | 	- 'showkey -s' run on q40, non-X session | 
 | 134 | 	- 'showkey -s' run on a PC, non-X session | 
 | 135 | 	- AT codes as displayed by the q40 debugging ROM | 
 | 136 | btw if the showkey output from PC and Q40 doesn't differ then you have some | 
 | 137 | classic configuration problem - don't send me anything in this case | 
 | 138 |  |