最近太多的网友发邮件给我要nrf24l01的驱动程序 现在贴出来供需要的人参考
/*******************************************************************************
* 此驱动程序是linux下nrf24l01的设备驱动程序,驱动程序由两部分组成:
* 1、nrf24l01.c
* 2、nrf24l01.h ,linux版本是2.6.24,ARM平台为博创“三剑客”up—Star2410
* Author:dengtao_deng
* Email:linuxembe@126.com
* QQ:990027753 Embed
* nrf24l01.c
*******************************************************************************/
#include <linux/irq.h>
#include <linux/miscdevice.h>
#include <linux/delay.h>
#include <linux/interrupt.h>
#include <linux/major.h>
#include <asm/irq.h>
#include <linux/interrupt.h>
#include <linux/kernel.h>//printk()
#include <linux/module.h>
#include <linux/init.h>
#include <linux/mm.h>
#include <linux/fs.h>
#include <linux/types.h>//u8,u16,u3……
#include <linux/delay.h>
#include <linux/moduleparam.h>
#include <linux/slab.h>
#include <linux/sched.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 <asm/uaccess.h>//copy_to_user(),copy_from_user()
#include <asm/atomic.h>
#include <asm/unistd.h>
#include <linux/spinlock.h>
#include <asm/system.h>
#include <asm/io.h> //readx(), writex()
#include <linux/ioport.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/miscdevice.h>
#include <linux/delay.h>
#include <asm/irq.h>
#include <asm/arch/regs-gpio.h>
#include <asm/hardware.h>
#include "nrf24l01.h"
#define RX_DR SPI_Read(STATUS)&1
uchar TX_ADDRESS[]={0x34,0x43,0x10,0x10,0x01};//这个应该是要发送到的地址,不确定
uchar RX_ADDRESS[]={0x34,0x43,0x10,0x10,0x01};//接收地址
/********************************************************************************************************/
#define NRF_NAME "S3C2440_NRF" //设备驱动名称
static int NRF_MAJOR = 258; //主设备号
struct nrf_dev
{
struct cdev cdev;
char dataTx[TX_PLOAD_WIDTH];
char dataRx[RX_PLOAD_WIDTH];
};
struct nrf_dev *nrf_devp;
/********************************************************************************************************/
//底层驱动函数
ulong status_32; //暂存状态32位
//初始化各种IO口的输入、输出设置
void GPIO_CONFIG_PINS(void){
s3c2410_gpio_cfgpin(S3C2410_GPB0,S3C2410_GPIO_OUTPUT); //CSN --TOUT0
s3c2410_gpio_cfgpin(S3C2410_GPB1,S3C2410_GPIO_OUTPUT); //MOSI--TOUT1
s3c2410_gpio_cfgpin(S3C2410_GPB4,S3C2410_GPIO_OUTPUT); //SCK---TCLK0
s3c2410_gpio_cfgpin(S3C2410_GPG11,S3C2410_GPIO_OUTPUT);//CE----TCLK1
s3c2410_gpio_cfgpin(S3C2410_GPH9,S3C2410_GPIO_INPUT); //IRQ---CLKOUT0
s3c2410_gpio_cfgpin(S3C2410_GPE7,S3C2410_GPIO_INPUT); //MISO--SDDATA0
}
//延时函数
void delay(int n)
{
int m,k;
for(m=0;m<10;m++)
for(k=0;k<n;k++){}
}
// 写一个字节到24L01,同时读出一个字节
uchar SPI_RW(uchar byte)
{
uchar bit_ctr;
for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
{
if(byte & 0x80)
s3c2410_gpio_setpin(S3C2410_GPB1,1); //MOSI
else
s3c2410_gpio_setpin(S3C2410_GPB1,0); //MOSI
byte = (byte << 1); // shift next bit into MSB..
s3c2410_gpio_setpin(S3C2410_GPB4,1);//SCK
if(s3c2410_gpio_getpin(S3C2410_GPE7))
{ //MISO
byte |= 1<<0;
}else
{
byte |= 0<<0;
}
s3c2410_gpio_setpin(S3C2410_GPB4,0); //SCK
}
return(byte); // return read byte
}
/******************************************************************************
* 读取寄存器值的函数:基本思路就是通过READ_REG 命令(也就是0x00+寄存器地址),把
* 寄存器中的值