hfy4G-mdm9607


原文链接: hfy4G-mdm9607

获取SIM卡CCID

AT+CRSM=176,12258,0,0,10
国际移动台设备标识请求:AT+CIMI
为查询到的 IMSI 号: 460045904307938

AT+EGMR 读取和修改IMEI号码 软件DFM规范

1、读写SN、IMEI、蓝牙MAC地址、WIFI MAC地址(ok) 手机软件支持用AT命令读写SN、IMEI、蓝牙MAC地址(带蓝牙功 能的手机)、WIFI MAC地址(带WIFI功能的手机)。
作用:读写手机的SN、IMEI、蓝牙MAC地址及WIFI MAC地址。 所涉及到的生产过程或测试:MES各工位 要求:
手机软件必须支持下面的AT命令
AT+EGMR=0,5 //查询SN //+EGMR:”MT012345678901234567”
AT+EGMR=1,5,“SN” //写SN
AT+EGMR=0,7 //查询主IMEI
AT+EGMR=1,7,"356802050040921" 仅保留前15位多余的位数丢弃 //写主IMEI
AT+EGMR=0,10 //查询副IMEI
AT+EGMR=1,10,“SlaveIMEI” //写副IMEI
AT+EMBT=1 //开蓝牙
AT+EMBT=0,MTKBTDEVICE,MAC //写蓝牙MAC地址
AT+EMBT=5 //查询蓝牙
AT+EMBT=2 //关蓝牙
AT+CKTEGMR=0,1 //读WIFI地址
//WIFI_MAC_ADR 00:0c:e7:00:00:00
AT+CKTEGMR=1,1,"MAC地址" //写WIFI MAC地址

V2.0 项目

用户名:root 密码 "976*18"
增加太阳能电压检测
升级说明: 首先要到 apps_proc目录解开 external.tar.gz 压缩包再重新编译,另外,编译demo会有错误,你把 我发的这2个文件覆盖到demo就可以了。

测试项目:

A. 图像质量
B. 电流测试
C.

{ "ati", "ATI\r", "OK" },
{ "ccid", "AT+CRSM=176,12258,0,0,10\r", "OK" },
{ "hwcust", "at+hwcust=1\r", "OK" },
{ "sdhci", "at+sdhci=1\r", "OK" },
{ "csq", "AT+CSQ\r", "+CSQ" },
{ "cam interval", "AT+campara=10,3600\r", "OK" },
{ "cam upload", "AT+CAMPARA=6,\"http://47.104.136.74:8080/upload\"\r", "OK" },
{ "cam reupload", "at+campara=9,1\r", "OK" },
{ "cam refail", "at+campara=18,1\r", "OK" },
{ "cam start", "at+campara=14,0700\r", "OK" },
{ "cam end", "at+campara=15,1800\r", "OK" },
{ "cam svr", "at+camsvr=2,1\r", "OK" },
{ "cam save", "at+camscont\r", "OK" },
{ "auto start tcp", "at+cipcfg=1\r", "OK" },
{ "camsvr", "at+cipscont=0,\"CAM\",\"47.104.136.74\",9999,1\r", "OK" },
// { "csclk", "AT+CSCLK=1,1,1\r", "OK" },
echo -e "at+hwcust=1\r" >/dev/smd8
echo -e "at+sdhci=1\r" >/dev/smd8
echo -e "at+campara=14,0700\r" >/dev/smd8
echo -e "at+campara=15,1800\r" >/dev/smd8

echo -e "at+campara=10,3600\r" >/dev/smd8

echo -e "at+campara=9,1\r" >/dev/smd8
echo -e "at+campara=18,1\r" >/dev/smd8

echo -e "at+camsvr=2,1\r" >/dev/smd8

echo -e "at+campara?\r" >/dev/smd8

echo -e "at+camscont\r" >/dev/smd8

echo -e 'AT+CAMPARA=6,"http://47.104.136.74:8080/upload"\r' >/dev/smd8


echo -e "at+camrv?\r" >/dev/smd8

echo -e "at+camrv=1\r" >/dev/smd8


echo -e "at+cipcfg=1\r" >/dev/smd8
echo -e "at+cipscont=0,\"CAM\",\"47.104.136.74\",9999,1\r" >/dev/smd8
echo -e "AT+CSCLK=1,1,1\r" >/dev/smd8
echo -e "at+cipscont?\r" >/dev/smd8
echo -e "ati\r" >/dev/smd8

### 调节电池分级

echo -e "AT+CAMPARA=10, 3600,7200,28800,86400\r" >/dev/smd8

echo -e "AT+CAMPARA=19,4\r" >/dev/smd8

echo -e "at+camrv=1\r" >/dev/smd8


echo -e 'AT+CIPSTART="CAM","47.104.136.74",4122,1\r' >/dev/smd8
echo -e 'at+cipscont=0,"CAM","47.104.136.74",9999,1\r' >/dev/smd8
AT+CIPSTART="CAM","47.104.136.74",4122,1            


C28C0DB26D39331A{"msg_type":8,"update_version":"1.8.18","timestamp":1587116614,"firmware_url":"http://47.104.136.74:8880/atfwd_daemon","firmware_md5":"f3a77110fd7cd0037b8ca56074555f6d"}15B86F2D013B2618

C28C0DB26D39331A{"msg_type":8,"update_version":"1.8.18","timestamp":1587116614,"firmware_url":"http://47.104.136.74:8880/reupload","firmware_md5":"44bc91d56a8ce038f12f046f934205e4"}15B86F2D013B2618


