×î½üÔڲο¼Á˺ܶàµÄÍøÂç×ÊÔ´ºó±àдµ÷ÊÔÁËÔÚmini2440¿ª·¢°åÉϵÄSPIÇý¶¯³ÌÐò£¬ÒòΪ¼±ÓÚʹÓÃҲûÓзÖÎöS3C2440ÔÚLinuxÏÂ×Ô´øµÄÔ´³ÌÐò£¬±àд³ÌÐòµÄ·½Ê½½ÏΪ¼òµ¥£¬Ö»ÊÇʵÏÖÁ˼òµ¥µÄ×Ö·û·¢ËͺͽÓÊÕ¡£
Ö÷ÒªÊÇÅäÖÃһЩ¼Ä´æÆ÷¡£ÕâЩ¼Ä´æÆ÷µÄÅäÖð´ÕÕS3C2440ÊÖ²áµÄ˵Ã÷À´½øÐÐÉèÖ㬸ù¾Ýmini2440¿ª·¢°åÖ»ÓÐSPI0¿ÉÒÔʹÓã¬SPI1±»°´¼üʹÓÃÁË¡£²ÉÓÃGPEºÍGPGÀ´½øÐпØÖÆ¡£
SPI µÄ±à³Ì²½ÖèÊǵ±Ò»¸ö×Ö½ÚÊý¾ÝдÈëSPTDATn¼Ä´æÆ÷£¬Èç¹ûENSCK¡¢SPCONn¼Ä´æÆ÷µÄMSTR±»ÖÃ룬SPI¿ªÊ¼·¢ËÍ£¬¿ÉÒÔ²ÉÓÃÒÔϲ»×¡À´²Ù×÷SPI£ºÊÖ²áÉϵıà³Ì»ù±¾²½Ö裺
£¨1£©Ê±ÖÓ²¨ÌØÂÊÔ¤¶¨±êÆ÷¼Ä´æÆ÷£¨SPPREn£©
£¨2£©ÉèÖÃSPCONnÀ´ºÏÀíÅäºÏSPIÄ£¿é
£¨3£©Ð´Êý¾Ý0XFFµ½SPTDATnµ½SPTDATn 10´Î£¬Ä¿µÄÊdzõʼ»¯MMC»òSD¿¨
£¨4£©ÉèÖÃÒ»¸öGPTOÒý½Å×÷ΪnSS£¬µÍµçƽÊǼ¤»îMMC»òSD¿¨
£¨5£©·¢ËÍÊý¾Ý->¼ì²é´«Êä×¼±¸±êÖ¾£¨REDY=1£©µÄ״̬£¬È»ºóдÊý¾Ýµ½SPTDATn
£¨6£©½ÓÊÕÊý¾Ý£¨1£©£ºSPCONnµÄTAGDλÊÇÎÞЧ=normal mode£¨0£©->д0XFF µ½SPTDATn£¬È»ºóÈ·ÈÏREDYÖÃ1£¬È»ºó´Ó¶Á»º´æ¶ÁÈ¡Êý¾Ý
£¨7£©½ÓÊÕÊý¾Ý£¨2£©£ºSPCONnµÄTAGDλÊÇÓÐЧ=Tx Auto Garbage Data mode->È·ÈÏREDYÖÃ1£¬È»ºó´Ó¶Á»º´æ¶ÁÈ¡Êý¾Ý£¨È»ºó×Ô¶¯¿ªÊ¼´«Ê䣩
(8)ÉèÖÃÒ»¸öGPIOÒý½Å£¬Æä×÷ΪnSS£¬¸ßµçƽÊǽâ³ý¼¤»îMMC»òSD¿¨¡£
Ô´´úÂëÈçÏ£¬¾ßÌå·ÖÎöµÈÒÔºóÓÐʱ¼ä²¹ÉÏ¡£Õâ¸ö³ÌÐòÔÚmini2440ÏÂÖ±½Ó±àÒë¼´¿ÉÔËÐС£ÎÒÔÚÍøÉÏËÑË÷µÄûÓпÉÒÔÖ±½ÓÔËÐУ¬Ò²ÐíÊÇÎÒ·ÖÎöµÄ²»¹»Í¸³¹£¬ÒòΪʱ¼ä½ôÆÈ½ö½ö¿´ÁËÏ´óÌåµÄ½á¹¹ºÍ×Ô¼ºÐèÒªµÄ²¿·Ö¡£Ï£Íû´ó¼Ò¶à¶à¸øÐ´Òâ¼ûºÍ¸Ä½ø´ëÊ©¡£
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include //printk()
#include
#include
#include
#include
#include //u8,u16,u3¡¡
#include
#include
#include
#include //ºÍÈÎÎñÏà¹Ø
#include
#include
#include
#include
#include
#include
#include
#include //copy_to_user(),copy_from_user()
#include
#include
#include
#include
#include
//--------------------------------------------------------------------------------------------------------------
#define SPI_NAME "MINI2440_SPI"
static int SPI_MAJOR= 55;
//static int spi_major=0;//Ö÷É豸ºÅΪ0±íʾ¶¯Ì¬·ÖÅäÖ÷É豸ºÅ£¬×Ô¶¨Òå´ÎÉ豸ºÅ¡£MKDEV()±íʾÖ÷´ÎºÏ²¢ÎªÉ豸ºÅ
struct spi_dev
{
struct cdev cdev;
char dataTx[4];
char dataRx[4];
};
struct spi_dev *spi_devp;
//-------------------------------------------------------------------------------------------------------
//GPG and GPE control register setting
#define GPG_DEFAULT (S3C2410_GPG3_EINT11|S3C2410_GPG6_EINT14|S3C2410_GPG2_nSS0)
#define GPE_DEFAULT (S3C2410_GPE11_SPIMISO0|S3C2410_GPE12_SPIMOSI0|S3C2410_GPE13_SPICLK0)
#define SPI_CON_DEFAULT (0<<0|0<<1|1<<2|1<<3|1<<4|0<<5|0<<6)//¾ßÌåÉèÖøù¾ÝÇé¿öÈ·¶¨
#define SPI_TXRX_READY ((readl(SPSTA0)&0x1)==0x1)//·¢ËͽÓÊÕ±ê־λÅжÏ
//-------------------------------------------------------------------------------------------------------
//GPG GPE SPI address declare
//GPG
#define GPGCON (unsigned long)ioremap(0x56000060,4)
#define GPGDAT (unsigned long)ioremap(0x56000064,4)
#define GPGUP (unsigned long)ioremap(0x56000068,4)
//GPE
#define GPECON (unsigned long)ioremap(0x56000040,4)
#define GPEDAT (unsigned long)ioremap(0x56000044,4)
#define GPEUP (unsigned long)ioremap(0x56000048,4)
//SPI
#define SPCON0 (unsigned long)ioremap(0x59000000,4)
#define SPSTA0 (unsigned long)ioremap(0x59000004,4)
#define SPPIN0 (unsigned long)ioremap(0x59000008,4)
#define SPPRE0 (unsigned long)ioremap(0x5900000c,4)
#define SPTDAT0 (unsigned long)ioremap(0x59000010,1)
#define SPRDAT0 (unsigned long)ioremap(0x59000014,1)
//CLK control
#define CLKCON (unsigned long)ioremap(0x4c00000c,4)
#define SCRPND (unsigned long)ioremap(0x4a000000,4)
#define INTPND (unsigned long)ioremap(0x4a000010,4)
#define INTMSK (unsigned long)ioremap(0x4a000008,4)
//----------------------------------------------------------------------------------------------------------------------------
//mini2440 SPI config
static void mini2440_spi_config(void)
{
unsigned int port_status;
if(!(CLKCON&(1<<18)))
{
port_status=readl(CLKCON);
port_status|=(1<<18);
writel(port_status,CLKCON);//ʱÖÓʹÄÜ
}