Functional keypad (and more) on the Nokia N900

Hi port-arm@,
as some of you may have noticed already, I have made great progress on
supporting the Nokia N900 (OMAP 3430). I had to change some code deep
down in interrupt handling within the ARM PIC code, with potential
impact on every port using it, so it is definitely not ready for being
committed to the main tree.
It also requires the patch that was discussed earlier for interrupt
locators on the GPIO, I2C and SPI buses, yet found not desirable for
integration as-is.
Anyway, now, for the current progress.
- lots of GPIO sensors and buttons are supported:
* USB charging status (may need rework)
* audio jack insertion
* camera button (focus + capture)
* camera cover slide
* keypad slide
* lock button
* proximity sensor
- basic keypad support (slow, no key combinations)
- extra 18 GPIO pins on the TPS65950 companion chip (needs better
testing, doesn't support level-triggered interrupts yet)
- ST MEMS accelerometer (needs more tests and merging with hpacel)
- OMAP SPI bus support (needs better testing)
- TSC2005 touchscreen (to be confirmed)
Support for the volume keys and the power button should be fairly
trivial to add as well. So far I have implemented most of these simple
sensors and buttons via sysmon_pswitch(9), as hotkeys - there will
certainly be more appropriate ways to expose them to the system.
The current code can be found here:
https://github.com/khorben/khorben-n900
Just overwrite a recent -current source repository with the files found
in the Github project above, and build a N900 evbarm kernel. My device
is set to developer mode (see the Maemo wiki for the procedure) and I am
booting on an SD card. It is done the same way as when booting Mer but
with a NetBSD kernel (with "netbsd.gz.ub" as "uImage") and userland
instead (FFS on the first partition is fine).
A known issue, among others: the six times 32 plus 18 GPIO pins seem to
be too many for the amount of interrupt slots pre-allocated in the ARM
PIC code - which is why I disabled omapgpio5 and n900audjck0 in the
kernel configuration file for the moment. I have to investigate some
more there.
I have made it to single-user, although multi-user should work just fine
too. I'd like to run X next, and support some more hardware components.
HTH!
--
khorben