# 多连接模式
AT+CIPMUX=1
AT+CIPSTART=3,"CAM","47.104.136.74",4122,1

monitor.sh

#! /bin/sh
host_dir=""
proc_name="ssc_app"
file_name="/var/log/monitor.log"
pid=0

while  [ 1 ]
do
	number=`ps -ef | grep $proc_name | grep -v grep | wc -l`
	if [ $number -eq 0 ]; then
		start-stop-daemon -S -b -a /data/bin/$proc_name
		pid=`ps -ef | grep $proc_name | grep -v grep | awk '{print $1}'`
		echo ${pid}, `date` >> $file_name
	fi
	sleep 10
done

vi /etc/rc5.d/S98misc-daemon

if [ -f /etc/init.d/monitor.sh ]
then

/etc/init.d/monitor.sh 

fi

常见问题

at+sdhci=1 重启后又恢复成/data/cam,无法加载/mnt/sdcard
解决: 重新刷写固件需要先执行 at+hwcust=1 ,在执行 at+sdhci=1 才可以。

自定义的固件 需要将sd卡的加载函数打开
默认固件初始化的调用链 hw_custom.cpp
hw_init(); --> hw_cust_init() --> // 是否需要加载SD卡 hw_sdhci(true, true);

                          --> job_queue_put(JOB_SUN_CHARGER, NULL);  --> hw_sun_charger()
/************************Copyright(c)******************************* 
**                       
**                       G8100
**                       G8100    项目组 
**                       WebSite :www.szhfy.com.cn 
**------------------------------------------FileInfo------------------------------------------------------- 
** File name:                 athdlr_i2c.c
** Last modified Date:  2020-03-20
** Last Version:              1.0 
** Descriptions:             
**------------------------------------------------------------------------------------------------------ 
** Created by:               Justin.Zhong
** Created date:            2020-03-20
** Version:                            1.0 
** Descriptions:             The original version 
**------------------------------------------------------------------------------------------------------ 
** Modified by: 
** Modified date: 
** Version: 
** Descriptions: 
*******************************************************************/

#ifndef _I2C_TRANSFER_H
#define _I2C_TRANSFER_H

#include "gu_sdk_def.h"

#ifdef __cplusplus
extern "C" {
#endif

extern int iic_transfer_write(uint8 slave_address, uint8 reg, uint32 val, uint8 write_num);


extern int iic_transfer_read(uint8 slave_address, uint8 reg, uint8 *recv_val, uint8 read_num);



#ifdef __cplusplus
}
#endif



#endif   // _ATHDLR_HW_H


nc开启测试服务
while true;do nc -l 4122; done

固件下载

adb reboot bootloader // 进入下载模式
fastboot flash system mdm9607-sysfs.ubi // 下载编译好的固件

;获取SIM卡CCID

AT+CRSM=176,12258,0,0,10
+CRSM: 144, 0, “98680014915091309783”
OK
Note: CCID=89860041190519037938

AT+CGSN 获取GSM模块的IMEI号(国际移动设备标识) 4G 设备信息
AT+CGSN
356802050104750

AT+CIMI 获得ISMI(国际移动签署者标识) SIM信息

+CAMTP: ERR

AT+SPIDRV=0, 0 // 关掉SPI
AT+SPIDRV=1, 0 // 关掉SPI
at+camscont // 保存配置
[I]|14:18:30.812 8544|CAM: New file /mnt/sdcard/20200916/20200916141830-07.jpg
[W]|14:18:32.23 8544|usb_take_photo() failed to switch cmd 6, power again

+CAMTP: ERR
[E]|14:18:32.140 8544|evt_add_fd fd 19 is duplicated
[I]|14:18:32.140 8544|_calc_sleep_time 1.prepare to sleep 0 hours 0 minutes 30 sec

C操作串口

sio_write_data(SIO_CONT_SMD, "AT+CSQ\r",7);

+csq: 17,99 # 外置天线
+csq: 10,99 # 去掉天线
+csq: 99,99 # 无天线
+csq: 25,99 # 大贴片天线
+csq: 18,99 # 小贴片天线

###
AT+CGSN
356802050104925

控制台终端输入AT命令到smd8,步骤如下:

  1. 先执行命令 cat /dev/smd8 &

  2. 再执行 echo -e "ati\r\n" > /dev/smd8

/ # cat /dev/smd8 &
/ # echo -e "ati\r\n" > /dev/smd8
/ # echo -e "ati\r\n" > /dev/smd8
/ # ati
Quectel
EC20F
Revision: EC20CEFAGR06A02M4G_OCPU

echo -e "at+csclk=0\r" >/dev/smd8

GPIO

/*

在操作系统中直接使用命令行操作。
GPIO可以不使用驱动模块,直接调用/sys/class/gpio设置gpio复用引脚,

操作,操作值,通过查询的方式获取中断等。

操作的GPIO值=block*16+pin,GPIO8_15 = pin 8*16+15 = pin143
GPIO4_5
echo 37 > /sys/class/gpio/export  设置并导出引脚
echo in > /sys/class/gpio/gpio37/direction    设置方向
cat /sys/class/gpio/gpio37/direction    查看方向
echo 1 /sys/class/gpio/gpio37/value    设置输出值
cat /sys/class/gpio/gpio37/value    查看输入值
echo 37 >/sys/class/gpio/unexport    取消导出
echo rising > /sys/class/gpio/gpio143/edge    设置为上升沿触发,否则为none不触发

// 合方圆开启sdcard
echo 37 > /sys/class/gpio/export
echo high > /sys/class/gpio/gpio37/direction
echo 1 /sys/class/gpio/gpio37/value
sprintf(cmd, "insmod /usr/lib/modules/3.18.44/kernel/drivers/mmc/host/sdhci-msm.ko");
system(cmd);
mount /dev/mmcblk0p1 /mnt/sdcard

*/

