Since I got asked several times about the pin mappings and wirings between the rfm12 modules and GPIOs of the devices providing them (in my case the Netgear WGT634U router / the Qi NanoNote) I’d like to try making some things clearer:
In Linux the use of buses is tried to get as abstracted as possible – the idea is that the actual boards (or call it whatever you like as devices, platforms etc) define and expose the capability of buses and its properties.
In our case the rfm12 kernel module requires the availability of an SPI bus – it doesn’t matter how it is implemented (native SPI bus, SPI over GPIOs or any other way of implementation). The client module – the kernel module implementing an driver for the actual rfm12 hardware – simply doesn’t care and doesn’t need to know about that.
That’s the reason why the actual rfm12 code doesn’t contain any GPIO <-> rfm12 hardware mappings – the rfm12 code is just using an existing and otherwise exposed SPI bus.
The actual wiring / mapping and setup of the SPI bus is done within the platform / board / device code, which is located below arch/${ARCH}/${BOARD} – a common place for code like that is arch/${ARCH}/${BOARD}/setup.c.
This project however seemed to have raised some interest and I got asked quite a few times about the board specific changes I made – so here they are now:
the kernel patches which provide SPI buses on both boards, including GPIO mappings.
Since both targets I used the rfm12 module and driver on are running OpenWrt, I created both patches against the Linux vanilla tree having OpenWrt specific kernel patches already applied.
Changes however are small and clear, so they should be easy to understand and adapt.
The wiring I used to get the rfm12 module working on the NanoNote working by the way is the following:
GPIO | PIN on SD port | PIN on module | purpose / description
=====|================|===============|=================================
108 | D12 (1) | MISO / SDO | SPI: master input slave output
109 | D13 (2) | nIRQ | interrupt
104 | D08 (3) | (unused) | (unused)
X | VDD (4) | VDD | power
105 | D09 (5) | MOSI / SDI | SPI: master output slave input
X | VSS (6) | GND (1+2) | ground
106 | D10 (7) | SCK | SPI: clock
107 | D11 (8) | nSEL | SPI: chip select
There needs to be a resistor (10-100kOhm) between pin FSK (if used) of
the rfm12 module and VDD as pullup – however when just using ASK it isn’t needed anyway.
3 replies on “RFM12 – kernel patches”
Thanks for clarifying 🙂 I’m adapting your module for other HW platforms 🙂
Hi, could update a link to the rfm12b code, please?
https://github.com/mirko/rfm12-ASK-for-linux doesn’t exist anymore. Thanks.
For others looking for this, it looks like this code was merged into Mirko’s smartswitch repo: https://github.com/mirko/switchsmart/tree/master/drvs/rfm12