From: Adam A K. <kumpf@MIT.EDU> - 2006-07-08 02:01:51
|
I need to use SPI via the NSSP port on the GumStix and recently upgraded to the 2.6.17gum kernel, rebuilding it to include everything associated with SPI. I would now like to write a very simple C program that initializes the SPI port and then sends/receives some data. There are a lot of *spi.h files so I'm not quite sure what to include and how to go about starting the code. Have lots of people already done this? any suggestions would be greatly appreciated! :) Thanks, Adam Kumpf ku...@mi... |
From: Dave H. <dhy...@gm...> - 2006-07-08 02:19:53
|
HI Adam, On 7/7/06, Adam A Kumpf <ku...@mi...> wrote: > I need to use SPI via the NSSP port on the GumStix and recently upgraded to the > 2.6.17gum kernel, rebuilding it to include everything associated with SPI. > > I would now like to write a very simple C program that initializes the SPI port > and then sends/receives some data. There are a lot of *spi.h files so I'm not > quite sure what to include and how to go about starting the code. Have lots of > people already done this? any suggestions would be greatly appreciated! :) Unfortunately, it's still a little bit more complicated than that. The 2.6.17 kernel includes an spi infratructure, but doesn't include an actual driver. You still need to write the driver. The driver wou be the glue that connects your driver to spi infrastructure. I've just started to dabble in this, and I've started a driver for the robostix, but it's still not functional. There is some documentation in linux-2.6.17gum/Documentation/spi but it doesn't cover how to write the driver. -- Dave Hylands Vancouver, BC, Canada http://www.DaveHylands.com/ |
From: Adam A K. <kumpf@MIT.EDU> - 2006-07-08 02:44:30
|
Hi Dave, Thanks for your input. It is really too bad that SPI is still quite complicated at this point in the GumStix's life. I imagine a large number of people have worked with it in some form or another as it is one of the most commonly used ways to communicate between microcontrollers and many other interface devices. I found a very interesting file with some SSP/NSSP support. It can be included with the line: #include <asm-arm/arch/ssp.h> In that header there is at least some level of support for: ssp_write_word, ssp_read_word, ssp_flush, ssp_enable, ssp_disable, ssp_save_state, ssp_restore_state, ssp_init, ssp_config, ssp_exit. it's not the whole story, but I'm hoping to keep searching and maybe still come up with a simple solution. any other ideas? Thanks, Adam Kumpf ku...@mi... Quoting Dave Hylands <dhy...@gm...>: > HI Adam, > > On 7/7/06, Adam A Kumpf <ku...@mi...> wrote: >> I need to use SPI via the NSSP port on the GumStix and recently >> upgraded to the >> 2.6.17gum kernel, rebuilding it to include everything associated with SPI. >> >> I would now like to write a very simple C program that initializes >> the SPI port >> and then sends/receives some data. There are a lot of *spi.h files >> so I'm not >> quite sure what to include and how to go about starting the code. >> Have lots of >> people already done this? any suggestions would be greatly appreciated! :) > > Unfortunately, it's still a little bit more complicated than that. > > The 2.6.17 kernel includes an spi infratructure, but doesn't include > an actual driver. You still need to write the driver. The driver wou > be the glue that connects your driver to spi infrastructure. > > I've just started to dabble in this, and I've started a driver for the > robostix, but it's still not functional. > > There is some documentation in linux-2.6.17gum/Documentation/spi but > it doesn't cover how to write the driver. > > -- > Dave Hylands > Vancouver, BC, Canada > http://www.DaveHylands.com/ > > Using Tomcat but need to do more? Need to support web services, security? > Get stuff done quickly with pre-integrated technology to make your job easier > Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo > http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642 > _______________________________________________ > gumstix-users mailing list > gum...@li... > https://lists.sourceforge.net/lists/listinfo/gumstix-users > |
From: Dave H. <dhy...@gm...> - 2006-07-08 05:29:30
|
Hi Adam, > I found a very interesting file with some SSP/NSSP support. It can be included > with the line: > #include <asm-arm/arch/ssp.h> These functions can ONLY be called from within the kernel, i.e. from within a driver. -- Dave Hylands Vancouver, BC, Canada http://www.DaveHylands.com/ |
From: Adam A K. <kumpf@MIT.EDU> - 2006-07-08 14:40:02
|
I'm making the SPI driver my project for the day since there isn't one for the GumStix yet. Any tips/tricks I should be aware of? links to making simple device drivers that would apply to making an SPI driver? Functionality I should make sure to include or avoid? Where to post it once it's complete so that others can use/contribute to it? I've been googling around, but there seems to be a LOT of different ways to do it. :) Oh, and if you think I'm overlooking an easier way to go about getting SPI up and running, I would like to know more about that toooo! Thanks so much, Adam Kumpf ku...@mi... Quoting Dave Hylands <dhy...@gm...>: > Hi Adam, > >> I found a very interesting file with some SSP/NSSP support. It can >> be included >> with the line: >> #include <asm-arm/arch/ssp.h> > > These functions can ONLY be called from within the kernel, i.e. from > within a driver. > > -- > Dave Hylands > Vancouver, BC, Canada > http://www.DaveHylands.com/ > > _______________________________________________ > gumstix-users mailing list > gum...@li... > https://lists.sourceforge.net/lists/listinfo/gumstix-users > |
From: Craig H. <cr...@gu...> - 2006-07-08 16:45:18
|
On Jul 8, 2006, at 7:39 AM, Adam A Kumpf wrote: > I'm making the SPI driver my project for the day since there isn't > one for the > GumStix yet. Any tips/tricks I should be aware of? links to > making simple > device drivers that would apply to making an SPI driver? > Functionality I > should make sure to include or avoid? Where to post it once it's > complete so > that others can use/contribute to it? > > I've been googling around, but there seems to be a LOT of different > ways to do > it. :) > > Oh, and if you think I'm overlooking an easier way to go about > getting SPI up > and running, I would like to know more about that toooo! The best way to do it would be to use quilt in the buildroot's linux tree to create a new spi.patch at the top of the patch stack, on your own branch in our subversion repo. Then I can easily merge it onto the main buildroot trunk when you've got it working, and others can easily merge to their own branches to help you during development too. C |
From: Adam A K. <kumpf@MIT.EDU> - 2006-07-10 13:00:44
|
I'm working on a multi-gumstix robotics project and getting the SPI port working is a very important part so that the gumstixs can talk to daughter-board dsps/PICs/other specialized hardware. I've been trying to figure out the NSSP SPI driver setup for quite a while now, but I keep getting stuck. If someone who knows the inner-workings of the linux kernel/drivers I would really appreciate some help. Here is what I "think" I know so far about the SPI setup... - 2.6.17gum has the foundation for SPI support - pxa2xx-spi doesn't come loaded in the kernel, but it can be easily built-in with menuconfig in the 2.6.17gum directory. - 2.6.17gum/arch/mach-pxa/gumstix.c can modified to setup the NSSP SPI port on startup, along with a listing of slave devices. (maybe more can be done here?!?) - now the bindings for pxa2xx-SPI are in place, but the hardware cannot be used without a driver. - A "characer device" driver should fill the gap by allowing a "/dev/spi" node for the SPI device. This allows the user to interact with the calls now embedded in the kernel. - programs should now be able to read/write/setup(via ioctl) the SPI port via its device node. I am stuck on how to go about making the character device driver. In particular, I do not know how to make the driver link to the SPI port. I've looked through some simple character drivers that write kernel messages and create device nodes and all is well.. but how do I modify that to actually interact with the NSSP SPI hardware port? Ideally, a "/dev/spi" device would be created with default parameters when the gumstix boots and then programs could simply read/write to the device. I appreciate all of your feedback to help get SPI actually up and running! :) - Adam Kumpf ku...@mi... |
From: Tim N. <ce...@ya...> - 2006-07-10 15:01:31
|
Adam A Kumpf <kumpf@MIT.EDU> wrote: I'm working on a multi-gumstix robotics project and getting the SPI port working is a very important part so that the gumstixs can talk to daughter-board dsps/PICs/other specialized hardware. I've been trying to figure out the NSSP SPI driver setup for quite a while now, but I keep getting stuck. If someone who knows the inner-workings of the linux kernel/drivers I would really appreciate some help. Here is what I "think" I know so far about the SPI setup... - 2.6.17gum has the foundation for SPI support - pxa2xx-spi doesn't come loaded in the kernel, but it can be easily built-in with menuconfig in the 2.6.17gum directory. - 2.6.17gum/arch/mach-pxa/gumstix.c can modified to setup the NSSP SPI port on startup, along with a listing of slave devices. (maybe more can be done here?!?) - now the bindings for pxa2xx-SPI are in place, but the hardware cannot be used without a driver. - A "characer device" driver should fill the gap by allowing a "/dev/spi" node for the SPI device. This allows the user to interact with the calls now embedded in the kernel. - programs should now be able to read/write/setup(via ioctl) the SPI port via its device node. I am stuck on how to go about making the character device driver. In particular, I do not know how to make the driver link to the SPI port. I've looked through some simple character drivers that write kernel messages and create device nodes and all is well.. but how do I modify that to actually interact with the NSSP SPI hardware port? Ideally, a "/dev/spi" device would be created with default parameters when the gumstix boots and then programs could simply read/write to the device. I appreciate all of your feedback to help get SPI actually up and running! :) - Adam Kumpf ku...@mi... ok, So I was just looking into this and I found a few places which have examples and might help but I con only find one of them for some reason. This is an SPI driver by someone which at this point may already be part of the kernel (I have not looked and I think code already exists there) but the important thing is the code showing how to interface user land code with the SPI module. http://www.paul.de/downloadables/ Look at SPI-DRIVER and if you get version 2.0 it might work. I have not tested any of this, just been doing research. Its a very simple example so if it works, great. --Tim. --------------------------------- Talk is cheap. Use Yahoo! Messenger to make PC-to-Phone calls. Great rates starting at 1¢/min. |
From: Adam A K. <kumpf@MIT.EDU> - 2006-07-10 16:28:36
|
Hi Tim, Thanks for the link. That seems to be in the right directions, although, t= he driver is specific to a parallel port implementation. (it shifts bits in an= d out of two pins on the parallel port). The pxa2xx used with the GumStix ha= s some built-in functionality for SPI that should allow an entire byte to be placed in memory somewhere and then it will be pushed out, with on-chip dedicated hardware, to the SPI bus in a serial manner. (not a bit-shifting = for loop) as a side note, when I "cat /proc/iomem" I get this: 04000300-040fffff : smc91x-regs 04000300-0400030f : smc91x 40301680-403016a3 : pxa2xx-i2c.0 40400000-40400083 : pxa2xx-i2s 40600000-4060ffff : pxa2xx-udc 41100000-41100fff : pxa2xx-mci 41100000-41100fff : pxa2xx-mci 41400000-4140002c : pxa2xx-spi.2 <------ good? 44000000-4400ffff : pxa2xx-fb a0000000-a3ffffff : System RAM a0017000-a01580b3 : Kernel text a015a000-a0198867 : Kernel data If I knew exactly what to put in the pxa2xx-spi.2 memory locations, I may b= e getting close to an idea... This all feels like such a hack though, and no= t a well supported solution. Has _ANYONE_ gotten SPI up and running yet? All I've been able to find via forums/wiki/google/etc. are people trying SPI on the pxa2xx/GumStix without success. - Adam Kumpf ku...@mi... Quoting Tim Newsom <ce...@ya...>: > > > Adam A Kumpf <kumpf@MIT.EDU> wrote: I'm working on a multi-gumstix > robotics project and getting the SPI > port working > is a very important part so that the gumstixs can talk to daughter-board > dsps/PICs/other specialized hardware. > > I've been trying to figure out the NSSP SPI driver setup for quite a > while now, > but I keep getting stuck. If someone who knows the inner-workings of > the linux > kernel/drivers I would really appreciate some help. > > Here is what I "think" I know so far about the SPI setup... > - 2.6.17gum has the foundation for SPI support > - pxa2xx-spi doesn't come loaded in the kernel, but it can be easily buil= t-in > with menuconfig in the 2.6.17gum directory. > - 2.6.17gum/arch/mach-pxa/gumstix.c can modified to setup the NSSP > SPI port on > startup, along with a listing of slave devices. (maybe more can be done > here?!?) > - now the bindings for pxa2xx-SPI are in place, but the hardware cannot > be used > without a driver. > - A "characer device" driver should fill the gap by allowing a > "/dev/spi" node > for the SPI device. This allows the user to interact with the calls now > embedded in the kernel. > - programs should now be able to read/write/setup(via ioctl) the SPI port= via > its device node. > > I am stuck on how to go about making the character device driver. In > particular, I do not know how to make the driver link to the SPI port. I= 've > looked through some simple character drivers that write kernel messages a= nd > create device nodes and all is well.. but how do I modify that to actuall= y > interact with the NSSP SPI hardware port? > > Ideally, a "/dev/spi" device would be created with default parameters > when the > gumstix boots and then programs could simply read/write to the device. > > I appreciate all of your feedback to help get SPI actually up and running= ! :) > > - Adam Kumpf > ku...@mi... > > > ok, So I was just looking into this and I found a few places which > have examples and might help but I con only find one of them for some > reason. > > This is an SPI driver by someone which at this point may already be > part of the kernel (I have not looked and I think code already exists > there) but the important thing is the code showing how to interface > user land code with the SPI module. > > http://www.paul.de/downloadables/ Look at SPI-DRIVER and if you get > version 2.0 it might work. I have not tested any of this, just been > doing research. > > Its a very simple example so if it works, great. > > --Tim. > > > --------------------------------- > Talk is cheap. Use Yahoo! Messenger to make PC-to-Phone calls. Great > rates starting at 1=A2/min. |
From: Simon de B. <si...@v2...> - 2006-07-10 18:07:55
|
Hi, We have been using SPI using the ssp routines in ssp.c (arch-pxa) on the gumstix with success (for driving a custom led display). If you like i can send you the driver code. Chrs, -- Simon de Bakker V2_lab, Rotterdam The Netherlands http://lab.v2.nl Adam A Kumpf wrote: > Hi Tim, >=20 > Thanks for the link. That seems to be in the right directions, althoug= h, the > driver is specific to a parallel port implementation. (it shifts bits i= n and > out of two pins on the parallel port). The pxa2xx used with the GumSti= x has > some built-in functionality for SPI that should allow an entire byte to= be > placed in memory somewhere and then it will be pushed out, with on-chip > dedicated hardware, to the SPI bus in a serial manner. (not a bit-shift= ing for > loop) >=20 > as a side note, when I "cat /proc/iomem" I get this: > 04000300-040fffff : smc91x-regs > 04000300-0400030f : smc91x > 40301680-403016a3 : pxa2xx-i2c.0 > 40400000-40400083 : pxa2xx-i2s > 40600000-4060ffff : pxa2xx-udc > 41100000-41100fff : pxa2xx-mci > 41100000-41100fff : pxa2xx-mci > 41400000-4140002c : pxa2xx-spi.2 <------ good? > 44000000-4400ffff : pxa2xx-fb > a0000000-a3ffffff : System RAM > a0017000-a01580b3 : Kernel text > a015a000-a0198867 : Kernel data >=20 > If I knew exactly what to put in the pxa2xx-spi.2 memory locations, I m= ay be > getting close to an idea... This all feels like such a hack though, an= d not a > well supported solution. >=20 > Has _ANYONE_ gotten SPI up and running yet? All I've been able to find= via > forums/wiki/google/etc. are people trying SPI on the pxa2xx/GumStix wit= hout > success. >=20 > - Adam Kumpf > ku...@mi... >=20 >=20 >=20 >=20 >=20 >=20 > Quoting Tim Newsom <ce...@ya...>: >=20 >> >> Adam A Kumpf <kumpf@MIT.EDU> wrote: I'm working on a multi-gumstix=20 >> robotics project and getting the SPI >> port working >> is a very important part so that the gumstixs can talk to daughter-boa= rd >> dsps/PICs/other specialized hardware. >> >> I've been trying to figure out the NSSP SPI driver setup for quite a >> while now, >> but I keep getting stuck. If someone who knows the inner-workings of >> the linux >> kernel/drivers I would really appreciate some help. >> >> Here is what I "think" I know so far about the SPI setup... >> - 2.6.17gum has the foundation for SPI support >> - pxa2xx-spi doesn't come loaded in the kernel, but it can be easily b= uilt-in >> with menuconfig in the 2.6.17gum directory. >> - 2.6.17gum/arch/mach-pxa/gumstix.c can modified to setup the NSSP=20 >> SPI port on >> startup, along with a listing of slave devices. (maybe more can be don= e >> here?!?) >> - now the bindings for pxa2xx-SPI are in place, but the hardware canno= t >> be used >> without a driver. >> - A "characer device" driver should fill the gap by allowing a=20 >> "/dev/spi" node >> for the SPI device. This allows the user to interact with the calls n= ow >> embedded in the kernel. >> - programs should now be able to read/write/setup(via ioctl) the SPI p= ort via >> its device node. >> >> I am stuck on how to go about making the character device driver. In >> particular, I do not know how to make the driver link to the SPI port.= I've >> looked through some simple character drivers that write kernel message= s and >> create device nodes and all is well.. but how do I modify that to actu= ally >> interact with the NSSP SPI hardware port? >> >> Ideally, a "/dev/spi" device would be created with default parameters=20 >> when the >> gumstix boots and then programs could simply read/write to the device. >> >> I appreciate all of your feedback to help get SPI actually up and runn= ing! :) >> >> - Adam Kumpf >> ku...@mi... >> >> >> ok, So I was just looking into this and I found a few places which=20 >> have examples and might help but I con only find one of them for some=20 >> reason. >> >> This is an SPI driver by someone which at this point may already be=20 >> part of the kernel (I have not looked and I think code already exists=20 >> there) but the important thing is the code showing how to interface=20 >> user land code with the SPI module. >> >> http://www.paul.de/downloadables/ Look at SPI-DRIVER and if you get=20 >> version 2.0 it might work. I have not tested any of this, just been=20 >> doing research. >> >> Its a very simple example so if it works, great. >> >> --Tim. >> >> >> --------------------------------- >> Talk is cheap. Use Yahoo! Messenger to make PC-to-Phone calls. Great=20 >> rates starting at 1=A2/min. >=20 >=20 >=20 >=20 > -----------------------------------------------------------------------= -- > Using Tomcat but need to do more? Need to support web services, securit= y? > Get stuff done quickly with pre-integrated technology to make your job = easier > Download IBM WebSphere Application Server v.1.0.1 based on Apache Geron= imo > http://sel.as-us.falkag.net/sel?cmd=3Dlnk&kid=3D120709&bid=3D263057&dat= =3D121642 > _______________________________________________ > gumstix-users mailing list > gum...@li... > https://lists.sourceforge.net/lists/listinfo/gumstix-users >=20 |
From: Adam A K. <kumpf@MIT.EDU> - 2006-07-12 19:07:31
Attachments:
SPI-Sample.c
SPI-Sample
|
After all the help I've gotten from people on this list, I thought it would be a good idea to post the SPI solution that is now working very well. I started off trying to make one-off character device drivers for the pxa2xx-spi kernel modules, but found it more difficult and indirect that I wanted. After trying many of the suggestions, I finally got the direct register access method of the SPI port up and running in a single C file. I've added lots of comments so hopefully it won't take much to make it fit your project! :) Enjoy! - Adam Kumpf ku...@mi... I'm including the file below, but watch out for line-wraps or other e-mail altering bugs. It's also attached, so that is probably a better idea if you intend to use it. Attached: SPI-Sample.c (C code) Attached: SPI-Sample (binary for 2.6.17gum if you want to quickly try) ----------------------------------------------------------------------------- ----------------------------------------------------------------------------- /************************************************************************** * SPI Sample code. (Direct Regsiter Access via /dev/mem) * * * * This code is fairly straight-forward and does not require extra * * kernel modules to obtain SPI communication via the NSSP Pins * * on the GumStix. Comments have been included for alternate * * bit configurations where appropriate. The pxa255 supports * * Motorola SPI, TexasInstruments SSP, and Microwire. * * * * See the "SPIsetConReg()" function below for more information. * * This example is currently set for: * * 1.6Mbit/sec, SPI, 8-bit-data, idle=low * * GPIO Pins: * * 81 to NSSPClk * * 82 to NSSPSFRM * * 83 to NSSPTXD * * 84 to NSSPRXD * * Enjoy! * * * **************************************************************************/ /************************************************************************** * Created by: Ernest Earon * * Modified by: Adam Kumpf - ku...@mi... (July 2006) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * **************************************************************************/ // ---- Include Files ---------------------------------------------------- #include <fcntl.h> #include <unistd.h> #include <sys/mman.h> #include <stdlib.h> #include <stdio.h> //------------------------------------------------------------------------ // ---- Memory Location Definitions ------------------------------------- //------------------------------------------------------------------------ // See the Intel(r) PXA255 Processor Developer's Manual #define GPIO_BASE_OFFSET 0x40E00000 #define SPIDirROff 0x00000014 #define SPIAfROff 0x00000068 // Register definitions in the PXA255 manual in byte locations #define NSSPCR0_BL 0x41400000 #define NSSPCR1_BL 0x00000004 #define NSSSR_BL 0x00000008 #define NSSITR_BL 0x0000000C #define NSSDR_BL 0x00000010 #define NSST0_BL 0x00000028 #define NSSPSP_BL 0x0000002C // Register definitions in word locations #define NSSPCR0 0x41400000 #define NSSPCR1 0x00000001 #define NSSSR 0x00000002 #define NSSITR 0x00000003 #define NSSDR 0x00000004 #define NSST0 0x00000010 #define NSSPSP 0x00000011 //-------------------------------------------------------------------- // ---- Function Prototypes ----------------------------------------- //-------------------------------------------------------------------- int SPIinit(int ClockDivider); // initialise the SPI stuff int SPIsetConReg(int ClockDivider); // set the control registers for SPI void SPIsetFunc(void); // set alternate functions of pins to NSSP void SPIsetDir(void); // set the appropriate directions int SPI_TxRx(int b); // Write a byte and read a byte //---------------------------------------------------------------- // ---- Global Variables ----------------------------------------- //---------------------------------------------------------------- unsigned long int* PXm_map; unsigned long int* CR_map; int gpio_fd; //*************************************************************************** //*************************************************************************** /** * * Main */ int main(int argc, char *argv[]) { long i = 0; // SPI Datarate Settings... // ClockDivider = 0 ~ 1.62 Mbit/sec // ClockDivider = 4 ~ 480 Kbit/sec // ClockDivider = 8 ~ 300 Kbit/sec // ClockDivider = 16 ~ 170 Kbit/sec int ClockDivider = 0; // start the main routine printf("\n\n"); printf(" ------------------------------------------\n"); printf(" | SPI Sample |\n"); printf(" ------------------------------------------\n"); printf(" | Direct Register Access SPI Sample |\n"); printf(" ------------------------------------------\n"); printf(" -> Msg<- Initializing SPI port\n"); int result = SPIinit(ClockDivider); // Initialize NSSP / SPI Port printf(" -> Msg<- Result of SPI Init = %d\n",result); printf(" -> Msg<- Sending test characters....\n"); for(i=0; i<0x0200; i++){ int rx = SPI_TxRx(i & 0xffff); // Transmit/Receive via NSSP/SPI port printf("0x%04x(0x%04x) \n",i & 0xffff,rx); fflush(stdout); usleep(40000); } printf("\n"); printf(" -> Msg<- Closing NSSP/SPI Port\n"); close(gpio_fd); printf(" -> Msg<- done.\n\n"); return 1; } //*************************************************************************** /** * * SPI Initialization */ int SPIinit (int ClockDivider) { gpio_fd = open("/dev/mem",O_RDWR | O_SYNC); if (gpio_fd < 0) return -1; PXm_map = (unsigned long int*) mmap(NULL, 4096UL, PROT_READ | PROT_WRITE, MAP_SHARED, gpio_fd, GPIO_BASE_OFFSET); if (PXm_map <= 0) return -2; SPIsetDir(); // set the pin directions for 81,82,83,84 SPIsetFunc(); // set the alternate functions of pins 81,82,83,84: return SPIsetConReg(ClockDivider); // Set the nssp function to support motorola SPI } //*************************************************************************** /** * * SPI Transmit / Receive. (they happen at the same time) */ int SPI_TxRx(int b) // send and receive a byte through the SPI { unsigned long int* volatile Reg_FIFO; unsigned long int* volatile Reg_Status; int q; Reg_FIFO = (unsigned long int *)(CR_map + NSSDR); Reg_Status = (unsigned long int *)(CR_map + NSSSR); q = (*Reg_FIFO) & 0xffff; // q = (*Reg_FIFO) & 0xffff; // while(((*Reg_Status) & 32) == 0); // wait for TX FIFO to be at/below threshold while((*Reg_Status) & 16); // wait for SSP to not be Busy *Reg_FIFO = (unsigned long int)b; // Set the Tx Value for(q=0;q<50;q++); // just a tiny delay so Tx will start to go... while(((*Reg_Status) & 32) == 0); // wait for TX FIFO to be at/below threshold while((*Reg_Status) & 16); // wait for SSP to not be Busy return (*Reg_FIFO) & 0xffff; // return the Rx Value } //*************************************************************************** /** * * SPI Configuration Setup: EDIT THIS!! :) * * 0 <= ClockDivider <= 255 * BitRate = 3.6864x106 / (2 x (ClockDivider + 1)) */ int SPIsetConReg (int ClockDivider) // set the control registers for SPI { int gpio_fd = open("/dev/mem",O_RDWR | O_SYNC); unsigned long int* volatile Reg; ClockDivider = ClockDivider & 0xff; if (gpio_fd < 0) return -1; CR_map = (unsigned long int*) mmap(NULL, 4096UL, PROT_READ | PROT_WRITE, MAP_SHARED, gpio_fd, NSSPCR0); if (CR_map <= 0) return -2; Reg = (unsigned long int *)(CR_map + NSSPCR1); (*Reg) = 0x40000000; // -----------CR1 Bit Definitions ------------ // bit 5 = Microwire TxSize (0=8-bit,1=16-bit); // bit 4 = Clock Phase (0=1:0.5, 1=0.5:1) // bit 3 = Clock Polarity Setting (0=idle_is_low, 1=idle_is_high) //*Reg |= 1 << 5; // example, this is how you would set bit 5 for 16-bit Microwire Reg = (unsigned long int *)(CR_map + 0); // this will also enable the SPI // -----------CR0 Bit Definitions ------------ // bit 15:8 = clockrate divider // bit 7 = SSP Enable // bit 6 = Select External Clock (0=internal) // bit 5:4 = frame format (0=Motorola, 1=TexInst, 2=Natl.Microwire) // bit 3:0 = data bits - 1 (ex. 0x7 = 8-data-bits, 0xf = 16-data-bits) *Reg = 0x07; // 16-data-bits,Motorola format (use 0x07 for 8-data-bits,Motorola) *Reg |= ClockDivider << 8; *Reg |= 1 << 7; // Enable SPI printf(" -> Msg<- SPIsetConReg: CR0 = 0x%04x\n",(*Reg)); return 1; } void SPIsetFunc (void) { // map offset: // pins 81-84 are in 6th AF reg (AFR 5) // byte position is 5 * bytes per unit + AF Reg Offset = 5 * 4 + 0x54 = 104 // 104 bytes to words = 104/4 = 26 --> 26 <-- unsigned long int* volatile pGPAF = (PXm_map + 26); //Set 81 to NSSPClk // 82 to NSSPSFRM // 83 to NSSPTXD // 84 to NSSPRXD // What pins do we set to 1s? // what pins do we set to 0s? *pGPAF = 596; } void SPIsetDir (void) { // map offset: // pins 81-84 are in 3rd Dir reg (DirR 2) // byte position is 2 * bytes per unit + Dir Reg Offset = 2 * 4 + 0xC = 20 // 104 bytes to words = 20/4 = 5 --> 5 <-- unsigned long int* volatile pGPD = (PXm_map + 5); //Set 81 to out bit 17 1 // 82 to out 18 1 // 83 to out 19 1 // 84 to in 20 0 *pGPD = 0xE0000; } |