www.pudn.com > s3c2410-spi.rar > s3c2410-spi.c


#include 
#include 
#include 
#include 
#include 
#include 
#include 
 
 
 
//#undef DEBUG 
 
#define DEBUG 
#ifdef DBUGE 
#define DPRINTK(x...)    printk("s3c2410-spi:" ## x) 
#else 
#define DPRINTK(x...) 
#endif 
 
#ifdef CONFIG_SMP 
#define __SMP__ 
#endif 
 
/* 
GPE3    nSS0 
GPE11    SPIMOSI0 
GPE12    SPIMISO0 
GPE13 SPICLK0 
*/ 
 
#define LED_SCLK    GPIO_E13 
#define LED_SDAT    GPIO_E12 
#define LED_RCLK    GPIO_B0 
 
 
 
 
 
#define DEVICE_NAME    "s3c2410-spi" 
#define SPI_MINOR    1 
 
static int SPI_MAJOR = 0; 
static char SpiData = 0; 
 
 
static ssize_t s3c2410_spi_write(struct file* file,const char* buffer,size_t count,loff_t* ppos) 
{ 
 
    copy_from_user(&SpiData,buffer,sizeof(SpiData)); 
 
    DPRINTK("write: SPI=0x%x,count = %d\n",SpiData,count); 
   
    if((SPSTA0 & 0x01) == 0x01) //data Tx/Rx ready 
    { 
        SPTDAT0 = SpiData; 
    } 
     
    clr_gpio_bit(GPIO_B0); 
    udelay(10); 
    set_gpio_bit(GPIO_B0); 
     
    return 0;     
 
} 
 
static int s3c2410_spi_open(struct inode* inode,struct file* filp) 
{ 
    DPRINTK(DEVICE_NAME "open \n"); 
    MOD_INC_USE_COUNT; 
     
   set_gpio_ctrl(GPIO_MODE_nSS|GPIO_PULLUP_DIS|GPIO_E3);         //nSS    no-pullup  
 
   set_gpio_ctrl(GPIO_MODE_SPICLK|GPIO_PULLUP_DIS|GPIO_E13);     // CLK0     no-pullup  
 
       set_gpio_ctrl(GPIO_MODE_SPIMOSI|GPIO_PULLUP_EN|GPIO_E12);   //SPIMOSI    pullup  
 
       set_gpio_ctrl(GPIO_MODE_SPIMISO|GPIO_PULLUP_EN|GPIO_E13);         // SPIMISO     pullup  
 
      
 
    SPPRE0 = 0x00; //set baud rate prescaler register; Baud rate = PCLK/2/(Prescaler value + 1) 
 
    SPCON0    = (0<<6)|(0<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0); 
    //polling,en_sck,master,low,format A,normal 
 
    SPPIN0 = (0<<2)|(1<<1)|(0<<0); 
    //Multi Master error detect disable, reserved release 
 
     
    return 0;  
 
} 
 
static int s3c2410_spi_release(struct inode* inode,struct file* filp) 
{ 
    DPRINTK(DEVICE_NAME" release \n"); 
    MOD_DEC_USE_COUNT; 
     
    return 0; 
} 
 
static struct file_operations s3c2410_spi_fops ={ 
    owner:         THIS_MODULE, 
    open:         s3c2410_spi_open, 
    write:        s3c2410_spi_write, 
    release:    s3c2410_spi_release, 
}; 
 
#ifdef CONFIG_DEVFS_FS 
static devfs_handle_t devfs_spi_dir,devfs_spi_raw; 
#endif 
 
static int __init s3c2410_spi_init(void) 
{     
    int ret; 
     
     
    ret = register_chrdev(SPI_MAJOR,DEVICE_NAME,&s3c2410_spi_fops); 
 
    if(ret < 0) 
    { 
        printk(DEVICE_NAME "can't get major number\n"); 
        return ret; 
    } 
     
    SPI_MAJOR = ret; 
     
    #ifdef CONFIG_DEVFS_FS 
    devfs_spi_dir = devfs_mk_dir(NULL,"spi",NULL); 
    devfs_spi_raw = devfs_register(devfs_spi_dir,"0",DEVFS_FL_DEFAULT, 
            SPI_MAJOR,SPI_MINOR,S_IFCHR|S_IRUSR|S_IWUSR,&s3c2410_spi_fops,NULL); 
    #endif 
 
    DPRINTK(DEVICE_NAME "initialized\n"); 
     
    return 0; 
} 
 
static void __exit s3c2410_spi_exit(void) 
{ 
    #ifdef CONFIG_DEVFS_FS 
        devfs_unregister(devfs_spi_raw); 
        devfs_unregister(devfs_spi_dir); 
    #endif 
         
        unregister_chrdev(SPI_MAJOR,DEVICE_NAME); 
} 
 
module_init(s3c2410_spi_init); 
module_exit(s3c2410_spi_exit); 
 
MODULE_LICENSE("GPL"); 
MODULE_AUTHOR("uniquepeng"); 
MODULE_DESCRIPTION("spi driver for s3c2410");