GFSU配置

GFSU不提供联通白盒化规范适配,因此FsuOS采用硬件适配层来移植。

GFSU采用TI-A8 CPU, 128MB内存,256MB NAND, Linux 3 内核

GFSU目前遇到2个硬件版本:

  1. 8个串口都是原生串口。
    此时SMDDevice.conf里使用gfsu适配
    fsu_model=gfsu
    有gfsu_config.json配置文件
  2. 前4个串口是原生串口,后4个是扩展串口。 此时SMDDevice.conf里使用gfsu2适配
    fsu_model=gfsu2
    board_version=12
    将gfsu_config.json配置文件copy为gfsu2_config.json
    注意: 这2个配置必须都要有。
    如何识别这个串口情况,我们可以从多个角度来验证:
    dmesg命令
    [ 26.219921] Vertiv Co fsu led driver version: 1.00 — the major is 230.
    [ 26.385851] Vertiv Co fsu wdt driver version: 1.00 — the major is 231.
    [ 26.590550] Vertiv Co fsu rtc driver version: 1.00 — the major is 121.
    [ 26.753488] Vertiv Co fsu water driver version: 1.00 — the major is 240.
    [ 26.892955] Vertiv Co gfsu slot driver version: 1.00 — the major is 242.
    [ 27.055892] Vertiv Co fsu i2c driver version: 1.00 — the major is 238.
    [ 27.242423] Vertiv Co fsu io driver version: 1.00 — the major is 237.
    [ 27.581630] Vertiv Co fsu relay driver version: 1.00 — the major is 234.
    [ 27.963732] Vertiv Co fsu pmc driver version: 1.00 — the major is 243.
    [ 30.389498] Vertiv Co gfsu switch driver version: 1.00 — the major is 232.
    [ 30.650561] Vertiv Co fsu extended uarts driver version: 1.00 — the major is 233.
    注意看Vertiv Co fsu extended uarts driver version: 1.00 — the major is 233. 有这个,就是扩展串口的驱动。

ls -l /dev/ttyS*

[root@GFSU /]# ls -l /dev/ttyS*
crw--w----    1 root     root      251,   0 Aug 24 12:55 /dev/ttyS0
crwxr-xr-x    1 root     root      251,   1 Jan  1  1970 /dev/ttyS1
crwxr-xr-x    1 root     root      251,   2 Jan  1  1970 /dev/ttyS2
crwxr-xr-x    1 root     root      251,   3 Jan  1  1970 /dev/ttyS3
crwxr-xr-x    1 root     root      251,   4 Jan  1  1970 /dev/ttyS4
crwxr-xr-x    1 root     root      233,   0 Jan  1  1970 /dev/ttyS5
crwxr-xr-x    1 root     root      233,   1 Jan  1  1970 /dev/ttyS6
crwxr-xr-x    1 root     root      233,   2 Jan  1  1970 /dev/ttyS7
crwxr-xr-x    1 root     root      233,   3 Jan  1  1970 /dev/ttyS8

我们注意看251,233,这个是驱动的主设备号,默认的主设备号是251

[root@GFSU vertiv]# ls -l /dev/ttyUSB*
crwxr-xr-x    1 root     root      188,   0 Jan  1  1970 /dev/ttyUSB0
crwxr-xr-x    1 root     root      188,   1 Jan  1  1970 /dev/ttyUSB1
lrwxrwxrwx    1 root     root             7 Sep 23 10:44 /dev/ttyUSB16 -> ttyUSB4
lrwxrwxrwx    1 root     root             7 Sep 23 10:44 /dev/ttyUSB17 -> ttyUSB5
lrwxrwxrwx    1 root     root             7 Sep 23 10:44 /dev/ttyUSB18 -> ttyUSB6
lrwxrwxrwx    1 root     root             7 Sep 23 10:44 /dev/ttyUSB19 -> ttyUSB7
crwxr-xr-x    1 root     root      188,   2 Jan  1  1970 /dev/ttyUSB2
lrwxrwxrwx    1 root     root             7 Sep 23 10:44 /dev/ttyUSB20 -> ttyUSB0
lrwxrwxrwx    1 root     root             7 Sep 23 10:44 /dev/ttyUSB21 -> ttyUSB1
lrwxrwxrwx    1 root     root             7 Sep 23 10:44 /dev/ttyUSB22 -> ttyUSB2
lrwxrwxrwx    1 root     root             7 Sep 23 10:44 /dev/ttyUSB23 -> ttyUSB3
crwxr-xr-x    1 root     root      188,   3 Jan  1  1970 /dev/ttyUSB3
crwxr-xr-x    1 root     root      188,   4 Sep 23 10:50 /dev/ttyUSB4
crwxr-xr-x    1 root     root      188,   5 Sep 23 10:50 /dev/ttyUSB5
crwxr-xr-x    1 root     root      188,   6 Jan  1  1970 /dev/ttyUSB6
crwxr-xr-x    1 root     root      188,   7 Sep 23 10:50 /dev/ttyUSB7

扩展板的情况,有时候,我们发现它并没有把ttyUSB?映射为ttySP?,此时,我们可以直接修改gfsu_config.json自己做映射。
ttySUB16 对应的是 ttyS9, 即第9个串口。

DI

支持DI1-DI4

AI

AI序号 板子接口
1-8 1-8路AI 0-5v
9 电池组1电压 52.3v
10 电池组1中位电压 26.7v
11 电池组2电压 52.3v
12 电池组2中位电压 26.7v

DO 4路

SP

维谛可以从网站FSU的配置,映射串口:

COM1-8  ->  SP1-8

COM46   ->  SP9
COM47   ->  SP10
COM48   ->  SP11
COM49   ->  SP12
COM50   ->  SP13
COM51   ->  SP14
COM52   ->  SP15

