📄 spidriver.c
字号:
#ifndef __KERNEL__ #define __KERNEL__#endif#ifndef MODULE #define MODULE#endif#include <linux/config.h>#include <linux/module.h>#include <linux/version.h>#include <linux/iobuf.h>#include <linux/major.h>#include <linux/kernel.h> /* printk() *///#include <linux/malloc.h> /* kmalloc() */#include <linux/slab.h> /* kmalloc() */#include <linux/fs.h> /* everything... */#include <linux/errno.h> /* error codes */#include <linux/proc_fs.h>#include <linux/fcntl.h> /* O_ACCMODE */#include <linux/capability.h>#include <linux/smp_lock.h>#include <linux/mm.h>#include <linux/sched.h>#include <linux/pm.h>#include <asm/system.h> /* cli(), *_flags */#include <linux/init.h>#include <asm/uaccess.h>#include <linux/delay.h>#include <asm/io.h>#include <linux/vmalloc.h>#include <linux/miscdevice.h>#include <linux/poll.h>#include <linux/spinlock.h>#include <linux/ioport.h>#include <asm-arm/arch-s3c2410/smdk.h>#include </opt/kernel_rootfs/2.4.18-rmk7/include/asm-arm/arch-s3c2410/irqs.h>#include </opt/kernel_rootfs/2.4.18-rmk7/include/asm-arm/arch-s3c2410/S3C2410.h>#include </opt/kernel_rootfs/2.4.18-rmk7/include/asm-arm/arch-s3c2410/hardware.h>//#define EXT_LOWLEVEL 0//#define mdelay(x) udelay((x) *1000)#define interrupt_IO IRQ_EINT3 //define interrupt 3#define DEVICE_MAJOR 250#define DEVICE_NAME "SPI" /* name for messaging */#define UART0 0x1#define UART1 0x2#define UART2 0x3#define UART3 0x4static unsigned int com_number;static unsigned char read_flags,write_flags;/****************************************************************Define SPI0 Interface configuration**GPG2=nSS0,GPE11=SPIMISO0,GPE12=SPIMOSI0,GPE13=SPICLK0,**GPF3=EINT3,**************************************************************/unsigned long SPI_GPGCON;//GPE defineunsigned long SPI_GPGDAT;unsigned long SPI_GPGUP;unsigned long SPI_SPCON0; //SPI defineunsigned long SPI_SPSTAT0;unsigned long SPI_SPPIN0;unsigned long SPI_SPPRE0;unsigned long SPI_SPTDAT0;unsigned long SPI_SPRDAT0;#define spi_gpgcon (*(volatile unsigned long *)SPI_GPGCON)#define spi_gpgdat (*(volatile unsigned long *)SPI_GPGDAT)#define spi_gpgup (*(volatile unsigned long *)SPI_GPGUP)#define spi_con0 (*(volatile unsigned long *)SPI_SPCON0)#define spi_sta0 (*(volatile unsigned long *)SPI_SPSTAT0)#define spi_pin0 (*(volatile unsigned long *)SPI_SPPIN0)#define spi_pre0 (*(volatile unsigned long *)SPI_SPPRE0)#define spi_tdat0 (*(volatile unsigned long *)SPI_SPTDAT0)#define spi_rdat0 (*(volatile unsigned long *)SPI_SPRDAT0)/******************************************************************************************************** function announce********************************************************************************************************/static int __init spi_init(void);/*********************************************************** Name: 814XAppProgram.c Descibe: Function package of GM814x's operation Version: 1.0 Time: 2006.1 Contents: Include all operation and function of GM814x Copyright: GMIC 2006***********************************************************/unsigned char Flag1_T; //814x 串口1发送FIFO空标志unsigned char Flag2_T; //814x 串口2发送FIFO空标志unsigned char Flag3_T; //814x 串口3发送FIFO空标志unsigned char Flag4_T; //814x 串口4发送FIFO空标志unsigned char Revbuff1; //串口1数据缓存unsigned char Revbuff2; //串口2数据缓存unsigned char Revbuff3; //串口3数据缓存unsigned char Revbuff4; //串口4数据缓存void ClrCS(void) //置814X片选有效{ //setting nss=0 spi_gpgcon &=0xffffffcf; //GPGCON-2=11 spi_gpgcon |=0x30; spi_gpgup &=0xfffb; //GPGUP-2=0 spi_gpgdat &=~0xffff;//|=0x4; udelay(20); //delay}void SetCS(void) //置814X片选无效{ //setting nss=1 spi_gpgcon &=0xffffffcf; //GPGCON-2=1 spi_gpgcon |=0x30; spi_gpgup &=0xfffb; //GPGUP-2=0 spi_gpgdat &=0x1;//0xfffb; udelay(20); //delay}/*********************************************************** Function: Delay Describe: Time delay Input: int formated time Output: void***********************************************************/void Delay(unsigned int nTime){ while(--nTime) {;}} unsigned char SPITransmit(unsigned char c) //MCU 的SPI接口发送1 Byte 数据并接收1 Byte 数据{ unsigned char temp=0; //SPI Baud Rate Prescaler Register,Baud Rate=PCLK/2/(Prescaler value +1) spi_pre0=0x18; //setting 1m baud rate spi_con0=(0<<6)|(1<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0); //interrupt mode,sck-enable,master,low active,format A,normal spi_pin0=(0<<2)|(1<<1)|(0<<0); //Multi Master error detect disable,reserved,release if((spi_sta0&0x1) == 0x1) // data TX/RX ready, { spi_tdat0=c; temp=spi_rdat0; } return temp;}unsigned int SendTo814X(unsigned char chigh,unsigned char clow) { unsigned int cTempHigh,cTempLow; unsigned int RevData; ClrCS(); //置814x片选有效 Delay(5); //延时时间参考814x数据手册的要求 cTempHigh=SPITransmit(chigh); //向814X发送高位数据 cTempLow=SPITransmit(clow); //向814X发送低位数据 Delay(5); //延时时间参考814x数据手册的要求 SetCS(); //置814x片选无效 RevData=cTempHigh<<8|cTempLow; return RevData; //返回从814x读出的数据}/*********************************************************** Function: Gm814XShutdown Describe: Shutdown the chip Input: void Output: void***********************************************************/void Gm814XShutdown(void) { SendTo814X(0xe0,0x00);}/*********************************************************** Function: Gm814XWakeup Describe: Wakeup the chip Input: void Output: void***********************************************************/void Gm814XWakeup(void) { SendTo814X(0xc0,0x00);}/*********************************************************** Function: Write814xConfig Describe: Set the configure register of 814x Input: COM number and configure data Output: 2 byte read from 814x***********************************************************/unsigned int Write814xConfig(unsigned char n,unsigned char high,unsigned char low) //n 表示设置的串口号,high表示给配置寄存器的高位字节(低三位有效),low表示给配置寄存器的低位字节{ unsigned char ch; unsigned int RevData; high=high&0x07; ch= 0xc0 | (n<< 3); high=high|ch; RevData=SendTo814X(high,low); //向指定的串口功能设置寄存器写配置
Delay(5); return RevData;}/*********************************************************** Function: Read814xConfig Describe: read out the configure register data Input: COM number Output: configure register data***********************************************************/unsigned int Read814xConfig(unsigned char n) //n表示串口号{ unsigned char ch; unsigned int RevData; ch = 0x40 | (n<< 3); RevData=SendTo814X(ch,0x00); return RevData; //读出指定串口的功能设置寄存器内容}/*********************************************************** Function: ReadTFIFOState Describe: read all transmit FIFO status Input: void Output: TFIFO state data***********************************************************/unsigned int ReadTFIFOState(void) { unsigned int RevData; RevData=SendTo814X(0x60,0x00); return RevData; //同时读出所有发送FIFO状态}/*********************************************************** Function: SendDataToCom Describe: send data to UART Com and read out the data of receive FIFO Input: COM number and data to be send Output: RFIFO data***********************************************************/unsigned int SendDataToCom(unsigned char n,unsigned char c)//,bit Pt) //n表示串口号,c为需要发送的数据,Pt为第九位数据
{ unsigned char ch; unsigned int RevData; //if(Pt) ch=0x81; //else // ch=0x80; ch=ch| (n<< 3); RevData=SendTo814X(ch,c); return RevData; //向指定串口发送数据并读出接收FIFO数据}/*********************************************************** Function: SendToAllCom Describe: send data to all UART Com and read out the data of receive FIFO Input: data to be send Output: RFIFO data***********************************************************//*unsigned int SendToAllCom(unsigned char c,bit Pt) //c为需要发送的数据,Pt为第九位数据{ unsigned char ch; unsigned int RevData; if(Pt) ch=0xa1; else ch=0xa0; RevData=SendTo814X(ch,c); return RevData; //向所有串口发送数据并读出接收FIFO数据}*//*********************************************************** Function: ReadRFIFOData Describe: read out the data of receive FIFO Input: void Output: RFIFO data***********************************************************/unsigned int ReadRFIFOData(void){ unsigned int RevData; RevData=SendTo814X(0x00,0x00); return RevData; // 读出接收FIFO数据}/*********************************************************** Function: Managerevdata Describe: Analyse the data received from 814X Input: void Output: void***********************************************************/void ManageRevData(unsigned int rdata) { unsigned int cTemp; unsigned char Flag_R=0; unsigned char Flag_T=0; cTemp =rdata; if(cTemp&0x8000) //判断R标志 {Flag_R=1;} cTemp =rdata; if(cTemp&0x4000) //判断T标志 {Flag_T = 1;} if(Flag_R) { cTemp =rdata>>12; switch(cTemp&0x03) //判断接收数据来自哪一个子串口 { case 0: Revbuff1=rdata&0xff; com_number=0; break; case 1: Revbuff2=rdata&0xff; com_number=1; break; case 2: Revbuff3=rdata&0xff; com_number=2; break; case 3: Revbuff4=rdata&0xff; com_number=3; break; default: break; } Flag_R=0; } if(Flag_T) { cTemp =rdata>>10; switch(cTemp&0x03) //判断哪一个子串口发送FIFO为空 {
case 0: Flag1_T=1; com_number=0; break; case 1: Flag2_T=1; com_number=1; break; case 2: Flag3_T=1; com_number=2; break; case 3: Flag4_T=1; com_number=3; break; default: break; } Flag_T=0; }}//define queuetypedef struct queue_node { char data; struct queue_node *next;}queue_node;typedef struct { queue_node * front; queue_node * rear; }link_queue;link_queue *read_queue;link_queue *write_queue;//---------------------functions-----------------------------------void init_queue(link_queue *q){ q->front=q->rear=NULL;}int queue_empty(link_queue *q){ return q->front==NULL && q->rear==NULL;}void en_queue(link_queue *q,char x){ queue_node *p=(queue_node *)kmalloc(sizeof(queue_node), GFP_ATOMIC); p->data=x; p->next=NULL; if (queue_empty(q)) q->front=q->rear=p; else { q->rear->next=p; q->rear=p; }}char de_queue(link_queue *q){ char x; queue_node *p=q->front; if (queue_empty(q)) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -