i2c-at91.c
at91_twi_probe()
{
为对象开辟空间
初始化completion
获取地址资源
地址映射
获取中断资源
申请中断 atmel_twi_interrupt()
获取时钟使能时钟
计算频率
初始化各个寄存器
填充adapter结构体 at91_twi_algorithm -> at91_twi_xfer()
注册adapter对象
注册设备
}
at91_twi_xfer()
{
排除参数出错情况
msg[0]中放的是cpu内部地址
计算后写入AT91_TWI_IADR内部地址寄存器
msg[1]中放的是待传数据
根据从机地址,读写模式计算,后写入AT91_TWI_MMR主模式寄存器
调用at91_do_twi_transfer()
}
at91_do_twi_transfer()
{
初始化命令cmd_completion
如果待发送数据长度为零
{
控制寄存器AT91_TWI_CR 写入 ambus快速命令AT91_TWI_QUICK
中断使能寄存器AT91_TWI_IER 写入 传输完成AT91_TWI_TXCOMP
}否则如果是读传输
{
置位开始传送标志位
读取状态寄存器AT91_TWI_SR如果为接收保持就绪AT91_TWI_RXRDY
{
读走 接收保持寄存器的值AT91_TWI_RHR
}
如果只有一个字节要发送
{
置位停止传送标志位
}
控制寄存器AT91_TWI_CR 写入 标志位
如果用dma
{
}否则
{
中断使能AT91_TWI_IER 写入 传输完成AT91_TWI_TXCOMP | 接收保持就绪AT91_TWI_RXRDY
}
}否则(写)
{
如果用dma
{
}否则
{
写下一个字节at91_twi_write_next_byte()
中断使能寄存器AT91_TWI_IER 写入 传输完成AT91_TWI_TXCOMP | 发送保持就绪AT91_TWI_TXRDY
}
}
超时等待完成
对返回值进行判断处理
}
atmel_twi_interrupt()
{
读取 状态寄存器 AT91_TWI_SR
读取 中断掩码寄存器AT91_TWI_IMR
如果中断状态为写
写下一个字节at91_twi_write_next_byte()
否则如果中断状态为读
读下一个字节at91_twi_read_next_byte()
如果为完成中断
关闭中断并触发cmd_complete
}
i2c-dev.c i2c-core.c i2c-at91.c
register_chrdev -> i2cdev_fops -> i2cdev_write -> i2c_master_send -> i2c_transfer -> __i2c_transfer -> adap->algo->master_xfer==at91_twi_xfer
register_chrdev -> i2cdev_fops -> i2cdev_read -> i2c_master_recv -> i2c_transfer -> __i2c_transfer -> adap->algo->master_xfer==at91_twi_xfer