#include <linux/delay.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/irq.h>
#include <linux/interrupt.h>
#include <asm/uaccess.h>
#include <mach/regs-gpio.h>
#include <mach/hardware.h>
#include <linux/platform_device.h>
#include <linux/cdev.h>
#include <linux/sched.h>
#include <linux/gpio.h>
#include <asm/irq.h>
#include <mach/regs-gpio.h>
#include <mach/hardware.h>
#include <linux/mm.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/delay.h>
#include <linux/moduleparam.h>
#include <linux/slab.h>
#include <linux/errno.h>
#include <linux/ioctl.h>
#include <linux/cdev.h>
#include <linux/string.h>
#include <linux/list.h>
#include <linux/pci.h>
#include <linux/gpio.h>
#include <asm/uaccess.h>
#include <asm/atomic.h>
#include <asm/unistd.h>
#include <plat/regs-spi.h>
#include <mach/regs-clock.h>
#include "cc1100.h"
//#undef DEBUG
#define DEBUG
#ifdef DEBUG
#define DPRINTK(x...) printk(x);
#else
#define DPRINTK(x...) (void)(0)
#endif
//*****************************************************************************************
#define DEVICE_NAME "cc1100"
#define DEVICE_CNT 1
#define CC1100_SPCON0 (*(volatile unsigned long *)(base_addr + S3C2410_SPCON)) //SPI control
#define CC1100_SPSTA0 (*(volatile unsigned long *)(base_addr + S3C2410_SPSTA)) //SPI STATUS
#define CC1100_SPPIN0 (*(volatile unsigned long *)(base_addr + S3C2410_SPPIN)) //SPI ioctl
#define CC1100_SPPRE0 (*(volatile unsigned long *)(base_addr + S3C2410_SPPRE)) //ADC conversion data 0
#define CC1100_SPTDAT0 (*(volatile unsigned long *)(base_addr + S3C2410_SPTDAT)) //ADC conversion data 1
#define CC1100_SPRDAT0 (*(volatile unsigned long *)(base_addr + S3C2410_SPRDAT)) //Stylus Up/Down interrupt status
#define CC1100_SPI_READY ((CC1100_SPSTA0 & S3C2410_SPSTA_READY)== S3C2410_SPSTA_READY)
#define CSnS s3c2410_gpio_setpin(S3C2410_GPG(2), 1) //SPI_NSSInternalSoftwareConfig(SPI1,SPI_NSSInternalSoft_Set) //cs=1
#define CSnR s3c2410_gpio_setpin(S3C2410_GPG(2), 0) //SPI_NSSInternalSoftwareConfig(SPI1,SPI_NSSInternalSoft_Reset) //cs=0
#define MISO s3c2410_gpio_getpin(S3C2410_GPE(11)) //MISO BIT
#define GDO0 s3c2410_gpio_getpin(S3C2410_GPF(3)) //interrupt GPF3
#define SPI_BAUD 10000000 //10M
unsigned char paTable[] = {0xC0};// 0dbm
unsigned char paTableLen = 1;
static void __iomem *base_addr;
struct cc1100_irq_desc {
int irq;
int pin;
int pin_setting;
int number;
char *name;
};
#define MAX_BUF_LEN 1024
#define MAX_PKT_CNT 10
struct pkt{
unsigned int len;
char buffer[MAX_BUF_LEN];
};
struct cir_buf{//receive circle buffer
unsigned int rx_index;
unsigned int wr_index;
struct pkt pkt_arry[MAX_PKT_CNT];
};
struct chr_dev{
char send_flag;
char opened;
struct completion tx_cmp;//send finish
struct cir_buf rx_buf;
wait_queue_head_t rd_waitq;
struct cdev dev;
};
static struct cc1100_irq_desc cc1100_irqs = {
IRQ_EINT3 ,
S3C2410_GPF(3) ,
S3C2410_GPF3_EINT3 ,
0,
"CC1100_IRQ"
};
static unsigned long spi_pintable [] = {
S3C2410_GPE(11),//MISO
S3C2410_GPE(12),//MOSI
S3C2410_GPE(13),//CLK
S3C2410_GPG(2),//nCS
S3C2410_GPF(3),//ENINT3
};
static unsigned int spi_pincfg [] = {
S3C2410_GPE11_SPIMISO0,
S3C2410_GPE12_SPIMOSI0,
S3C2410_GPE13_SPICLK0,
S3C2410_GPIO_OUTPUT,
S3C2410_GPF3_EINT3,
};
void TI_CC_Wait(unsigned int cycles)
{
mdelay(cycles); // 15 cycles consumed by overhead // 6 cycles consumed each iteration
}
static void cc1100_config(void);
#define WAIT_MISO do{ int timer_out=0;\
while(MISO){\
if(timer_out++>5000){\
cc1100_config();\
return 0;}\
}}while(0)
static void init_spi(void)
{
int i;
for (i = 0; i < 5; i++)
{
s3c2410_gpio_cfgpin(spi_pintable[i], spi_pincfg[i]);
s3c2410_gpio_setpin(spi_pintable[i], 1);
}
(*(unsigned long *)S3C2410_CLKCON)|=S3C2410_CLKCON_SPI;
CC1100_SPPRE0=(unsigned long)50000000/(2*SPI_BAUD);
CC1100_SPCON0= (S3C2410_SPCON_ENSCK| S3C2410_SPCON_MSTR );
CC1100_SPPIN0=S3C2410_SPPIN_KEEP;
for(i=0;i<10;i++)
{
mdelay(10);
while(!CC1100_SPI_READY);
mdelay(10);
CC1100_SPTDAT0=0xff;
}
while(!CC1100_SPI_READY);
CC1100_SPTDAT0=0x00;
mdelay(10);
DPRINTK("spi init ok!\n");
}
static unsigned char TI_CC_SendData(unsigned char data)
{
unsigned char temp;
while(!CC1100_SPI_READY);
CC1100_SPTDAT0=data;
while(!CC1100_SPI_READY);//wait spi ready
temp=CC1100_SPRDAT0;
return temp;
}
/************************write one resigter*********************************/
static int TI_CC_SPIWriteReg(unsigned char addr, unsigned char value)
{
CSnR;
WAIT_MISO;
TI_CC_SendData(addr);
TI_CC_SendData(value);
CSnS;
return 0;
}
/************************read one resigter*********************************/
static unsigned char TI_CC_SPIReadReg(unsigned char addr)
{
unsigned char dat1;//, temp;
CSnR;
WAIT_MISO;
TI_CC_SendData(addr | 0x80);
dat1 = TI_CC_SendData(0x00); //TI_CC_SendData(0x00) read data?
CSnS;
return (dat1);
}
/************************Write more one resigter*********************************/
static int TI_CC_SPIWriteBurstReg(unsigned char addr, unsigned char *buffer, unsigned char count)
{
unsigned char j;//,temp;
CSnR;
WAIT_MISO;
TI_CC_SendData(addr | TI_CCxxx0_WRITE_BURST);//(temp);
for (j = 0; j < count; j++)
TI_CC_SendData(buffer[j]);
CSnS;
return 0;
}
/***********************Read more one resigter*********************************/
static int TI_CC_SPIReadBurstReg(unsigned char addr, unsigned char *buffer, unsigned char count)
{
unsigned char j;//,temp;
CSnR;
WAIT_MISO;
TI_CC_SendData(addr | TI_CCxxx0_READ_BURST);//(temp);
for (j = 0; j < count; j++){
buffer[j] = TI_CC_SendData(0x00);
}
CSnS;
return 0;
}
static int TI_CC_SPIStrobe(unsigned char strobe)
{
CSnR;
WAIT_MISO;
TI_CC_SendData(strobe);
CSnS;
return 0;
}
/*切换至接收模式*/
static void SYS_setRxMode(void)
{
TI_CC_SPIStrobe(TI_CCxxx0_SIDLE); // Initialize CCxxxx to IDLE mode.
TI_CC_SPIStrobe(TI_CCxxx0_SRX); // Initialize CCxxxx in RX mode.
//PowerSwith=0;
}
/*切换至发送模式*/
/*static void SYS_setTxMode(void)
{
TI_CC_SPIStrobe(TI_CCxxx0_SIDLE); //0
TI_CC_SPIStrobe(TI_CCxxx0_SFTX); //将会发送载波
//PowerSwitch=1; //功率放大器开关
}*/
/*读取芯片状态*/
static unsigned char TI_CC_SPIReadStatus(unsigned char addr)
{
unsigned char dat1;//,temp;
CSnR;
WAIT_MISO;
TI_CC_SendData(addr | TI_CCxxx0_READ_BURST);//(temp);
dat1 = TI_CC_SendData(0x00);
CSnS;
return dat1;
}
/*射频部分配置*/
static void writeRFSettings(void)
{
TI_CC_SPIWriteReg(TI_CCxxx0_IOCFG2, 0x06); // GDO2 output pin config.
TI_CC_SPIWriteReg(TI_CCxxx0_IOCFG0, 0x06); // GDO0 output pin config.
printk("cc1100 io config reg:0x%x\n",TI_CC_SPIReadReg(TI_CCxxx0_IOCFG2));//测试SPI接口工作状态
TI_CC_SPIWriteReg(TI_CCxxx0_PKTLEN, 0xFF); // Packet length.
TI_CC_SPIWriteReg(TI_CCxxx0_PKTCTRL1, 0x00); //?????,0x00??? 07
TI_CC_SPIWriteReg(TI_CCxxx0_PKTCTRL0, 0x05); // Packet automation control. 05
TI_CC_SPIWriteReg(TI_CCxxx0_ADDR, 0x02); // Device address.
TI_CC_SPIWriteReg(TI_CCxxx0_CHANNR, 0x00); //* Channel number.*** *
TI_CC_SPIWriteReg(TI_CCxxx0_FSCTRL1, 0x08); // *Freq synthesizer control.*
TI_CC_SPIWriteReg(TI_CCxxx0_FSCTRL0, 0x00); // *Freq synthesizer control. *
// TI_CC_SPIWriteReg(TI_CCxxx0_FREQ2, 0x0C); //* Freq control word, high byte//315M
// TI_CC_SPIWriteReg(TI_CCxxx0_FREQ1, 0x1D); // *Freq control word, mid byte.
// TI_CC_SPIWriteReg(TI_CCxxx0_FREQ0, 0x
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
CC1100linux驱动.zip (2个子文件)
CC1100linux驱动
cc1100.h 6KB
cc1100.c 18KB
共 2 条
- 1
资源评论
- weiyihe2013-04-20原汁原味的linux代码
- 之由2013-03-19非常好的代码,感谢分享
- langtaosha12382012-12-02还么测试,但看看就觉得受益很多,很好的资源。
- inserlan2013-12-06很有用的代码,受益了
- 冰岛牛2014-08-19很有用的代码,受益了
licl2008
- 粉丝: 8
- 资源: 22
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功