# cellular_device **Repository Path**: code_hunter/cellular_device ## Basic Information - **Project Name**: cellular_device - **Description**: 基于RT-Thread实时操作系统的蜂窝模组驱动库 - **Primary Language**: C - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-02-19 - **Last Updated**: 2022-02-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # cellular_device #### 介绍 基于RT-Thread实时操作系统的蜂窝模组驱动库 #### 软件架构 frame Cellular组件结构体: ```c /*cellular device*/ struct cellular_device { #ifdef CELLULAR_USING_CMUX struct cmux cmux; #endif /*CELLULAR_USING_CMUX*/ /*cellular info*/ struct module_info module_info; /*拨号信息*/ struct dial_info dial_info; /*当前接入的网络信息*/ struct cell_access_info cell_info; #ifdef CELLULAR_USING_SLEEP_CTRL /*休眠控制*/ struct cellular_sleep_ctrl sleep_ctrl; #endif /*CELLULAR_USING_SLEEP_CTRL*/ /** * @brief Processing status callback function * @param status Processing status: 0-failed,!0 success * @param args user args give by user * * @return int * !0: Interrupt the current process and exit the process * 0: Continue the current process */ int (*proc_cb)(int status, void *args); #ifdef CELLULAR_USING_RING /*振铃回调,可能会在中断中调用,注意该回调的实现*/ int (*ring_cb)(cellular_device_t dev, int ind); #endif /*CELLULAR_USING_RING*/ void *usr_args; //user args used in proc_cb const struct celluar_ops *ops; //驱动接口 struct cellular_ppp ppp; //PPP rt_slist_t list; }; ``` ##### 1. 应用层接口 - `cellular_find_attach` 查找模组 - `cellular_module_power` 模组开关机 - `cellular_module_wakeup_lock` 唤醒锁,低功耗下发送AT指令或者数据前调用 - `cellular_module_wakeup_unlock` 释放唤醒锁,低功耗下处理完AT指令或者发送数据完成后调用,与`cellular_module_wakeup_lock `配对使用 - `cellular_module_sleep` 休眠模组,应用层循环调用,内部根据当前唤醒锁占用情况选择是否休眠模组 - `cellular_module_reset` 复位模组 - `cellular_module_init` 初始化模组,模组驱动 - `cellular_check_sim` 检测SIM卡 - `cellular_module_setup` 配置模组,例如APN、网络模式等 - `cellular_check_network` 检查网络状态 - `cellular_data_mode` 进入或者退出数据模式(ATD) - `cellular_switch_rf` 开关射频 - `cellular_switch_sim` 切换SIM卡 - `cellular_hangup_call` 挂断电话 - `cellular_sms_send` 发送短信 - `cellular_sms_recv` 接收短信 - `cellular_sms_delete` 删除短信 - ... ##### 2. 驱动层接口 驱动接口结构: ```c struct celluar_ops { int (*init)(cellular_device_t dev); /** * @brief control cellular module callback * * @param dev pointer to cellular device * @param cmd reference to enum cellular_cmd_t * @param port the port to send control cellular module * @param timeout the timeout in seconds * @param args control args * @return int * 0: success * !0: error */ int (*control)(cellular_device_t dev, cellular_cmd_t cmd, int port, uint32_t timeout, void *args); const char *(*get_port_name)(cellular_device_t dev, int port); uint32_t (*get_port_speed)(cellular_device_t dev, int port); #ifdef CELLULAR_USING_SMS /** * @brief send sms * * @param dst_number destination phone number * @param content sms content * @param length sms content length * @param encoding sms encoding, reference to enum sms_encode_t * @param csca sms center number * * @return int * >=0: success * <0: failed */ int (*sms_send)(char *dst_number, char *content, int length, sms_encode_t encoding, char *csca); /** * @brief receive sms * * @param recv_cb * * @return int * >=0: sms index,Can be used as an input parameter of the SMS delete function * <0: no sms */ int (*sms_recv)(sms_rcv_callback_t recv_cb); /** * @brief delete sms * * @param index sms index * * @return int * >=0: success * <0: failed */ int (*sms_delete)(int index); #endif /*CELLULAR_USING_SMS*/ }; ``` 模组驱动需实现如下接口,并且调用`cellular_device_register`将驱动注册到cellular组件中 - `init` 硬件初始化 - `control` 控制接口,应用层所有对模组的操作都通过该接口传递给模组驱动 - `sms_send` - `sms_recv` - `sms_delete` 短信相关接口是后加入的,本来短信收发等功能是通过标准3GPP标准AT实现的,但是某些模组不按照3GPP标准做,尤其是CDMA网络下采用的是3GPP2标准,除了移远之外,其他厂家(美格/龙尚)都自定义AT指令处理CDMA短信。 ##### 3. 应用层处理流程 ![flow](./.gitee/figure/flow.png) #### Change log ##### commit on 2018-08-29 完善EC600S驱动 --- ##### commit on 2018-08-28 1. 优化完善休眠框架 2. 修复部分bug