⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 s3c2410-spi.c

📁 用于s3c2410的spi接口驱动。初学者用一定的参考价值。
💻 C
字号:
#include<linux/config.h>
#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/init.h>
#include<asm/hardware.h>
#include<asm/delay.h>
#include<asm/uaccess.h>



//#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<uniquepeng@msn.com>");
MODULE_DESCRIPTION("spi driver for s3c2410");

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -