|
mach-smdk2440.c
static struct s3c2410_spi_info s3c2410_spi0_platdata={
.pin_cs = S3C2410_GPG2,
.num_cs = 1,
.bus_num = 0,
};
static struct spi_board_info nrf24l01_info_board[]={
[0] = {
.modalias ="nrf24l01",
.bus_num = 0,
.chip_select = 0,
.max_speed_hz = 1000 * 1000,
},
};
驱动文件
#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/kernel.h>
#include <linux/device.h>
#include <linux/err.h>
#include <linux/sysfs.h>
#include <linux/hwmon.h>
#include <linux/mutex.h>
#include <linux/spi/spi.h>
#include <mach/spi.h>
#include <linux/module.h>
#include <linux/delay.h>
#include <asm/uaccess.h>
#include <linux/irq.h>
#include <asm/io.h>
#include <mach/regs-gpio.h>
#include <mach/hardware.h>
/*----------------------------------------------------------------------*/
static struct class *nrf24l01_class;
int major;
#define Busy 0x80
//==========================NRF24L01============================================
#define TX_ADR_WIDTH 5 // 5 uints TX address width
#define RX_ADR_WIDTH 5 // 5 uints RX address width
#define TX_PLOAD_WIDTH 32 // 32 TX payload
#define RX_PLOAD_WIDTH 32 // 32 uints TX payload
//=========================NRF24L01¼Ä′æÆ÷Ö¸áî===================================
#define READ_REG 0x00 // ¶á¼Ä′æÆ÷Ö¸áî
#define WRITE_REG 0x20 // D′¼Ä′æÆ÷Ö¸áî
#define RD_RX_PLOAD 0x61 // ¶á衽óêÕêy¾YÖ¸áî
#define WR_TX_PLOAD 0xA0 // D′′y·¢êy¾YÖ¸áî
#define FLUSH_TX 0xE1 // 3åÏ′·¢Ëí FIFOÖ¸áî
#define FLUSH_RX 0xE2 // 3åÏ′½óêÕ FIFOÖ¸áî
#define REUSE_TX_PL 0xE3 // ¶¨òåÖظ′×°ÔØêy¾YÖ¸áî
#define NOP1 0xFF // 񜠓
//========================SPI(nRF24L01)¼Ä′æÆ÷μØÖ·===============================
#define CONFIG 0x00 // ÅäÖÃêÕ·¢×′쬣¬CRCD£ÑéÄ£ê½òÔ¼°êÕ·¢×′ì¬Ïìó|·½ê½
#define EN_AA 0x01 // ×Ô¶ˉó|′e1|ÄüéèÖÃ
#define EN_RXADDR 0x02 // ¿éóÃDÅμàéèÖÃ
#define SETUP_AW 0x03 // êÕ·¢μØÖ·¿í¶èéèÖÃ
#define SETUP_RETR 0x04 // ×Ô¶ˉÖØ·¢1|ÄüéèÖÃ
#define RF_CH 0x05 // 1¤×÷ÆμÂêéèÖÃ
#define RF_SETUP 0x06 // ·¢éäËùÂê¡¢1|oÄ1|ÄüéèÖÃ
#define STATUS 0x07 // ×′쬼Ä′æÆ÷
#define OBSERVE_TX 0x08 // ·¢Ëí¼à2a1|Äü
#define CD 0x09 // μØÖ·¼ì2a
#define RX_ADDR_P0 0x0A // Æμμà0½óêÕêy¾YμØÖ·
#define RX_ADDR_P1 0x0B // Æμμà1½óêÕêy¾YμØÖ·
#define RX_ADDR_P2 0x0C // Æμμà2½óêÕêy¾YμØÖ·
#define RX_ADDR_P3 0x0D // Æμμà3½óêÕêy¾YμØÖ·
#define RX_ADDR_P4 0x0E // Æμμà4½óêÕêy¾YμØÖ·
#define RX_ADDR_P5 0x0F // Æμμà5½óêÕêy¾YμØÖ·
#define TX_ADDR 0x10 // ·¢ËíμØÖ·¼Ä′æÆ÷
#define RX_PW_P0 0x11 // ½óêÕÆμμà0½óêÕêy¾Y3¤¶è
#define RX_PW_P1 0x12 // ½óêÕÆμμà0½óêÕêy¾Y3¤¶è
#define RX_PW_P2 0x13 // ½óêÕÆμμà0½óêÕêy¾Y3¤¶è
#define RX_PW_P3 0x14 // ½óêÕÆμμà0½óêÕêy¾Y3¤¶è
#define RX_PW_P4 0x15 // ½óêÕÆμμà0½óêÕêy¾Y3¤¶è
#define RX_PW_P5 0x16 // ½óêÕÆμμà0½óêÕêy¾Y3¤¶è
#define FIFO_STATUS 0x17 // FIFOÕ»èëÕ»3ö×′쬼Ä′æÆ÷éèÖÃ
#define RX_DR 0x40 // ½óêÕêy¾YÖD¶Ï±ê־λ
#define TX_DS 0x20 // êy¾Y·¢Ëííê3éÖD¶Ï±ê־λ
#define MAX_RT 0x10 // ′ïμ½×î¶à′ÎÖØ·¢ÖD¶Ï±ê־λ,èç1ûMAX_RTÖD¶Ï2úéúÔò±ØDëÇå3yoóÏμí32ÅÄü½øDDí¨Ñ¶
unsigned char TX_ADDRESS[6]= {0x26,0x1,0x2,0x3,0x4,0x5}; //±¾μØμØÖ·
unsigned char RX_ADDRESS[RX_ADR_WIDTH]= {0x1,0x43,0x10,0x10,0x01}; //½óêÕμØÖ·
unsigned char buf[6];
static int nrf24l01_open(struct inode *inode, struct file *file)
{
printk("nrf24l01_open\n");
return 0;
}
static ssize_t nrf24l01_write(struct file *file, const char __user *buf, size_t count, loff_t * ppos)
{
printk("nrf24l01_write\n");
return 0;
}
static ssize_t nrf24l01_read( struct file *file, char __user *buffer, size_t len, loff_t *offset )
{
printk("nrf24l01_read\n");
return 0;
}
static struct file_operations nrf24l01_fops = {
.owner = THIS_MODULE,
.open = nrf24l01_open,
.write = nrf24l01_write,
.read = nrf24l01_read,
};
static int nrf24l01_probe(struct spi_device *spi)
{
unsigned char reg;
unsigned char value;
unsigned char rxbuf[5];
unsigned char i;
int status;
printk("nrf24l01_probe\n");
spi->mode = SPI_MODE_0;
spi->bits_per_word = 8;
spi_setup(spi);
s3c2410_gpio_cfgpin(S3C2410_GPB1, S3C2410_GPB1_OUTP);
s3c2410_gpio_setpin(S3C2410_GPB1, 0);
//reg=WRITE_REG + TX_ADDR;
//spi_write(spi ,®, 1);
spi_write(spi ,TX_ADDRESS, 6);
reg=TX_ADDR;
status = spi_write_then_read(spi, ®, 1, rxbuf, 5);
printk("status = %d\n",status);
for(i=0; i<5; i++)
printk("buf[%d]=%x\n",i,rxbuf[i]);
reg=STATUS;
value = spi_w8r8(spi, reg);
printk("status=%x\n",value);
reg=STATUS;
value = spi_w8r8(spi, reg);
printk("status=%x\n",value);
major = register_chrdev(0, "nrf24l01", &nrf24l01_fops);
nrf24l01_class = class_create(THIS_MODULE, "nrf24l01");
device_create(nrf24l01_class, NULL, MKDEV(major, 0), NULL, "nrf24l01");
return 0;
}
static int nrf24l01_remove(struct spi_device *spi)
{
printk("nrf24l01_remove\n");
unregister_chrdev(major, "nrf24l01"); // D¶ÔØ
device_destroy(nrf24l01_class, MKDEV(major, 0));
class_destroy(nrf24l01_class);
return 0;
}
static struct spi_driver nrf24l01_driver = {
.driver = {
.name = "nrf24l01",
.owner = THIS_MODULE,
},
.probe = nrf24l01_probe,
.remove = __devexit_p(nrf24l01_remove),
};
static int __init init_nrf24l01(void)
{
int ret = spi_register_driver(&nrf24l01_driver);
printk("init_nrf24l01 ret = %d\n",ret);
return ret;
}
static void __exit cleanup_nrf24l01(void)
{
spi_unregister_driver(&nrf24l01_driver);
}
module_init(init_nrf24l01);
module_exit(cleanup_nrf24l01);
MODULE_AUTHOR("happain");
MODULE_DESCRIPTION("NS NRF24L01 Linux driver");
MODULE_LICENSE("GPL");
驱动能够进入probe函数,但是对sou进行读写的时候有问题,目前没有示波器,不知道是写问题还是读问题,反正就是数据不对,请教大神,是不是我驱动哪里没有理解到位 |
|