Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 7 Mar 2017 12:04:36 -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:  <20170307200436.GA61854@bluezbox.com>
In-Reply-To: <c181e6d1-36e7-c37d-6cf7-a5e4195fdf8b@harmless.hu>
References:  <313fdb93-92c6-609f-57c9-3dec0ce84798@harmless.hu> <20170307190406.GA61203@bluezbox.com> <c181e6d1-36e7-c37d-6cf7-a5e4195fdf8b@harmless.hu>

next in thread | previous in thread | raw e-mail | index | archive | help
Gergely Czuczy (gergely.czuczy@harmless.hu) wrote:
> 
> 
> 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.

You will have to modify kernel config to add "device spigen" and
recompile kernel. I will be adding module for spigen soon though.
spigen API does not have neither CS control nor SPI mode control
that's why there are plans to replace it with more flexible API.

-- 
gonzo



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20170307200436.GA61854>