修复data3分区损坏无法挂载问题

ubidetach -m 11
然后格式化掉
flash_erase /devmtd11 0 0
然后
ubiattach /dev/ubi_ctrl -m 11 -O 2048
ubimkvol /dev/ubi2 -N data3 -m
mount -t ubifs -o sync ubi2:data3 /data3

已知问题:

系统启动真是太慢了,是目前所有板子中启动最慢的,华为的SMU02B1也很慢,但是人家SMD02B1带个屏幕

感觉至少2分钟

sample程序有时候获取的DI/AI值不对,重启系统后恢复正常

遇到过烟感,水浸,现场变了,读取值不变。 电池电压读取偏低。

感觉GFSU2的串口驱动实现有问题,GFSU串口驱动似乎没有发现这个问题

表现:由于FsuOS程序内部默认是异步模式,串口操作是同步写,异步读,使用的boost::asio::async_read_some,boost开发库的品质比stl都好,品质有保证,如果boost不正常,一般都是操作系统内的设备驱动做的不对。
GFSU2遇到2个问题:

  • 串口5-8,由于不是标准串口,我们只能和dgm一样,单独开读线程模拟异步读,但是发现运行一段时间,程序都在运行,但是read读不到数据了,重启SMDDevice,大概率会恢复,过了一段时间又不行了,但是有时候只有重启系统才能好,先仔细找我们自身问题,以前open/ioctl/close/write串口都会加个锁保护下,防止并发,read的时候一般不加锁,因为考虑read无非读成功和读不成功,也不会有啥事,报个错就行了。GFSU2不行,这个read不保护能用一阵子,但是用一段时间,read就不出数据了,好脆弱!!!我把read也加锁保护上,似乎问题解决了,read一直都是好的。这个算FsuOS程序不标准,虽然目前遇到的所有程序,读不保护也没事,但是这个不行,算FsuOS的锅。
  • 串口1-4你是原生标准串口,9-12是你usb扩展也是标准串口,我用boost读,标准写法,过一段时间你read也不出数据,这我可没法保护,困惑了半个月,放弃了,就低改同步做法吧。
    初步怀疑串口驱动问题:
  1. 对writev支持不行,会造成使用boost::asio::write发送数据发送不全,这个概率低,看起来不像对方收不到。
  2. 串口驱动对NON_BLOACK模式支持不对,前面使用的NON_BLOCK+read返回EAGAIN,使用NON_BLOCK模式一段时间会出问题,现在改成了默认的BLOCK模式,配合select,看起来稳定了
    基本可以确定gfsu2串口驱动问题:
  • 驱动内部并发保护没做好,write/read等操作接口不能并发,并发不冲突没事,冲突了读就会坏掉,进而导致内部驱动坏掉,重启操作系统才能恢复。
  • NON_BLOCK模式实现不对。

data3和data4文件分区消失问题

GFSU的文件分区,data3和data4都是ubifs文件系统,ubifs是嵌入式linux常用文件系统,速度比较快,但是会崩溃。 使用ubifs的文件系统都存在崩溃问题,不是GFSU一家的问题。 如果遇到,将分区重新格式化再挂载上就可以继续使用。

ssh无法登录的问题

这个问题其他地方也会加到,但是GFSU相对多一些。这个问题只影响ssh交互终端。
PTY allocation request failed
如果遇到,可以先尝试退出几个ssh连接,看能不能连接上,如果还不行,就直接执行reboot命令
ssh root@192.168.3.50 reboot 目标FSU就会重启,一般就会恢复。

个别板子出现程序吊死情况

表现为不消耗CPU时间,重启程序即恢复。有2-3块设备发生,很是困扰。暂时通过脚本检测CPU时间不消耗,即重启SMDDevice。 run_time.sh

#!/bin/sh
TTIME=0
CheckProcess(){
        PID=$(ps|grep -v "run.sh"| grep "\./SMDDevice" | grep -v "grep"|awk '{print $1}')
        echo "PID:"$PID
        if [ ! -z $PID ];
        then
           UTIME=`awk '{ print $14+$15}' < /proc/$PID/stat`
           echo "TTIME:"$TTIME "UTIME:"$UTIME
           DIFF=$(expr $UTIME - $TTIME)
           if [ $TTIME -eq 0 ];
           then
                TTIME=$UTIME
           elif [ $DIFF -lt 10 ];
           then
                kill $PID
                echo "process hangs"
                TTIME=0
           else
                TTIME=$UTIME
           fi
        fi
}
while true
do
CheckProcess
sleep 60
done

版本对比

2024年前的GFSU,默认没有ssh/dropbear,需要自己部署。 2024年后的GFSU,自带ssh/dropbear.

GFSU的ssh/dropbear一直有个不能同时登录的问题,会提示unable to alloc 什么,不知道怎么回事,只在这个设备上见到过。

DO 控制

GFSU的DO可以通过脚本直接设置模式,比较方便.

  1. 设置模式 /home/idu_script/setrelay
    根据提示,将DO1-DO4,可以设置为常开或者常闭合。

如果DO模式设置错误,再接门禁这种DO控制的设备时候,会遇到,门无法关闭(因为DO信号一直给高),门在无操作情况下会突然开启(DO模式不对,系统重启的时候可能会恢复默认状态,造成DO信号误触发)

  1. 将DO1拉高或者拉低 2024年前使用srelay:
    srelay的DO1的索引是10 = 9 + 1, 9 + 2
    /home/idu_script/srelay 10 1
    /home/idu_script/srelay 10 0
    新板子的脚本改为/test/relay_test
    我们做个脚本兼容原有情况 新建脚本 srelay 内容为
#!/bin/sh  
/test/relay_test $(($1-9)) $2