返回> 网站首页 

licheepi-nano(荔枝派) - SPI驱动CC2520 - 驱动程序

yoours2024-11-01 20:30:39 阅读 375

简介一边听听音乐,一边写写文章。

一、简介

    依据上一篇设备树编写基于spi的cc2520驱动。


二、probe驱动入口

    不需要初始化spi本身的驱动,进入该入口后已经自动初始化完成spi。

    1. 构建设备号 - 略

    2. 注册设备 - 略

    3. 创建类 - 略

    4. 创建设备 - 略

    6. 初始化GPIO

        a) gpio输出 - 示例

cc2520dev.ant_paen = devm_gpiod_get(&spi->dev,"ant_paen",GPIOD_OUT_LOW);

if(IS_ERR(cc2520dev.ant_paen)) 

{

printk(KERN_ERR"Get ant_paen resource failed!\n");

return -1; 

}

        设置的逻辑电平并不一定等于物理电平,因为有active_low属性。那么设置gpiod_set_value(cc2520dev.ant_paen, 1)为1就是低电平,设置为0才是高电平。

    7. 初始化寄存器 - 略

    8. 初始化GPIO中断

        a) 初始化

        // CC2520_EXC_RX_FRM_DONE - GPIO中断

cc2520dev.cc2520_RxInterrupt = devm_gpiod_get(&spi->dev,"cc2520_RxInterrupt",GPIOD_IN);

if(IS_ERR(cc2520dev.cc2520_RxInterrupt)) 

{

ret = PTR_ERR(cc2520dev.cc2520_RxInterrupt);

printk(KERN_ERR"Get cc2520_RxInterrupt resource failed!\n");

return ret; 

}


        // 采用高频中断响应,异步处理两个中断函数

ret = devm_request_threaded_irq(&spi->dev, gpiod_to_irq(cc2520dev.cc2520_RxInterrupt), fast_irq_hander, cc2520_irq_hander, IRQF_TRIGGER_RISING, "cc2520_irq_hander", NULL);

if(ret)

{

printk(KERN_ERR"cc2520_RxInterruptInit faild\n");

return ret;

}

        b) 中断函数

        // 发生中断后会先执行fast_irq_hander,再执行cc2520_irq_hander

        // 快速中断响应,只写简单的处理快速退出本函数

        irqreturn_t fast_irq_hander(int irq, void *dev_id)

        {

            // 表示中断服务函数已处理该中断,并且请求唤醒一个内核线程来继续执行进一步的处理

    return IRQ_WAKE_THREAD;

        }


        // 需要较长时间处理的内容写这里

        irqreturn_t cc2520_irq_hander(int irq, void *dev_id)

        {

    Mrfi_FiFoPIsr();

    return IRQ_HANDLED;

        }


三、释放卸载 - 略

四、示例

    1. CC2520寄存器初始化

        读取芯片ID为0x84表示spi工作正常

    

2. 中断响应

    








    

微信小程序扫码登陆

文章评论

375人参与,0条评论