08 2013 档案
摘要:00000076 static void input_pass_event(struct input_dev *dev,00000077 unsigned int type, unsigned int code, int value)00000078 {00000079 struct input_handler *handler;00000080 struct input_handle *handle;00000081 00000082 rcu_read_lock();00000083 00000084 handle = rcu...
阅读全文
摘要:00000518 /* get current state of buttons */00000519 for (i = 0; i nbuttons; i++)00000520 gpio_keys_report_event(&ddata->data[i]);00000521 input_sync(input);00000522 00000523 device_init_wakeup(&pdev->dev, wakeup);00000524 00000525 return 0;00000526 00000527 fail3:0000052...
阅读全文
摘要:分别是总线类型、厂商号、产品号和版本号。1156行,evbit,设备支持的事件类型的位图,每一位代表一种事件,比如EV_KEY、EV_REL事件等等。BITS_TO_LONGS(nr)是一个宏,假设long型变量为32位,1位可以表示一种事件,那么这个宏的意思就是nr种事件需要用多少个long型变量来表示。EV_CNT的值为0x1f+1,因此BITS_TO_LONGS(0x1f+1)的值就为1。1157行,keybit,设备拥有的按键的位图,每一位代表一个按键。1158行,relbit,设备拥有的相对轴的位图,每一位代表一个相对轴。1159行,absbit,设备拥有的绝对轴的位图,每一位代表一
阅读全文
摘要:前言 以前在移植Qt到开发板上时只知道在配置文件中需要指定触摸屏的设备文件/dev/input/event0,仅此而已。直到一年半前突然想到用红外遥控器控制Tiny6410开发板上的Android系统,从而代替物理按键。实现原理是很简单的,就是首先解码红外信号,然后根据解码出的键值模拟一个按键信号。既然要模拟按键信号,那得首先找到按键信号产生的地方,通过查看内核编译生成的文件知道drivers/input/keyboard/gpio_keys.c文件是产生按键信号的源头,这是一个通用的用IO口模拟键盘的驱动程序。别小看这样一个功能,这是开发Android机顶盒、Android盒子必须要接触..
阅读全文
摘要: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一直是处于被“忽略”的角色,市场上大部分板子在板级文件里都...
阅读全文

浙公网安备 33010602011771号