8.2 开启 SD 卡保存方法

// 设置模块输出 2.852 V 电压
AT+PWLDO=2852000
AT+PWLDO=3000000
// 设置上电时自动识别 SD 卡
AT+SDHCI=1
// 上电重启即可

串口 开启低功耗抓拍模式

AT+HWCUST=01
AT+CAMPARA=19,4
AT+CAMPARA=10, 3600,7200,28800,86400  // 1小时1张照片
AT+CAMPARA=6,"http://47.104.136.74:8081/upload"
AT+CAMPARA=12,15                    // 小视频录制时长
AT+CAMSVR=2,1
AT+CAMSCONT

AT+CSCLK=1,1,1              // 开启低功耗,唤醒时间1s,保存到NVRAM

curl -F "file=@app_bin.tar.gz" http://47.104.136.74:8080/file

SGM41511 pdf

echo -e "AT+HWI2CWR=6B,06,e6\r\n" > /dev/smd7
写入 调整充电电压 AT+HWI2CWR=6B,06,e6
调整电流 AT+HWI2CWR=6B,02,B2

读取 I2C配置值 AT+HWI2CRD=6B,06,1 4
AT+HWI2CRD=6B,00,4
AT+HWI2CRD=6B,04,4
AT+HWI2CRD=6B,08,4
AT+HWI2CRD=6B,0C,4

6.2.11 读取电池电压以及外部 ADC:AT+EADC
echo -e "at+egpio=28,1\r" >/dev/smd7

echo -e "AT+PWLDO=3000000\r" >/dev/smd7
echo -e "at+eadc\r" >/dev/smd7
at+egpio=28,0 // 充电电流
at+egpio=28,1 // 负载电流

开启GPS

at+gpspwr=1
at+gpsldo

3.3 开启 4G 摄像头自动拍照

AT+CAMPARA=0, 65       //设置电源开关控制管脚为 65
AT+CAMPARA=1, 1280         //设置像素宽度为 1280 
AT+CAMPARA=2, 720          //设置像素高度为 720 
AT+CAMPARA=3, /run         //不可以设置,如果插入 SD 卡,查询 结果路径为 SD 卡目录位置
AT+CAMPARA=4, 15                    //设置文件保存天数为 15 天
AT+CAMPARA=5, jpg                  //设置文件的扩展名为"jpg"
AT+CAMPARA=6, “ftp://192.168.1.120" //设 置 上 传 的 URL 地 址 为 ftp://192.168.1.120
AT+CAMPARA=7, justin       // 设置上传用户为 justin
AT+CAMPARA=8, /reserve     // 设置上传到 URL 的目标路径为 /reserve
AT+CAMPARA=9, 1            // 支持断点续传
AT+CAMPARA=9, 0            // 不支持断点续传
AT+CAMPARA=10, 3600,7200,28800,86400    // 设置自动拍照间隔时间为 30 秒 
AT+CAMPARA=11, 30          // 设置视频录制时间长度为 30 秒

+CAMSVR: 2, 1
+CAMPARA: 0, "PWR_PIN", 65
+CAMPARA: 1, "WIDTH", 1920
+CAMPARA: 2, "HEIGHT", 1088
+CAMPARA: 3, "STORAGE", "/data/cam"
+CAMPARA: 4, "FILE_RESERVE_DAYS", 30
+CAMPARA: 5, "FILE_EXT", ""
+CAMPARA: 6, "UPLOAD_URL", "http://47.104.136.74:8080/upload"
+CAMPARA: 7, "UPLOAD_USER", ""
+CAMPARA: 8, "UPLOAD_PWD", ""
+CAMPARA: 9, "UPLOAD_RESUME", 0
+CAMPARA: 10, "WORK_INTERVAL", 60, 120, 240, 480
+CAMPARA: 11, "TP_COUNT", 1
+CAMPARA: 12, "RV_DURATION", 10
+CAMPARA: 13, "TP_COUNT_DELAY_MS", 100
+CAMPARA: 14, "WORK_TIME_START", 0000
+CAMPARA: 15, "WORK_TIME_STOP", 0000
+CAMPARA: 16, "REBOOT_NW_ERR", 0
+CAMPARA: 17, "OFFLINE_AT_SLEEP", 0                     // 
+CAMPARA: 18, "REUPLOAD_FAIL", 1                        // 重传
+CAMPARA: 19, "WORK_INTERVAL_MODE", 4                   // 控制 WORK_INTERVAL 的数量 =4,可自由设置工作等级
+CAMPARA: 30, "PWR_DELAY_MS", 1500
+CAMPARA: 31, "RV_FRAMES_PER_SECOND", 25

