Date: Tue, 7 Mar 2017 21:00:05 +0100 From: Gergely Czuczy <gergely.czuczy@harmless.hu> To: Oleksandr Tymoshenko <gonzo@bluezbox.com> Cc: freebsd-hackers@freebsd.org Subject: Re: SPI communication from userspace Message-ID: <c181e6d1-36e7-c37d-6cf7-a5e4195fdf8b@harmless.hu> In-Reply-To: <20170307190406.GA61203@bluezbox.com> References: <313fdb93-92c6-609f-57c9-3dec0ce84798@harmless.hu> <20170307190406.GA61203@bluezbox.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On 2017. 03. 07. 20:04, Oleksandr Tymoshenko wrote: > 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. This is quite interesting, actually seems like the stuff I wanted to write. However, I've found spigen.c in the kernel source, but I couldn't find how to load it. There are no modules under /boot/kernel/ and kldload -v doesn't show it up either. Also, there are no /dev/spi* devices, however spibus is loaded: # kldstat -v | grep spi 259 simplebus/bcm2835_spi 109 spi/spibus 108 spi/ofw_spibus Could you please give me some help how to load it? Might be the stuff I'm actually looking for. Only question is, whether does it allows me to do a manual CS, instead of automatically using the dedicated pins. > > 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 Thank you, I will take a look at these as well.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?c181e6d1-36e7-c37d-6cf7-a5e4195fdf8b>