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
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