+CAMPARA: 0, "PWR_PIN", 65
+CAMPARA: 1, "WIDTH", 1920
+CAMPARA: 2, "HEIGHT", 1088
+CAMPARA: 3, "STORAGE", "/data/cam"
+CAMPARA: 4, "FILE_RESERVE_DAYS", 30
+CAMPARA: 5, "FILE_EXT", ""
+CAMPARA: 6, "UPLOAD_URL", ""
+CAMPARA: 7, "UPLOAD_USER", ""
+CAMPARA: 8, "UPLOAD_PWD", ""
+CAMPARA: 9, "UPLOAD_RESUME", 0
+CAMPARA: 10, "WORK_INTERVAL", 60
+CAMPARA: 11, "TP_COUNT", 1
+CAMPARA: 12, "RV_DURATION", 10
+CAMPARA: 13, "TP_COUNT_DELAY_MS", 100
+CAMPARA: 14, "WORK_TIME_START", 0000
+CAMPARA: 15, "WORK_TIME_STOP", 0000
+CAMPARA: 16, "REBOOT_NW_ERR", 0
+CAMPARA: 17, "OFFLINE_AT_SLEEP", 0
+CAMPARA: 18, "REUPLOAD_FAIL", 0
+CAMPARA: 19, "WORK_INTERVAL_MODE", 0
+CAMPARA: 30, "PWR_DELAY_MS", 1500
+CAMPARA: 31, "RV_FRAMES_PER_SECOND", 25

````

