LinuxQuestions.org
Review your favorite Linux distribution.
Go Back   LinuxQuestions.org > Forums > Linux Forums > Linux - Hardware > Linux - Embedded & Single-board computer
User Name
Password
Linux - Embedded & Single-board computer This forum is for the discussion of Linux on both embedded devices and single-board computers (such as the Raspberry Pi, BeagleBoard and PandaBoard). Discussions involving Arduino, plug computers and other micro-controller like devices are also welcome.

Notices


Reply
  Search this Thread
Old 10-21-2009, 01:24 PM   #1
sunr2007
Member
 
Registered: Jan 2009
Location: Bangalore , India
Distribution: Fedora 12
Posts: 65

Rep: Reputation: 17
My SPI driver not working in u-boot.


Dear All

Im tryin to write a SPI Driver in u-boot-1.3.4 with SPI BUS 1 support for my processor AT91SAM9261 . I have defined the base macro for SPI bus 1 AT91SAM9261_BASE_SPI1 in /asm/arch/hardware.h and i av passed the bus id and chip select id . but im not getting any data or clock value on the pins . can any body let me what stupid mistake im committing? below is my source


#include <common.h>
#include <spi.h>
#include <malloc.h>

#include <asm/io.h>

#include <asm/arch/hardware.h
#include <asm/arch/at91_spi.h>
#include "atmel_spi.h"


void spi_init()
{
/* do some initialization of SPI bus pins*/
at91_set_A_periph(AT91_PIN_PA25, 0); /* SPI0_NPCS01 */
at91_set_A_periph(AT91_PIN_PB30, 0); /* SPI0_MISO */
at91_set_A_periph(AT91_PIN_PB31, 0); /* SPI0_MOSI */
at91_set_A_periph(AT91_PIN_PB29, 0); /* SPI0_SPCK */

/* Enable clock */
at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9261_ID_SPI1);


/* Reset the SPI */
//spi_writel(ATMEL_SPI_SWRST, ATMEL_SPI_CR,1);

}
struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
unsigned int max_hz, unsigned int mode)
{
struct atmel_spi_slave *as;
unsigned int scbr;
u32 csrx;
void *regs;
max_hz=15000000;/* modified for AMOLED*/
mode=ATMEL_SPI_MR_MSTR;
mode =0;/* falling edge of clock spi XFER*/
bus=AT91SAM9261_ID_SPI1;
cs=AT91_PIN_PA25;/* chip select of the slave connected to . */
if (cs > 3 || !spi_cs_is_valid(bus, cs))
return NULL;
regs = (void *)AT91SAM9261_BASE_SPI1; /* spi bus 1 ID of the */
/* Reset the SPI */
spi_writel(as,ATMEL_SPI_CR,ATMEL_SPI_SWRST);
scbr = (AT91_MASTER_CLOCK/max_hz)<<8; /* configure serial clock baud rate*/
if (scbr > ATMEL_SPI_CSRx_SCBR_MAX)
/* Too low max SCK rate */
return NULL;
if (scbr < 1)
scbr = 1;

csrx = ATMEL_SPI_CSRx_SCBR(scbr);
csrx |= ATMEL_SPI_CSRx_BITS(ATMEL_SPI_BITS_8);
if (!(mode & SPI_CPHA))
csrx |= ATMEL_SPI_CSRx_NCPHA;
if (mode & SPI_CPOL)
csrx |= ATMEL_SPI_CSRx_CPOL;

as = malloc(sizeof(struct atmel_spi_slave));
if (!as)
return NULL;

as->slave.bus = bus;
as->slave.cs = cs;
as->regs = regs;
as->mr = ATMEL_SPI_MR_MSTR | ATMEL_SPI_MR_MODFDIS
| ATMEL_SPI_MR_PCS(~(1 << cs) & 0xf);
as->mr = ATMEL_SPI_CSRx_NCPHA | ATMEL_SPI_CSR(2) | ATMEL_SPI_MR_MSTR ;/* configure chipselect*/
spi_writel(as, CSR(cs), csrx);

return &as->slave;
}

void spi_free_slave(struct spi_slave *slave)
{
struct atmel_spi_slave *as = to_atmel_spi(slave);

free(as);
}

int spi_claim_bus(struct spi_slave *slave)
{
struct atmel_spi_slave *as = to_atmel_spi(slave);

/* Enable the SPI hardware */
spi_writel(as, CR, ATMEL_SPI_CR_SPIEN);

/*
* Select the slave. This should set SCK to the correct
* initial state, etc.
*/
spi_writel(as, MR, as->mr);

return 0;
}

