微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 关注自由和开源软件

关注自由和开源软件

时间:03-15 来源: 点击:

到不同的SPI从选择,或者映射到不同的物理存储器地址。所有实例共用同样的代码,以便节省存储器,但具有各自的数据段。

Linux是一种先占式多任务、多用户操作系统,因此几乎所有设备驱动程序和内核子系统都允许多个进程(可能由不同的用户所有)同时利用设备。常见的例子有network(网络)、audio(音频)或input(输入)接口。QWERTY键盘控制器ADP5588的键按下或释放事件会被加上时间戳、排队并发送至所有已打开input vent device(输入事件设备)的进程。这些事件代码在所有架构上都相同,并且与硬件无关。读USB键盘与从用户空间读取ADP5588并无区别。事件类型通过代码加以区分。键盘发送键事件(EV_KEY)、键识别码以及代表按下或释放动作的某种状态值。触摸屏发送绝对坐标事件(EV_ABS)以及由x、y和触摸压力组成的一个三元组,鼠标则发送相对运动事件(EV_REL)。加速度计ADXL346在发送关于加速度的绝对坐标事件的同时,可以发送关于单振或双振的键事件。

某些应用中,加速度计ADXL346产生相对事件或者发送特定键代码(特定应用设置),也很有意义。一般而言,定制驱动程序有两种方式:运行时或编译时。

可能在运行时进行定制的设备特性使用模块参数和或/sys条目。

实现特定目标

使用开源Linux驱动程序-通过定制实现特定目标,对于编译时配置,将特定板和特定应用配置排除在主驱动程序文件之外是Linux的惯例,一般将其放入board support ?le(板支持文件)中。

对于定制板上的设备(这是嵌入式和基于SoC片上系统硬件的典型现象),Linux使用platform_data指向描述设备及其如何连到SoC的特定板结构。这可以包括可用端口、不同芯片版本、首选模式、默认初始化、引脚的其他作用等。这将能缩小板支持包(BSP),并尽量减少驱动程序中板和应用特定的#ifdef。至于哪些可调变量进入platform_data,哪些应当在运行时具有访问权,则由驱动程序的作者决定。

数字加速度计特性与应用具有非常密切的关系,不同的板和型号可能具有不同的特性。下例显示了一组配置选项。这些变量在头文件adxl34x.h(include/linux/input/adxl34x.h)中有详细描述。

Analog Dialogue 44-03, March (2010)

#include <linux/input/adxl34x.h>

static const struct adxl34x_platform_data

adxl34x_info={

.x_axis_offset=0,

.y_axis_offset=0,

.z_axis_offset=0,

.tap_threshold=0x31,

.tap_duration=0x10,

.tap_latency=0x60,

.tap_window=0xF0,

.tap_axis_control=ADXL_TAP_X_EN | ADXL_TAP_

Y_EN | ADXL_TAP_Z_EN,

.act_axis_control=0xFF,

.activity_threshold=5,

.inactivity_threshold=3,

.inactivity_time=4,

.free_fall_threshold=0x7,

.free_fall_time=0x20,

.data_rate=0x8,

.data_range=ADXL_FULL_RES,

.ev_type=EV_ABS,

.ev_code_x=ABS_X,/*EV_REL*/

.ev_code_y=ABS_Y,/*EV_REL*/

.ev_code_z=ABS_Z,/*EV_REL*/

.ev_code_tap={BTN_TOUCH,BTN_TOUCH,BTN_TOUCH},/*EV_KEY x,y,z */

.ev_code_ff=KEY_F,/* EV_KEY */

.ev_code_act_inactivity=KEY_A,/*EV_KEY*/

.power_mode=ADXL_AUTO_SLEEP|ADXL_LINK,

.fifo_mode=ADXL_FIFO_STREAM,

};

为将设备与驱动程序相关联,"平台和总线模型"无需设备驱动程序来包含其所控制设备的硬编码物理地址或总线ID。平台和总线模型还能防止资源冲突,大大改善便携性,并与内核的电源管理特性干净利落地接口。

利用平台和总线模型,设备驱动程序一旦获得设备的物理位置和中断线路,便知道如何控制设备。该信息在探测期间作为一个数据结构传递给驱动程序。

与PCI或USB设备不同,I2C或SPI设备不会在硬件层次上进行枚举。相反,软件必须知道每个I2C/SPI总线段上连接了哪些设备,以及这些设备使用什么地址。因此,内核代码必须明确实例化I2C/SPI设备。这可以通过多种不同方法实现,具体取决于上下文和要求。不过,最常用的方法是通过总线号码声明I2C/SPI设备。

当I2C/SPI总线是一条系统总线时,这种方法是合适的;许多嵌入式系统正是这种情况,其中每条I2C/SPI总线都有一个事先已知的号码。因此,可以预先声明连到该总线的I2C/SPI设备。这可以利用一个结构体i2c_board_info/spi_board_info阵列来完成,该阵列通过调用以下内容注册i2c_register_board_info()/spi_register_board_info()

static struct i2c_board_info __initdata bfin_ i2c_board_info[] = {#if defined(CONFIG_TOUCHSCREEN_AD7879_I2C)||defined(CONFIG_TOUCHSCREEN_AD7879_I2C_MODULE)

{

I2C_BOARD_INFO("ad7879",0x2F),

.irq=IRQ_PG5,

.platform_data=(void*

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top