```cpp
AT+CAMPARA?

// 1. 如果使用的 SPI 摄像头,使能 SPI 驱动 
AT+SPIDRV=0,0 1

// 2. 如果配置为对接 4GCAM100 摄像头
AT+HWCUST=1

// 设置上传的服务器地址(根据自己所需上传地址而定) 
AT+CAMPARA=6, "http://47.104.136.74:8080/upload"
AT+CAMPARA=6, "http://47.104.136.74:8081/upload"

// 设置自动拍照间隔时间(第二个参数可更改,如例所示设为 60,代表自动拍照间隔时间 为60秒)
AT+CAMPARA=10, 3600,7200,28800,86400    // 设置自动拍照间隔时间为 3600 秒 

AT+CAMSCONT   // 保存设置 

AT+CAMSVR=2, 1  //// 启动自动定时拍照模式服务

AT+CSCLK=0      // 关闭低功耗休眠
AT+CSCLK=1      // 如果需要低功耗 
1,1,1

// 上电重启即可

8.5 设置 4G 摄像头在规定时间范围工作
 
// 设置从早上 7 点开始工作 
AT+CAMPARA=14,0700
// 设置从下午 7 点停止工作 
AT+CAMPARA=15,1900
// 保存设置 
AT+CAMSCONT

// 录制10小视频
AT+CAMPARA=12,10

work interver 计算
同时配置 计算最短的的

多个任务 计算最短的周期

开启长链接服务

at+cipcfg?
at+cipcfg=1,600,0                                    // 配置自动连接
at+cipscont                                         // 保存TCPIP配置
echo -e "at+cipscont?\r" > /dev/smd8
at+cipscont?                                        // 查询tcpip配置
at+cipscont=0,"CAM","47.104.136.74",4122,1 
AT+CIPSTART="CAM","47.104.136.74",4122,1 
AT+CIPSTART="CAM","47.104.136.74",9999,1            // 1 服务器无响应不会自动重启连接
at+cipscont=0,"CAM","47.104.136.74",9999,2          // 2 服务器无响应自动重启连接

at+cipscont=0,"CAM","hofuniot.cn",4122,1 2

日志

你先执行 AT+FACTORY=1,4 ,然后再重新做一次升级后,
你执行 AT+FACTORY=3 上传日志到我们服务器

AT+FACTORY=2,02

4G低功耗摄像头(2) 如果需要建立TCP长链接,定时发送心跳包,并且通过预先配置唤

醒包唤醒系统,可以采用以下指令配置:
• 配置TCP断线重连: AT+CIPSTART=“TCP","IP或域名",端口,连接选项
• AT+CIPSTART=“TCP","hofuniot.cn",4120,2
• 连接选项说明
• 0 - 不需要保持长链接。
• 1 - 链接在指定空闲时间值后发送自定义心跳包保持长链接,不判断服务器是否有回应包。
• 2 – 链接在指定空闲时间值后发送自定义心跳包保持长链接,若服务器在两次心跳包间隔之内没给模块发数据,模块会自动发起
重连
• 心跳发送间隔: AT+CIPCFG=0,60,0
• 配置登录包:AT+CIPPACK=1,"id0001"
• 配置心跳包:AT+CIPPACK=0,"00"
• 配置唤醒包:AT+CIPPACK=2,"xx"
• 设置休眠:AT+CSCLK=1,1 (配置休眠模式为1,唤醒时间持续1秒)

1) 图像抓拍HTTP上传抓拍指令 C28C0DB26D39331A{"msg_type":4,"timestamp":1587116614,"action":0,"http_url": “http://szgpay.ticp.net:8123/upload.php","count":1}15B86F2D013B2618

1) 小视频抓拍HTTP上传抓拍指令 C28C0DB26D39331A{"msg_type":4,"timestamp":1587116614,"action":1,"http_url": "http://47.104.136.74:8080/upload","count":1}15B86F2D013B2618
2) 长连接图像抓拍

6
C28C0DB26D39331A{"msg_type":6,"timestamp":1587116614}15B86F2D013B2618
3) 服务器下发APP更新指令,需要在HTTP服务器上准备好相应的编译程序atfwd_daemon
C28C0DB26D39331A{"msg_type":8,"update_version":"1.8.12" ,"timestamp":1587116614,"firmw are_url":"http://szgpay.ticp.net:8123/fw_app/atfwd_daemon","firmware_md5":"4ec74594fbfe2f 5db3f67376de2df3d1"}15B86F2D013B2618
4)远程修改设备配置
C28C0DB26D39331A{"msg_type":52,"timestamp":1587116614," “conn_id":0,"app":"cam","host":"47.104.136.74","port":5000,"opt":2,"intervel":120}15B86F2D013B2618

C28C0DB26D39331A{"msg_type":8,"update_version":"1.8.17" ,"timestamp":1587116614,"firmw are_url":"http://47.104.136.74:8000/app_bin.tar.gz","firmware_md5":"b2d27bef59bbec8c8a35a70d8dbfc5de"}15B86F2D013B2618

req

C28C0DB26D39331A{"err":0,"msg_type":1,"firmware_version":"1.8.15","device_id":"356802050042281","timestamp":1592879687,"battery":4.166,"signal":"-66"}15B86F2D013B2618

resp

第一个是我们服务器登录包,第二个是告诉服务器,C6指令要求服务器把协议内容转发给 G8100_C1
[C5|PC_C1|NOSP|ALIVE3600]
[C6|G8100_C1|
小视频抓拍 C28C0DB26D39331A{"msg_type":4,"timestamp":1587116614,"action":1,"http_url": "http://47.104.136.74:8080/upload","count":1}15B86F2D013B2618

图片抓拍 C28C0DB26D39331A{"msg_type":4,"timestamp":1587116614,"action":0,"http_url": "http://47.104.136.74:8080/upload","count":1}15B86F2D013B2618

[C5|PC_C1|NOSP|ALIVE3600]
[C6|G8100_C1|C28C0DB26D39331A{"msg_type":4,"timestamp":1587116614,"action":0,"http_url": "http://47.104.136.74:8080/upload","count":1}15B86F2D013B2618]

[C5|G8100_C1|NOSP|ALIVE3600]
C28C0DB26D39331A{"msg_type":4,"timestamp":1587116614,"action":0,"http_url": "http://szgpay.ticp.net:8123/upload.php","count":1}15B86F2D013B2618

心跳包

C28C0DB26D39331A{"msg_type":2,"timestamp":1587116614}15B86F2D013B2618

图片抓拍

  1. 服务器发送请求
    C28C0DB26D39331A{"msg_type":4,"timestamp":1587116614,"action":0,"http_url": "http://47.104.136.74:8080/upload","count":1}15B86F2D013B2618

  2. 设备发送数据
    +CAMTP: OK, "/data/cam/photo_00.jpg", 131958

SEND OK

  1. 服务器接收

POST /upload HTTP/1.1
Host: 47.104.136.74:8080
User-Agent: curl/7.44.0
Accept: /
Content-Length: 131795
Expect: 100-continue
Content-Type: multipart/form-data; boundary=------------------------
3412e9d0defd1b17

--------------------------3412e9d0defd1b17
Content-Disposition: form-data; name="upload"; filename="photo_00.jpg"
Content-Type: image/jpeg

--------------------------ee900b1976ca6bc1
Content-Disposition: form-data; name="dev_id"

356802050042281
--------------------------ee900b1976ca6bc1
Content-Disposition: form-data; name="firmware_version"

1.8.15
--------------------------ee900b1976ca6bc1
Content-Disposition: form-data; name="timestamp"

1592893303
--------------------------ee900b1976ca6bc1
Content-Disposition: form-data; name="battery"

4.179
--------------------------ee900b1976ca6bc1
Content-Disposition: form-data; name="signal"

-72dbm
--------------------------ee900b1976ca6bc1--

视频流发送

  1. 服务器发送请求
    C28C0DB26D39331A{"msg_type":4,"timestamp":1587116614,"action":1,"http_url": "http://47.104.136.74:8080/upload","count":1}15B86F2D013B2618

    重启

    C28C0DB26D39331A{"msg_type":50,"timestamp":1587116614}15B86F2D013B2618

  2. 设备发送数据

+CAMRV: OK, "/data/cam/photo_00.avi", 50, 10917056

  1. 服务器接收
    POST /upload HTTP/1.1
    Host: 47.104.136.74:8080
    User-Agent: curl/7.44.0
    Accept: /
    Content-Length: 10917794
    Expect: 100-continue
    Content-Type: multipart/form-data; boundary=------------------------531a5e07f7121f95

--------------------------531a5e07f7121f95
Content-Disposition: form-data; name="upload0"; filename="photo_00.avi"
Content-Type: application/octet-stream
...Z&

--------------------------53af0f23dbe67853
Content-Disposition: form-data; name="dev_id"

356802050033686
--------------------------53af0f23dbe67853
Content-Disposition: form-data; name="firmware_version"

1.8.15
--------------------------53af0f23dbe67853
Content-Disposition: form-data; name="timestamp"

1592891304
--------------------------53af0f23dbe67853
Content-Disposition: form-data; name="battery"

4.180
--------------------------53af0f23dbe67853
Content-Disposition: form-data; name="signal"

-63dbm
--------------------------53af0f23dbe67853--

固件编译开发

环境依赖 注意放到一行里面

sudo apt-get install build-essential chrpath coreutils cvs desktop-file-utils diffstat docbook-utils fakeroot g++ gawk gcc git git-core help2man libgmp3-dev libmpfr-dev libreadline6-dev libtool libxml2-dev make python-pip python-pysqlite2 quilt sed subversion texi2html texinfo unzip wget

错误:ubunut14.04 make install 提示 makeinfo is missing on your system;

输入makeinfo后,提示没有安装该命令,然后提示可以安装texinfo;

sudo apt-get install texinfo

注意不是textinfo,而是texinfo

在Ubuntu 18.04上编译Yocto,出现automake使用错误。

/**********************************************************************

  • help2man: can't get --help' info from automake-1.15 Try--no-discard-stderr' if option outputs to stderr Makefile:3687: recipe for target 'doc/automake-1.15.1' failed
  • 说明:
  • 在Ubuntu 18.04上编译Yocto,出现automake使用错误。
    *
  • 2018-6-13 深圳 宝安西乡 曾剑锋
    *********************************************************************/

一、参考文档:

1. compiling coreutils: help2man: can't get `--help' info from man/cp.td/cp Try `--no-discard-stderr'  
    http://albertcn.blog.163.com/blog/static/2094201452015229784694/

