help with coding a loadable kernel module

Daniel Braniss danny at cs.huji.ac.il
Fri Apr 17 13:26:00 UTC 2015


> On Apr 17, 2015, at 4:13 PM, Ian Lepore <ian at freebsd.org> wrote:
> 
> On Fri, 2015-04-17 at 13:46 +0300, Daniel Braniss wrote:
>>> On Apr 17, 2015, at 12:55 PM, Tom Jones <jones at sdf.org> wrote:
>>> 
>>> On Fri, Apr 17, 2015 at 12:15:33PM +0300, Daniel Braniss wrote:
>>>> 
>>>>> On Apr 17, 2015, at 11:08 AM, Kurt Jaeger <lists at opsec.eu> wrote:
>>>>> 
>>>>> Hi!
>>>>> 
>>>>>> I know I'm embarking on a dangerous trip, but I want to use a Raspberry Pi
>>>>>> and or a BeagleBone to read (and write) RFID cards.
>>>>>> Since a driver is needed to use the spibus, I have 2 options while
>>>>>> developing:
>>>>> [...]
>>>>>> So before I give up on option 2, is there some examples/help?
>>>>> 
>>>>> Are you aware of this book ?
>>>>> 
>>>>> http://www.nostarch.com/bsddrivers.htm <http://www.nostarch.com/bsddrivers.htm>
>>>> 
>>>> no, but before I spend more money (this is getting expensive :-),
>>>> does it explain how to write a loadable module that needs to to talk
>>>> to a spibus? 
>>> 
>>> I don't think it does.
>>> 
>>> spibus is very simple, there is one interface call
>>> 
>>> SPIBUS_TRANSFER(device_t, device_t, strcut spi_command);
>>> 
>> 
>> chicken and egg issue :-), what device_t dev should I use?
>> it must point to the spibus …
> 
> Your device will be a child of the spibus, and it is the bus that

it’s the ‘child of’ that I have problems. this will be a loadable module, so
it will have to tell the parent that he is no longer an orphan :-)


> implements the SPIBUS_TRANSFER() method, so it's the bus's device_t that
> needs to be passed as the first parameter in the call (if it were C++ it
> would be the "this" pointer -- this stuff is OO implemented in plain-C).
>> From your driver, something like:
> 
>  SPIBUS_TRANSFER(device_get_parent(sc->sc_dev), sc->sc_dev, cmdptr);
> 
> I haven't got time this morning to put together a complete example of
> how to add a module to the build, but the process is basically along the
> lines of...
> 
>  Add a new directory to sys/dev for your driver just like you were
> going to compile it into the kernel.  Then in sys/modules find another
> simple driver, copy it to a new directory, and change the names of
> things in the makefile so that it refers to your new dir/files in
> sys/dev.  You can set MODULES_OVERRIDE=yournew_dirname on the make
> command line or in your kernel config to make it compile.
> 

I have that, even figured out how to cross compile and use the make buildenv.
it’s great! I can compile outside the source tree too.

thanks,
	danny



More information about the freebsd-arm mailing list