天嵌 ARM开发社区

 找回密码
 注册
查看: 1541|回复: 2

2440 linux2.6.30.4 关于写nrf24l01驱动的问题

[复制链接]
happain 发表于 2014-3-28 15:07:46 | 显示全部楼层 |阅读模式
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&#188;&#196;′&#230;&#198;÷&#214;&#184;á&#238;===================================
#define READ_REG        0x00          // &#182;á&#188;&#196;′&#230;&#198;÷&#214;&#184;á&#238;
#define WRITE_REG       0x20         // D′&#188;&#196;′&#230;&#198;÷&#214;&#184;á&#238;
#define RD_RX_PLOAD     0x61          // &#182;áè&#161;&#189;óê&#213;êy&#190;Y&#214;&#184;á&#238;
#define WR_TX_PLOAD     0xA0          // D′′y·¢êy&#190;Y&#214;&#184;á&#238;
#define FLUSH_TX        0xE1         // 3&#229;&#207;′·¢&#203;í FIFO&#214;&#184;á&#238;
#define FLUSH_RX        0xE2          // 3&#229;&#207;′&#189;óê&#213; FIFO&#214;&#184;á&#238;
#define REUSE_TX_PL     0xE3          // &#182;¨ò&#229;&#214;&#216;&#184;′×°&#212;&#216;êy&#190;Y&#214;&#184;á&#238;
#define NOP1            0xFF          // ±£á&#244;
//========================SPI(nRF24L01)&#188;&#196;′&#230;&#198;÷μ&#216;&#214;·===============================
#define CONFIG          0x00  // &#197;&#228;&#214;&#195;ê&#213;·¢×′ì&#172;£&#172;CRCD£&#209;é&#196;£ê&#189;ò&#212;&#188;°ê&#213;·¢×′ì&#172;&#207;ìó|·&#189;ê&#189;
#define EN_AA           0x01  // ×&#212;&#182;ˉó|′e1|&#196;üéè&#214;&#195;
#define EN_RXADDR       0x02  // &#191;éó&#195;D&#197;μàéè&#214;&#195;
#define SETUP_AW        0x03  // ê&#213;·¢μ&#216;&#214;·&#191;í&#182;èéè&#214;&#195;
#define SETUP_RETR      0x04  // ×&#212;&#182;ˉ&#214;&#216;·¢1|&#196;üéè&#214;&#195;
#define RF_CH           0x05  // 1¤×÷&#198;μ&#194;êéè&#214;&#195;
#define RF_SETUP        0x06  // ·¢é&#228;&#203;ù&#194;ê&#161;¢1|o&#196;1|&#196;üéè&#214;&#195;
#define STATUS          0x07  // ×′ì&#172;&#188;&#196;′&#230;&#198;÷
#define OBSERVE_TX      0x08  // ·¢&#203;í&#188;à2a1|&#196;ü
#define CD              0x09  // μ&#216;&#214;·&#188;ì2a           
#define RX_ADDR_P0      0x0A  // &#198;μμà0&#189;óê&#213;êy&#190;Yμ&#216;&#214;·
#define RX_ADDR_P1      0x0B  // &#198;μμà1&#189;óê&#213;êy&#190;Yμ&#216;&#214;·
#define RX_ADDR_P2      0x0C  // &#198;μμà2&#189;óê&#213;êy&#190;Yμ&#216;&#214;·
#define RX_ADDR_P3      0x0D  // &#198;μμà3&#189;óê&#213;êy&#190;Yμ&#216;&#214;·
#define RX_ADDR_P4      0x0E  // &#198;μμà4&#189;óê&#213;êy&#190;Yμ&#216;&#214;·
#define RX_ADDR_P5      0x0F  // &#198;μμà5&#189;óê&#213;êy&#190;Yμ&#216;&#214;·
#define TX_ADDR         0x10  // ·¢&#203;íμ&#216;&#214;·&#188;&#196;′&#230;&#198;÷
#define RX_PW_P0        0x11  // &#189;óê&#213;&#198;μμà0&#189;óê&#213;êy&#190;Y3¤&#182;è
#define RX_PW_P1        0x12  // &#189;óê&#213;&#198;μμà0&#189;óê&#213;êy&#190;Y3¤&#182;è
#define RX_PW_P2        0x13  // &#189;óê&#213;&#198;μμà0&#189;óê&#213;êy&#190;Y3¤&#182;è
#define RX_PW_P3        0x14  // &#189;óê&#213;&#198;μμà0&#189;óê&#213;êy&#190;Y3¤&#182;è
#define RX_PW_P4        0x15  // &#189;óê&#213;&#198;μμà0&#189;óê&#213;êy&#190;Y3¤&#182;è
#define RX_PW_P5        0x16  // &#189;óê&#213;&#198;μμà0&#189;óê&#213;êy&#190;Y3¤&#182;è
#define FIFO_STATUS     0x17  // FIFO&#213;&#187;è&#235;&#213;&#187;3&#246;×′ì&#172;&#188;&#196;′&#230;&#198;÷éè&#214;&#195;
#define RX_DR                        0x40  // &#189;óê&#213;êy&#190;Y&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;
#define TX_DS                        0x20  // êy&#190;Y·¢&#203;ííê3é&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;
#define MAX_RT                        0x10  // ′&#239;μ&#189;×&#238;&#182;à′&#206;&#214;&#216;·¢&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;,è&#231;1&#251;MAX_RT&#214;D&#182;&#207;2úéú&#212;ò±&#216;D&#235;&#199;&#229;3yoó&#207;μí32&#197;&#196;ü&#189;&#248;DDí¨&#209;&#182;

unsigned char  TX_ADDRESS[6]= {0x26,0x1,0x2,0x3,0x4,0x5};        //±&#190;μ&#216;μ&#216;&#214;·
unsigned char  RX_ADDRESS[RX_ADR_WIDTH]= {0x1,0x43,0x10,0x10,0x01};        //&#189;óê&#213;μ&#216;&#214;·

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 ,&reg, 1);           
        spi_write(spi ,TX_ADDRESS, 6);           

        reg=TX_ADDR;
        status = spi_write_then_read(spi, &reg, 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&#182;&#212;&#216;

        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进行读写的时候有问题,目前没有示波器,不知道是写问题还是读问题,反正就是数据不对,请教大神,是不是我驱动哪里没有理解到位
 楼主| happain 发表于 2014-3-28 15:09:42 | 显示全部楼层
硬件没有任何问题,并且裸机下是能够完美驱动的,如今想做一个内核的驱动,想利用spi主控制器,但是问题就出现了,希望大神给指点一下
 楼主| happain 发表于 2014-3-28 15:11:32 | 显示全部楼层
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,
    },
};
static void __init smdk2440_machine_init(void)
{
        s3c24xx_fb_set_platdata(&smdk2440_fb_info);
        s3c_i2c0_set_platdata(NULL);
        s3c_device_spi0.dev.platform_data = &s3c2410_spi0_platdata;
        //spi_register_board_info(s3c2410_spi0_board,ARRAY_SIZE(s3c2410_spi0_board));
        spi_register_board_info(nrf24l01_info_board, ARRAY_SIZE(nrf24l01_info_board));
        platform_add_devices(smdk2440_devices, ARRAY_SIZE(smdk2440_devices));
        smdk_machine_init();
}
不知道这样定义是否正确,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-5-24 02:06 , Processed in 1.078125 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表