二、解决方法:

修改Makefile源代码:  fsl-release-bsp/imx6q-x11/tmp/work/x86_64-linux/automake-native/1.15-r0/build/Makefile
    [...省略]
    doc/aclocal-$(APIVERSION).1: $(aclocal_script) lib/Automake/Config.pm
            $(update_mans) aclocal-$(APIVERSION)
    doc/automake-$(APIVERSION).1: $(automake_script) lib/Automake/Config.pm
            $(update_mans) automake-$(APIVERSION) --no-discard-stderr      // 这里增加 --no-discard-stderr 
    [...省略]

WARNING: automake-1.14 is missing on your system._rainforest_c的博客-CSDN博客_automake-1.14 is missing on your system

合方圆高通下载工具安装 mdm9607

adb fastboot 命令安装

fastboot 下载适用于 Mac 的 SDK 平台工具 https://developer.android.google.cn/studio/releases/platform-tools

  1. 安装 brew cask install android-platform-tools

=> Downloading https://dl.google.com/android/repository/platform-tools_r29.0.5-darwin.zip
######################################################################## 100.0%
==> Verifying SHA-256 checksum for Cask 'android-platform-tools'.
==> Installing Cask android-platform-tools
==> Linking Binary 'adb' to '/usr/local/bin/adb'.
==> Linking Binary 'dmtracedump' to '/usr/local/bin/dmtracedump'.
==> Linking Binary 'etc1tool' to '/usr/local/bin/etc1tool'.
==> Linking Binary 'fastboot' to '/usr/local/bin/fastboot'.
==> Linking Binary 'hprof-conv' to '/usr/local/bin/hprof-conv'.
==> Linking Binary 'mke2fs' to '/usr/local/bin/mke2fs'.
🍺 android-platform-tools was successfully installed!

  1. 确认工具安装情况
    使用adb或者fastboot --version来确认安装情况


若安装失败,可以试一下在/etc/profile中配置

export PATH=~/android-sdks/platform-tools:~/android-sdks/tools:$PATH

hfy4G固件下载

adb reboot bootloader // 进入下载模式
fastboot flash system mdm9607-sysfs.ubi // 下载编译好的固件
fastboot reboot // 重启

四、Fastboot刷机命令

4.1 写入分区步骤以及命令
4.1.1 adb devices——查看手机是否连接上
4.1.2 adb reboot bootloader——将手机重启到Fastboot模式
4.1.3 fastboot devices——查看Fastboot模式下连接的手机

4.1.4 几种分区写入如下:(例如:system.img刷入的分区电脑上具体的路径)

fastboot flash system system.img
fastboot flash boot boot.img
fastboot flash radio radio.img

4.1.5 fastboot reboot ——Fastboot模式下重启手机

4.2 擦除分区命令

擦除分区前需要按照4.1.1——4.1.3步骤走一遍,擦除会将该分区恢复到使用前状态

fastboot erase system
fastboot erase boot

【准备工作】

首先需要准备好刷机包,可以是自己编译的,也可以是从别处拷贝的,但一定要确保刷机包适用于你的 Android 设备。然后解压刷机包,解压后我们可以得到 boot.img、recovery.img、system.img、bootloader 文件,正是这些文件构成了 Android 设备的系统。
让设备进入 fastboot 环境。有 2 种方法:
    执行命令 adb  reboot  fastboot
或者
    同时按住 增加音量 和 电源 键开机。

【命令执行流程】

在设备进入到 fastboot 环境后,根据需求执行下面的命令进行刷机:

fastboot flashing unlock # 设备解锁,开始刷机
fastboot flash boot boot.img # 刷入 boot 分区。如果修改了 kernel 代码,则应该刷入此分区以生效
fastboot flash recovery recovery.img # 刷入 recovery 分区
fastboot flash country country.img # 刷入 country 分区。这个分区是开发组自己划分的,别的 Android 设备上不一定有
fastboot flash system system.img # 刷入 system 分区。如果修改的代码会影响 out/system/ 路径下生成的文件,则应该刷入此分区以生效
fastboot flash bootloader bootloader # 刷入 bootloader
fastboot erase frp # 擦除 frp 分区,frp 即 Factory Reset Protection,用于防止用户信息在手机丢失后外泄
fastboot format data # 格式化 data 分区
fastboot flashing lock # 设备上锁,刷机完毕
fastboot continue # 自动重启设备

C28C0DB26D39331A{"msg_type":8,"update_version":"1.8.15" ,"timestamp":1587116614,"firmware_url":"http://47.104.136.74:8000/app_bin.tar.gz","firmware_md5":"3d98d098ae8ae3db888683f4593818c8"}15B86F2D013B2618

100
4.2
90
4.08
80
4
70
3.93
60
3.87
50
3.82
40
3.79
30
3.77
20
3.73
15
3.7
10
3.68
5
3.5

