SES2 LED控制

SES2
LED控制

1、磁盘LED控制的背景及需求

磁盘阵列中每个磁盘都对应多个LED灯,常用来指示磁盘的状态和行为。
比如当磁盘出现故障需要定位、磁盘缺失、正常在线或者正在读写等情况下,可以通过SAS
Enclosre Service来控制enclosure上每个drive对应的LED灯
。初次接触SES2的同学可能觉得它比较抽象,可以把它和BMC类比,整个enclosure也是由嵌入式CPU(比如ARM)及外围电路组成的一个独立系统,可以完成对每个drive
LED、内部风扇、电源的设置、温度的监测等功能。

2、磁盘LED控制的原理和过程

为了统一SAS
expander和enclosure的设计,业内提出了统一的控制接口标准,包括GPIO和I2C两种。当主机需要读取或者控制enclosure内部器件的状态时,host
CPU把命令发送到作为initiator的SAS
expander,然后SAS
expander通过统一的接口规范向作为target的enclosure内部的控制器传送控制命令,enclosure执行最终的硬件操作。

上面是从数据链路层看到的数据流,对上层的应用层而言,其下所有的协议和约定都是透明的,用户只需要了解具体SAS
expander支持的LED类型和数量、硬件实现的LED用途和数量,在linux系统下就可以直接调用sg_ses命令即可。

下面以我最近做的针对某款服务器上drive
bay上的LED控制的需求进行举例说明。实际工作中我需要控制任意drive的绿灯,
这里涉及到磁盘定位和 LED控制两个问题:

(1)如何实现磁盘定位


类似ipmitool的sg_ses命令中加—index参数,可以指定控制某个特定的盘。比如—index=2,就是控制从
编号为 0开始的 index=2的盘,客户自己可以通过上面的选项对应点亮的drive的位置来确定index和磁盘槽位的对应关系,进而实现磁盘定位。

(2)如何实现控制 LED正确报警

根据 笔者使用的LSI
SASxx40 系列 expander手册、SFF-8485等规范以及硬件手册,可以看到实际使用的drive
bay上有两个LED,红色的一个是用作状态(status)的,绿色的一个是用来指示活动(activity)。其中activity
LED默认的工作模式是只要在线就是绿色常亮,只要有读写就是绿色闪烁。我们可以遵循当前对activity
LED的控制,只控制status
LED。通过sg_ses命令帮助文档可以看到,它支持ident、locate、fault、devoff、insert、remove等操作。需要注意的是上面不同的操作可能共享相同的对LED的控制方式,比如在笔者的这款机器上,ident/locate都会让红色的status
LED闪烁,而falt/missing参数只会让等点红。为此,用户可能需要逐一尝试所有的操作,归纳总结出所有可能的status
LED状态,然后结合上层业务需要选用合适的控制方式。比如笔者的这套系统,就可按如下方案
使用 Drive
bays 上的 LED灯:


LED
Type


Status
– meanning Pairs


Need
to be controlled ?


Green
LED (Activity LED)


Blink
- read/write ongoing

No
Green – no read/write ongoing


No


Red
LED (Status LED)


Blink
– locate/ident

Red
- missing

Red
- Fault

Blink
at other frequency - TBD


Yes

下面是相关的参考命令:

lsscsi
-g #确定哪个sg是expander

sg_ses
-ee

sg_ses
--index=2 --set=ident /dev/sg17

sg_ses
--index=2 --clear=active /dev/sg17

sg_ses
--index=2 --set=2:1 /dev/sg17

sg_ses
--index=2 --clear=2:1 /dev/sg17

sg_ses
--index=0 --clear=2:1 /dev/sg17

sg_ses
--index=9 --clear=active /dev/sg17

sg_ses
--index=9 --set=fault /dev/sg17

sg_ses
--index=8 --set=locate /dev/sg17

sg_ses
--index=9 --set=missing /dev/sg17

sg_ses
--index=7 --set=fault /dev/sg17

sg_ses
--index=7 --set=active /dev/sg17

sg_ses
--index=6 --set=devoff /dev/sg17

sg_ses
--index=9 --set=insert /dev/sg17

sg_ses
--index=9 --set=insert /dev/sg17

sg_ses
--index=5 --set=remove /dev/sg17

sg_ses
--index=4 --set=dnr /dev/sg17

sg_ses
--index=3 --set=ident /dev/sg17

总而言之,对SES2的调用,需要结合具体sas
expander的规格、板卡硬件设计、SFF-8485等规范和业务所有可能的user
case,利用现有的sg_ses/lsscsi等工具,进行系统全面的考量和设计,才能简单有效地满足客户和业务需求。

3、参考文档和链接

https://en.wikipedia.org/wiki/SES-2_Enclosure_Management

https://en.wikipedia.org/wiki/SGPIO

