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");