/************************Copyright(c)******************************* 
**                      深圳市合方圆科技开发有限公司
**                       G8100
**                       G8100    项目组 
**                       WebSite :www.szhfy.com.cn 
**------------------------------------------FileInfo------------------------------------------------------- 
** File name:          hw_custom.cpp
** Last modified Date:  2020-03-23
** Last Version:       1.0 
** Descriptions:             
**------------------------------------------------------------------------------------------------------ 
** Created by:        Steven.Liu
** Created date:      2020-03-23 
** Version:           1.0 
** Descriptions:      用户户硬件在休眠、唤醒时的定制化模块
**------------------------------------------------------------------------------------------------------ 
** Modified by: 
** Modified date: 
** Version: 
** Descriptions: 
*******************************************************************/
#include <unistd.h>     /*Unix 标准函数定义*/  
#include <sys/types.h>   
#include <sys/stat.h>     
#include <fcntl.h>      /*文件控制定义*/  
#include <sys/ioctl.h>
#include <linux/rtc.h>
#include <atfwd-daemon/log.h>

#include <atfwd-daemon/nvram.h>
#include <atfwd-daemon/hw_interface.h>
#include <atfwd-daemon/job_cmn.h>

//#include <qmi_cli_nas.h>
#include "hw_custom.h"
#include "lcd.h"

#include <string>
using namespace std;

#define	HW_RI_PULLUP_MS				100

const char *KERN_VERSION = "3.18.44";
const char *APP_VERSION  = "1.8.16";

uint32 sio_get_conn_mask()
{
	return 0;
}

bool sock_fast_reconn_broken()
{
	return true;
}


void hw_led_connected(uint8 on)
{
}

void hw_led_lte(uint8 on)
{
}

/*******************************************************************************
// 函数名称    : hw_sdhci
// 功能描述    : 启用SD卡功能
// 输入        : 
		enable    - true: 启用,false: 弃用

// output:
// return:  true - success, others - see the error code

*****************************************************************************/
bool hw_sdhci(bool bootup, bool enable)
{
	char 		cmd[128];

	if (enable)
	{		
		// 4GCAM100如果使用SD卡,就需要在一直开启电平转换电源 3.3V

		if (bootup)
		{
			hw_G8100_gpio_export(DEV_PIN_SD_PWR);			
		}
		hw_gpio_pull(DEV_PIN_SD_PWR, true);

		sprintf(cmd, "insmod /usr/lib/modules/3.18.44/kernel/drivers/mmc/host/sdhci-msm.ko");
		system(cmd);
		if (!bootup)
		{
			sprintf(cmd, "mount /dev/mmcblk0p1 /mnt/sdcard");
			system(cmd);
		}
		
		sprintf(cmd, "touch /mnt/sdcard/hfy_flag");
		system(cmd);
	}
	else if (!bootup)
	{
		sprintf(cmd, "umount /mnt/sdcard;rmmod sdhci-msm");
		system(cmd);

		// HFY 4GCAM100,如果拉高这个电压为2.852V,即为合方圆4GCAM100
		hw_gpio_pull(DEV_PIN_SD_PWR, false);
	}
	return true;
}

void hw_cust_voice_enable(bool enable)
{
	char  tmpbuf[64] =  {0};
	
	if (enable)
	{
	#ifdef  SSC50
		hw_gpio_pull_ext(2, true);
		// 由于拨打电话时,LCD屏幕必然是需要点亮和显示的
		hw_gpio_pull_ext(11, true);			// LCD
		hw_set_pwldo(2800000, PW_LDO_13);	// LCD Power as well
	#endif
	
		//hw_audio_voice_open(g_hw_cont.nvram_hw->aud_sample_rate, g_hw_cont.nvram_hw->aud_volume,
		//	g_hw_cont.nvram_hw->aud_volume_mic);
	}
	else
	{
	#ifdef  SSC50
		hw_gpio_pull_ext(2, false);
	#endif	
		//hw_audio_voice_close();
	}	
}
// 返回休眠配置
uint8 hw_cust_csclk()
{
	return m_nvram_hw.csclk;
}

bool hw_sun_charger()
{
	uint8  slave = 0x6B;
	uint8  reg[2]   = { 0x05, 0x06 };	
	uint8  value[2] = { 0x8F, 0xE6 };
	uint8  ret = 0;

	// 0x05寄存器说明
	// 		bit0: 0 = 50% 充电电流,1 = 20%充电电流
	//      bit7: 0 = Disable, 1 = Enable

	// 检查芯片ID, part id是否为SGM41511, D[6:3]=0010,D[2]=1
	if (iic_transfer_read(slave, 0x0B, &ret, 1) != 0 || (ret >> 2) != 0x5)
	{
		LOG_DEBUG("%s ID 0x%02x err", __func__, ret);
		return false;
	}
	
	ret = iic_transfer_write(slave, reg[0], value[0], 1);
	ret |= iic_transfer_write(slave, reg[1], value[1], 1);
	if (ret == 0)
	{
		LOG_DEBUG("%s OK", __func__);
	}
	else
	{
		LOG_DEBUG("%s ERR", __func__);
	}
	return (ret == 0);
}


void hw_cust_deep_sleep()
{
	//qmi_cli_nas_indi_reg_req(false);
	
	// ****************** Only for 4GCAM100 board
	// 用户配置唤醒是RI为拉高模式, 休眠时需要拉低
	hw_gpio_pull(DEV_PIN_RI, false);
	
	// ***************** End of 4GCAM100 board
}