http://www.docin.com/p-81485148.html

http://sg.danny.cz/sg/sg_ses.html

http://www.alldatasheet.com/datasheet-pdf/pdf/303320/DDK/SAS-RA29-S1AA-FG.html

时间: 08-14

SES2 LED控制的相关文章

linux输入子系统(input subsystem)之按键输入和LED控制

实验现象:在控制台打印按键值,并且通过按键控制相应的LED亮灭. 1.代码 input_subsys_drv.c 1 #include <linux/module.h> 2 #include <linux/version.h> 3 4 #include <linux/init.h> 5 #include <linux/fs.h> 6 #include <linux/interrupt.h> 7 #include <linux/irq.h&g

beaglebone led控制。

子曾经曰过,点灯,是embedded领域的“hello world” 最近开始入手beaglebone…… 原文地址: http://www.cnblogs.com/hebaichuanyeah/p/4702802.html 默默地EEer 关于linux环境下编写字符设备驱动: http://www.cnblogs.com/hebaichuanyeah/p/3460498.html C艹/QT,beaglebone的LED控制. led控制部分,打开文件,设置方向/电平. #include "

4412开发版led控制

exynos4412裸版控制led灯. 1.查看电路图. 2.查看4412手册.找到对应的寄存器. 3.配置对应的寄存器. 一.再开发板上我们的外部设备led,在核心板.所以我们需要打开核心板电路图. [email protected]:~/work/arm/arm资料/exynos4412_lzy/schematic$ ls LCD-HD700-1306.pdf Tiny4412_1306_core_board_sch.pdf LCD-S701-121212.pdf Tiny4412SDK_1

电赛菜鸟营培训(一)&mdash;&mdash;STM32之LED控制

一.STM32F103C8 引脚分布 二.LED的共阴.共阳接法 这里应该是七段数码管的接法. 限流电阻选择为470,在Multism中仿真,也需要接入,否则会出现闪烁情况.或者直接更改属性. 三.消除按钮的机械振动 1.键的特性 键盘是由若干独立的键组成,键的按下与释放是通过机械触点的闭合与断开来实现的,因机械触点的弹性作用,在闭合与断开的瞬间均有一个抖动过程 . 2.去抖动的方法 (1)硬件去抖动,主要是通过滤波电路. (2)软件去抖动,延时函数. 四.按钮控制灯 1.一对一 每一个按键的电

TI CC2541的LED控制

现在终于进入到蓝牙SPI的环节了, 下面还要研究I2C, 所以第一步, 先点灯, 就是GPIO控制吧. 参考一下LEd的初始化: void HalLedInit (void){#if (HAL_LED == TRUE)  HalLedSet(HAL_LED_ALL, HAL_LED_MODE_OFF);  // Initialize all LEDs to OFF.  // Set LED GPIOs to outputs.  LED1_DDR |= LED1_BV;#if (!defined

am335x -- led 控制

#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> int main(void) { FILE *p=NULL;  int i=0;  p = fopen("/sys/class/gpio/export","w");  fprintf(p,"%d",38);  fclose(p);  p = f

Android 下led 的控制

首先说一下我的开发环境,硬件环境开发板使用的是全志的CQA83T板子,Android开发是windows下的eclipse.关于Android下控制led,主要有两大部分,一是Android程序,二是Linux驱动开发.Android部分的开发肯定要使用Android ndk,jni编程,通过jni来调用Linux下的C函数从而控制led设备.关于ndk的安装,和简单使用我在另外的博客里面已经写了,有兴趣的可以自己看看.这篇博客住要是讲一下Android部分的开发,这里默认led驱动正常. 先看

[国嵌攻略][174][CGI快速入门-网页控制LED]

CGI程序(Common Gate Way Interface) 在服务器外部供服务器调用的程序,CGI程序与服务器配合后能让服务器完成更强大的功能. 1.浏览器通过HTML表单或超链接请求指向一个CGI应用程序的URL. 2.服务器收发到请求. 3.服务器执行指定所CGI应用程序. 4.CGI应用程序执行所需要的操作,通常是基于浏览者输入的内容. 5.CGI应用程序把结果格式化为网络服务器和浏览器能够理解的文档(通常是HTML网页). 6.网络服务器把结果返回到浏览器中. 移植CGI库 1.解

QT 控制LED实验

1.实验准备 在PC 机D:盘下创建文件夹qt-led,将光盘qt_led_exp 文件夹下的images 文件夹拷贝到E:盘下qt-led 文件夹qt-led 内 2.新建工程 新建一个Empty QT4 Project 工程,如下: 点击:File >>> New File >>> Empty Qt4 xxx 保存到D:盘下,起名叫qt-led,如下所示: 3.添加资源文件(图像) 右键点击工程文件qt_led->add new-->Qt Resourc