Date: Tue, 7 Mar 2017 11:04:06 -0800 From: Oleksandr Tymoshenko <gonzo@bluezbox.com> To: Gergely Czuczy <gergely.czuczy@harmless.hu> Cc: freebsd-hackers@freebsd.org Subject: Re: SPI communication from userspace Message-ID: <20170307190406.GA61203@bluezbox.com> In-Reply-To: <313fdb93-92c6-609f-57c9-3dec0ce84798@harmless.hu> References: <313fdb93-92c6-609f-57c9-3dec0ce84798@harmless.hu>
next in thread | previous in thread | raw e-mail | index | archive | help
Gergely Czuczy (gergely.czuczy@harmless.hu) wrote: > Hello, > > I would like to ask for some help, on how to communicate with an > Adafruit MAX31856 breakout board over the SPI bus under freebsd, on an > RPi3. As far as I can see, the spibus(4) driver is there, but there's no > driver for this chip, and I can't access the SPI calls from userspace > either. I could try to write a driver, however I don't have the > experience working with the FreeBSD kernel. > > SPI communication is quite simple, you send a single byte to the device, > and if the MSB was 1 it's a write, if it's 0 it's a read operation, > remaining 7 bits is the address. Then you either write a byte to the > address, or wait for the device to respond by the next cycle. > > Other difficulty is, the RPi3 provides 2 PINs for CS, and I have 3 > devices, so I either have to use generic GPIO PINs, or de/multiplex it, > which might require a userspace call for device selection on the bus. > > So, how should I start? What would be a good way to do the > userspace-kernelspace communication? Also, I'm not sure whether I should > do a specific driver for this device, or a generic one, and writing the > specifics in userspace. > > Also, if you could point me to some documentation which would explain > how to work with the kernel, make a custom module, the possible > user/kernelspace communication possibilities, and how to call another > kernel module's functions, would be quite appreciated. Also, if someone > knows where could I find docs on the spibus driver, would be quite nice > since, it's just code so far. Hi Gregory, To access raw SPI from userland you can use spidev. Unfortunately functionality of this driver is limited and there is not much documentation around. There are plans to replace it with more versatile linux-like API but no actual implementation yet. I put together some demos for spidev: https://github.com/gonzoua/freebsd-embedded-demos More info on these demos: https://kernelnomicon.org/?p=757 As an alternative you can code custom driver that talks to SPI bus in kernel and exposes control to userland via sysctls. You can get some references on how to use in-kernel SPI API looking at mx25l flash driver: https://github.com/freebsd/freebsd/blob/master/sys/dev/flash/mx25l.c And use DS3231 driver as a reference for reporting temperature as sysctl: https://github.com/freebsd/freebsd/blob/master/sys/dev/iicbus/ds3231.c Actual implementation will depend on your requirements -- gonzo
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20170307190406.GA61203>