摘要:
558行,又重试2次。560行,调用s3c24xx_i2c_doxfer函数:00000482 static int s3c24xx_i2c_doxfer(struct s3c24xx_i2c *i2c,00000483 struct i2c_msg *msgs, int num)00000484 {00000485 unsigned long iicstat, timeout;00000486 int spins = 20;00000487 int ret;00000488 00000489 if (i2c->suspend... 阅读全文
摘要:
下面以eeprom用户程序调用ioctl函数的写操作为例追踪IIC子系统的调用过程。eeprom的用户测试是大部分开发板都自带的。看写一个字节数据的eeprom_write_byte函数的定义:int eeprom_write_byte(struct eeprom *e, __u16 mem_addr, __u8 data){ if(e->type == EEPROM_TYPE_8BIT_ADDR) { __u8 buf[2] = { mem_addr & 0x00ff, data }; return i2c_write_2b(e, buf); } el... 阅读全文
摘要:
953行,适配器的编号大于MAX_ID_MASK是不行的,MAX_ID_MASK是一个宏,展开后的值为61。957至968行,关于管理小整形ID数的,没怎么了解,略过。974行,调用i2c_register_adapter函数注册IIC适配器,下面是它的定义:00000837 static int i2c_register_adapter(struct i2c_adapter *adap)00000838 {00000839 int res = 0;00000840 00000841 /* Can't register until after driver model init... 阅读全文
摘要:
写在前面 由于IIC总线只需要两根线就可以完成读写操作,而且通信协议简单,一条总线上可以挂载多个设备,因此被广泛使用。但是IIC总线有一个缺点,就是传输速率比较低。本文基于Linux-2.6.36版本,说说IIC子系统在Linux中的实现。 借用某书上的IIC子系统的体系结构图: Linux IIC子系统体系结构 下面开始分析IIC子系统。 IIC子系统的初始化在drivers/i2c/i2c-core.c文件中的i2c_init函数中:00001221 static int __init i2c_init(void)00001222 {00001223... 阅读全文
摘要:
781行之前没什么好说的,直接看783行,将work投入到工作队列里,然后就返回,在这里就可以回答之前为什么是异步的问题。以后在某个合适的时间里CPU会执行这个work指定的函数,这里是s3c64xx_spi_work函数,看它的定义:00000723 static void s3c64xx_spi_work(struct work_struct *work)00000724 {00000725 struct s3c64xx_spi_driver_data *sdd = container_of(work,00000726 struct s3c6... 阅读全文
摘要:
572至574行,分配内存,注意对象的类型是struct spidev_data,看下它在drivers/spi/spidev.c中的定义:00000075 struct spidev_data {00000076 dev_t devt;00000077 spinlock_t spi_lock;00000078 struct spi_device *spi;00000079 struct list_head device_entry;00000080 00000081 /* buffer is NULL u... 阅读全文
摘要:
957至962行,一个SPI控制器用一个master来描述。这里使用SPI核心的spi_alloc_master函数请求分配master。它在drivers/spi/spi.c文件中定义:00000471 struct spi_master *spi_alloc_master(struct device *dev, unsigned size)00000472 {00000473 struct spi_master *master;00000474 00000475 if (!dev)00000476 return NULL;00000477 000004... 阅读全文
摘要:
写在前面 初次接触SPI是因为几年前玩单片机的时候,由于普通的51单片机没有SPI控制器,所以只好用IO口去模拟。最近一次接触SPI是大三时参加的校内选拔赛,当时需要用2440去控制nrf24L01,从而实现数据的无线传输。nrf24L01是一种典型的SPI接口的2.4GHz无线收发器,当时搞了很久,由于时间比较紧,而且当时根本不熟悉Linux的SPI子系统,最后虽然采用IO口模拟SPI的方式勉强实现了,但是这根本就不符合Linux驱动的编程规范,或者说是在破坏Linux、污染kernel。 根据我个人所知道的,Linux SPI一直是处于被“忽略”的角色,市场上大部分板子在板级文件里都... 阅读全文