|  | Linux for the Q40 | 
|  | ================= | 
|  |  | 
|  | You may try http://www.geocities.com/SiliconValley/Bay/2602/ for | 
|  | some up to date information. Booter and other tools will be also | 
|  | available from this place or http://ftp.uni-erlangen.de/pub/unix/Linux/680x0/q40/ | 
|  | and mirrors. | 
|  |  | 
|  | Hints to documentation usually refer to the linux source tree in | 
|  | /usr/src/linux/Documentation unless URL given. | 
|  |  | 
|  | It seems IRQ unmasking can't be safely done on a Q40. IRQ probing | 
|  | is not implemented - do not try it! (See below) | 
|  |  | 
|  | For a list of kernel command-line options read the documentation for the | 
|  | particular device drivers. | 
|  |  | 
|  | The floppy imposes a very high interrupt load on the CPU, approx 30K/s. | 
|  | When something blocks interrupts (HD) it will lose some of them, so far | 
|  | this is not known to have caused any data loss. On highly loaded systems | 
|  | it can make the floppy very slow or practically stop. Other Q40 OS' simply | 
|  | poll the floppy for this reason - something that can't be done in Linux. | 
|  | Only possible cure is getting a 82072 controller with fifo instead of | 
|  | the 8272A. | 
|  |  | 
|  | drivers used by the Q40, apart from the very obvious (console etc.): | 
|  | drivers/char/q40_keyb.c		# use PC keymaps for national keyboards | 
|  | serial.c		# normal PC driver - any speed | 
|  | lp.c		# printer driver | 
|  | genrtc.c		# RTC | 
|  | char/joystick/*		# most of this should work, not | 
|  | # in default config.in | 
|  | block/q40ide.c		# startup for ide | 
|  | ide*		# see Documentation/ide.txt | 
|  | floppy.c		# normal PC driver, DMA emu in asm/floppy.h | 
|  | # and arch/m68k/kernel/entry.S | 
|  | # see drivers/block/README.fd | 
|  | net/ne.c | 
|  | video/q40fb.c | 
|  | parport/* | 
|  | sound/dmasound_core.c | 
|  | dmasound_q40.c | 
|  |  | 
|  | Various other PC drivers can be enabled simply by adding them to | 
|  | arch/m68k/config.in, especially 8 bit devices should be without any | 
|  | problems. For cards using 16bit io/mem more care is required, like | 
|  | checking byte order issues, hacking memcpy_*_io etc. | 
|  |  | 
|  |  | 
|  | Debugging | 
|  | ========= | 
|  |  | 
|  | Upon startup the kernel will usually output "ABCQGHIJ" into the SRAM, | 
|  | preceded by the booter signature. This is a trace just in case something | 
|  | went wrong during earliest setup stages of head.S. | 
|  | **Changed** to preserve SRAM contents by default, this is only done when | 
|  | requested - SRAM must start with '%LX$' signature to do this. '-d' option | 
|  | to 'lxx' loader enables this. | 
|  |  | 
|  | SRAM can also be used as additional console device, use debug=mem. | 
|  | This will save kernel startup msgs into SRAM, the screen will display | 
|  | only the penguin - and shell prompt if it gets that far.. | 
|  | Unfortunately only 2000 bytes are available. | 
|  |  | 
|  | Serial console works and can also be used for debugging, see loader_txt | 
|  |  | 
|  | Most problems seem to be caused by fawlty or badly configured io-cards or | 
|  | hard drives anyway. | 
|  | Make sure to configure the parallel port as SPP and remove IRQ/DMA jumpers | 
|  | for first testing. The Q40 does not support DMA and may have trouble with | 
|  | parallel ports version of interrupts. | 
|  |  | 
|  |  | 
|  | Q40 Hardware Description | 
|  | ======================== | 
|  |  | 
|  | This is just an overview, see asm-m68k/* for details ask if you have any | 
|  | questions. | 
|  |  | 
|  | The Q40 consists of a 68040@40 MHz, 1MB video RAM, up to 32MB RAM, AT-style | 
|  | keyboard interface, 1 Programmable LED, 2x8bit DACs and up to 1MB ROM, 1MB | 
|  | shadow ROM. | 
|  | The Q60 has any of 68060 or 68LC060 and up to 128 MB RAM. | 
|  |  | 
|  | Most interfacing like floppy, IDE, serial and parallel ports is done via ISA | 
|  | slots. The ISA io and mem range is mapped (sparse&byteswapped!) into separate | 
|  | regions of the memory. | 
|  | The main interrupt register IIRQ_REG will indicate whether an IRQ was internal | 
|  | or from some ISA devices, EIRQ_REG can distinguish up to 8 ISA IRQs. | 
|  |  | 
|  | The Q40 custom chip is programmable to provide 2 periodic timers: | 
|  | - 50 or 200 Hz - level 2, !!THIS CANT BE DISABLED!! | 
|  | - 10 or 20 KHz - level 4, used for dma-sound | 
|  |  | 
|  | Linux uses the 200 Hz interrupt for timer and beep by default. | 
|  |  | 
|  |  | 
|  | Interrupts | 
|  | ========== | 
|  |  | 
|  | q40 master chip handles only a subset of level triggered interrupts. | 
|  |  | 
|  | Linux has some requirements wrt interrupt architecture, these are | 
|  | to my knowledge: | 
|  | (a) interrupt handler must not be reentered even when sti() is called | 
|  | from within handler | 
|  | (b) working enable/disable_irq | 
|  |  | 
|  | Luckily these requirements are only important for drivers shared | 
|  | with other architectures - ide,serial,parallel, ethernet. | 
|  | q40ints.c now contains a trivial hack for (a), (b) is more difficult | 
|  | because only irq's 4-15 can be disabled - and only all of them at once. | 
|  | Thus disable_irq() can effectively block the machine if the driver goes | 
|  | asleep. | 
|  | One thing to keep in mind when hacking around the interrupt code is | 
|  | that there is no way to find out which IRQ caused a request, [EI]IRQ_REG | 
|  | displays current state of the various IRQ lines. | 
|  |  | 
|  | Keyboard | 
|  | ======== | 
|  |  | 
|  | q40 receives AT make/break codes from the keyboard, these are translated to | 
|  | the PC scancodes x86 Linux uses. So by theory every national keyboard should | 
|  | work just by loading the appropriate x86 keytable - see any national-HOWTO. | 
|  |  | 
|  | Unfortunately the AT->PC translation isn't quite trivial and even worse, my | 
|  | documentation of it is absolutely minimal - thus some exotic keys may not | 
|  | behave exactly as expected. | 
|  |  | 
|  | There is still hope that it can be fixed completely though. If you encounter | 
|  | problems, email me ideally this: | 
|  | - exact keypress/release sequence | 
|  | - 'showkey -s' run on q40, non-X session | 
|  | - 'showkey -s' run on a PC, non-X session | 
|  | - AT codes as displayed by the q40 debugging ROM | 
|  | btw if the showkey output from PC and Q40 doesn't differ then you have some | 
|  | classic configuration problem - don't send me anything in this case | 
|  |  |