void hw_cust_wakeup(bool result)
{
	//qmi_cli_nas_indi_reg_req(true);
	// ****************** Only for 4GCAM100 board
	hw_gpio_pull(DEV_PIN_RI, true);
	// ***************** End of 4GCAM100 board
}

void hw_cust_init()
{
	char cmd[128] = { 0 };
	// DTR为低触发
	sprintf(cmd, "insmod /lib/modules/3.18.44/kernel/drivers/tty/serial/msm_serial_hs.ko dtr_irq_trigger=%d", 
		0);
	system(cmd);
	
	hw_led_connected(0);
	hw_led_lte(0);
	// ****************** Only for 4GCAM100 board
	hw_spi_enable(SPI_1, true, true);
	// 是否需要加载SD卡
	//hw_sdhci(true, true);

	hw_G8100_gpio_export(DEV_PIN_SD_PWR);
	if (!hw_G8100_gpio_export(DEV_PIN_RI))
	{
		LOG_ERROR("%s Failed to export RI", __func__);
	}
	// 用户配置唤醒是RI为拉高模式,上电时需要保持拉高
	hw_gpio_pull(DEV_PIN_RI, true);

	// Kick off Sun charger
	// 加载I2C内核模块
	system("insmod /lib/modules/3.18.44/kernel/drivers/i2c/busses/i2c-msm-v2.ko");
	job_queue_put(JOB_SUN_CHARGER, NULL);	
	
	// ***************** End of 4GCAM100 board
}


定时器和休眠 注意事项

  1. timer_init(int timer_interval);

这里的 timer_interval 代表的时钟计时精度,
比如10 ms 的话可能用gettimeofday进行计时
如果是10s的精度的话,可能直接采用time进行计时

  1. extern void timer_start(TIMER_ID id, int delay_ms, timer_callback cb, void *pdata);

// 系统定义APP使用到的Timer ID
typedef enum
{

TIMER_ID_SOCKET_0,
TIMER_ID_SOCKET_10 = TIMER_ID_SOCKET_0 + 10,
// 在这里进行用户APP的TIMER_ID的定义 ,从11开始
TIMER_ID_PULSE,

} TIMER_ID_ENUM;

休眠注意事项


3.1 系统休眠管理
大部分休眠都遵循同样的原理,就是需要休眠时,系统每个外设都要满足条件进入休眠最后
才能休眠,只要有一个设备或者软件模块没有休眠,哪就不能进入。
设置 m_nvram_hw.csclk 为 1,所有外设和软件模块都允许休眠时,我们内部调度线程会主
动调用休眠函数进入休眠状态,这个时候,用户的代码都处于冻结状态,直到系统有唤醒动
作(定时唤醒、硬件中断)才会重新唤醒各部分代码。
比如:要让你自己的拍照上传也支持休眠管理,哪就需要实现休眠模块需要支持的锁机制,
锁机制涉及的回调钩子函数结构如下:

void do_timer_resume(){
	// 获取休眠锁
	sleep_acquire(m_sleep_hdlr_keypad);


}
typedef struct {
	// 休眠唤醒时调用此函数
	int (* resume) (void *context){
			LOG_DEBUG("%s", __func__);
		// 在这里执行定时唤醒后的操作
		do_timer_resume();

	return SLEEP_ERR_NO;
	}

	// 系统进入休眠前调用此函数,如果有模块没有准备好进入挂起,返回 SLEEP_ERR_NOT_READY
	int (* suspend) (void *context){
		return SLEEP_ERR_NO;
	}

	// 1. 从多个链接计算出在多少秒以后需要唤醒系统,目的是使得在休眠状态下,
	// 可以正常发出心跳包和服务器保持链接
	// 2. 定时拍照的时候,要计算出休眠多少秒
	int (* get_duration) (void *context);
	//
	static int _cont_get_duration(void *context)
	{	
		// 这里定义休眠的持续事件=休眠后,下次唤醒的超时时间。
		// int	    min_timeout = SLEEP_MAX_SLEEP_TIMEOUT;
		// 休眠之前  : 下次唤醒的事件  间隔事件
		return min_timeout;
	}

	// 需要获取最大唤醒超时,达到唤醒超时时,必须执行 sleep_reset() 清除状态
	// 最大唤醒超时是从那里开始计算的? 从唤醒的时刻开始计算
	int (* get_wakeup_timeout) (void *context);
	
	static int _cont_get_wakeup_timeout(void *context)
	{
		// 唤醒的持续 比如:拍照5s完成 ,但是上传10后依然没有成功,那么当到达最大的task的 SLEEP_MAX_WAKEUP_TIMEOUT,强制释放,强制进入休眠 :

		return SLEEP_MAX_WAKEUP_TIMEOUT;
	}

	void *context;
} sleep_callback_struct;

关键函数调用:
1) int sleep_create_handle(sleep_callback_struct *callback)

需 要 纳 入 休 眠 管 理 机 制 的 模 块 调 用 此 函 数 , 同 时 函 数 模 块 也 需 要 实 现sleep_callback_struct 相关的休眠回调函数。

2) bool sleep_acquire(int handle)

需要休眠管理的模块在唤醒后,如果需要在本次唤醒执行一些业务,哪必须先调用此函
数获取休眠锁,避免系统没有经过模块的允许就进入休眠。

3) bool sleep_release(int handle)

在模块执行完本次唤醒需要执行的业务动作后,调用此函数后,系统才有可能进入休眠。

4) void sleep_close_handle(int handle)

模块放弃休眠管理机制调用此函数。
  1. get_duration
  2. _cont_suspend
`