void spi_release_bus(struct spi_slave *slave)
{
struct atmel_spi_slave *as = to_atmel_spi(slave);

/* Disable the SPI hardware */
spi_writel(as, CR, ATMEL_SPI_CR_SPIDIS);
}

int spi_xfer(struct spi_slave *slave, unsigned int bitlen,
const void *dout, void *din, unsigned long flags)
{
struct atmel_spi_slave *as = to_atmel_spi(slave);
unsigned int len_tx;
unsigned int len_rx;
unsigned int len;
int ret;
u32 status;
unsigned short mask ;
const u8 *txp = dout;
u8 *rxp = din;
u8 value;
unsigned int pol;
bitlen=8;

ret = 0;
if (bitlen == 0)
/* Finish any previously submitted transfers */
goto out;

/*
* TODO: The controller can do non-multiple-of-8 bit
* transfers, but this driver currently doesn't support it.
*
* It's also not clear how such transfers are supposed to be
* represented as a stream of bytes...this is a limitation of
* the current SPI interface.
*/
if (bitlen % 8) {
/* Errors always terminate an ongoing transfer */
flags |= SPI_XFER_END;
goto out;
}

len = bitlen / 8;

/*
* The controller can do automatic CS control, but it is
* somewhat quirky, and it doesn't really buy us much anyway
* in the context of U-Boot.
*/
if (flags & SPI_XFER_BEGIN)
spi_cs_activate(slave);

for (len_tx = 0, len_rx = 0; len_rx < len; ) {
status = spi_readl(as, SR);

if (status & ATMEL_SPI_SR_OVRES)
return -1;

if (len_tx < len && (status & ATMEL_SPI_SR_TDRE)) {
if (txp)
value = *txp++;
else
value = 0;
udelay(500000);
pol=spi_claim_bus(slave);
spi_writel(as, TDR, value); /*write data into device */
spi_release_bus(slave)
len_tx++;


if (status & ATMEL_SPI_SR_RDRF) {


value = spi_readl(as, RDR);

if (rxp)
*rxp++ = value;
len_rx++;
}
}

out:
if (flags & SPI_XFER_END) {
/*
* Wait until the transfer is completely done before
* we deactivate CS.
*/
do {
status = spi_readl(as, SR);
} while (!(status & ATMEL_SPI_SR_TXEMPTY));
//spi_writel(as,ATMEL_SPI_CSRx_CSAAT, value);
spi_cs_deactivate(slave);
}

return 0;
}
 
Old 10-24-2009, 07:17 AM   #2
sunr2007
Member
 
Registered: Jan 2009
Location: Bangalore , India
Distribution: Fedora 12
Posts: 65

Original Poster
Rep: Reputation: 17
Hi I found out that its not getting used by the board or mapped. what i mean is that after compilation its not present in the u-boot.map file i did the following changes to get it compiled. i have done the following
changes
in Makefiel in /drivers/spi/
COBJS-$(CONFIG_ATMEL_SPI) += atmel_spi.o
COBJS-$(CONFIG_ATMEL_SPI) += spi-new.o


and in the config file located at /include/configs/at9sam9261ek.h

i have added
#define ATMEL_SPI 1
. though my code is getting executed its not getting mapped . i dont
find it in the u-boot.map also .
what else to do ? any suggestions?
warm regards,
Ravi Kulkarni.
 
  


Reply


Thread Tools Search this Thread
Search this Thread:

Advanced Search

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off



Similar Threads
Thread Thread Starter Forum Replies Last Post
Linux SPI Framework ananth86coolguy Linux - Newbie 2 09-22-2009 03:07 AM
SPI interface with AT91SAM9261 sunr2007 Linux - Embedded & Single-board computer 0 08-03-2009 03:43 AM
SPI Flash driver (mtd) for Spansion S25FL128P luklem Linux - Embedded & Single-board computer 0 07-30-2009 10:04 AM
how to write spi driver for mpc8247 saheelahamed Linux - Software 1 02-20-2008 12:27 AM
Ipsec error: SPI piggyj Linux - Security 0 11-09-2006 10:34 PM

LinuxQuestions.org > Forums > Linux Forums > Linux - Hardware > Linux - Embedded & Single-board computer

All times are GMT -5. The time now is 04:51 PM.

Main Menu
Advertisement
My LQ
Write for LQ
LinuxQuestions.org is looking for people interested in writing Editorials, Articles, Reviews, and more. If you'd like to contribute content, let us know.
Main Menu
Syndicate
RSS1  Latest Threads
RSS1  LQ News
Twitter: @linuxquestions
Facebook: linuxquestions Google+: linuxquestions
Open Source Consulting | Domain Registration