返回> 网站首页
licheepi-nano(荔枝派) - SPI驱动CC2520 - 驱动程序
yoours2024-11-01 20:30:39
简介一边听听音乐,一边写写文章。
一、简介
依据上一篇设备树编写基于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. 中断响应