spi驱动

spi-s3c24xx.c


s3c24xx_spi_probe()
{
    spi_master开辟空间
    初始化completion
    初始化fiq
    填充spi_master
    填充bitbang    s3c24xx_spi_txrx()
    获取地址资源
    映射地址
    获取中断资源
    申请中断
    获取时钟
    申请片选
    初始化spi
    调用spi_bitbang_start()
}


s3c24xx_spi_txrx()
{
    初始化completion    s3c24xx_spi->done
    写一个字节 触发中断 其余字节在中断里完成
    等待completion   s3c24xx_spi->done
}


s3c24xx_spi_irq()
{
    读取spi状态寄存器 S3C2410_SPSTA
    根据状态进行操作
    读写读寄存器S3C2410_SPRDAT或写寄存器S3C2410_SPTDAT
    如果完成则触发complete s3c24xx_spi->done
}




spi-bitbang.c
spi_bitbang_start()
{
    初始化workqueue   bitbang_work()
    初始化spin_lock和队列
    进一步填充 spi_master 和 bitbang    spi_bitbang_transfer()
    创建工作队列线程
    注册spi_master
}


spi_bitbang_transfer()
{
    将新的msg->queue 插入到 bitbang->queue中去
    激活工作队列 bitbang_work()
}


bitbang_work()
{
    遍历 bitbang->queue
    {
        遍历 spi_message->transfers
        {
            调用bitbang->setup_transfer()
            调用bitbang->chipselect() 片选
            调用bitbang->txrx_bufs()
            调用bitbang->chipselect() 取消片选
            触发complete spi_message->context
        }
    }
}


spidev.c                                                                              spi.c                       spi-bitbang.c                                                                                spi-s3c24xx.c
register_chrdev -> spidev_fops -> spidev_write -> spidev_sync_write -> spidev_sync -> spi_async -> __spi_async -> master->transfer == spi_bitbang_transfer -> txrx_bufs == s3c24xx_spi_txrx

register_chrdev -> spidev_fops -> spidev_read  -> spidev_sync_read  -> spidev_sync -> spi_async -> __spi_async -> master->transfer == spi_bitbang_transfer -> txrx_bufs == s3c24xx_spi_txrx



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值