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

📄 spidriver.c

📁 国腾8142扩展芯片在S3C2410上的SPI驱动程序,数据接收与发送.
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -