依据上述函数的原型定义及功能说明,我们在os_adapter.c文件编码实现它们,相关伪代码实现如下:
#if SUPPORT_PPPHTTY os_open_tty(const CHAR *pszTTYName){//* 如果你的系统存在多个ppp拨号终端,那么pszTTYName参数用于区分打开哪个串口//* 在这里添加串口打开代码将连接拨号终端的串口打开…………//* 如果目标系统只有一个拨号终端,那么这里返回的tty句柄x值为0,如果目标系统存在多个模块,这里需要你根据参数//* pszTTYName指定的名称来区分是哪个设备,并据此返回不同的tty句柄,句柄值x应从0开始自增,步长为1return x;}void os_close_tty(HTTY hTTY){//* 在这里添加串口关闭代码,关闭哪个串口的依据是tty设备句柄hTTY……}INT os_tty_send(HTTY hTTY, UCHAR *pubData, INT nDataLen){//* 在这里添加数据发送代码,其实就是调用对应的串口驱动函数发送数据到拨号终端,如果存在多个tty设备,请依据参数hTTY来//* 确定需要调用哪个串口驱动函数发送数据,返回值为实际发送的字节数……}INT os_tty_recv(HTTY hTTY, UCHAR *pubRcvBuf, INT nRcvBufLen, INT nWaitSecs){//* 同上,在这里添加数据读取代码,其实就是调用对应的串口驱动函数从拨号终端读取数据,如果存在多个tty设备,请依据参数hTTY来//* 确定需要调用哪个串口驱动函数读取数据,返回值为实际读取到的字节数……}void os_modem_reset(HTTY hTTY){//* 在这里添加拨号终端的复位代码,如果你的目标板不支持软件复位模块,可以省略这一步//* 复位模块的目的是解决绝大部分的因软件问题产生的故障……}#endif
参照上述伪代码,依据目标系统具体情况编写相应功能代码即可 。注意,上述代码能够正常工作的关键是目标系统的串口驱动必须能够正常工作且健壮、可靠 。因为tty层封装的其实就是操作ppp拨号终端的串口驱动代码,tty只是做了一层简单封装罢了 。os_adapter.c文件中关于ppp部分还有如下几项定义需要根据你的实际目标环境进行配置:
#if SUPPORT_PPP//* 连接ppp拨号终端的串口名称,有几个模块,就指定几个,其存储的单元索引应等于os_open_tty()返回的对应串口的tty句柄值const CHAR *or_pszaTTY[PPP_NETLINK_NUM] = { …… /* 如"串口1", "串口2"等 */ }; //* 指定ppp拨号的apn、用户和密码,系统支持几路ppp,就需要指定几组拨号信息//* ST_DIAL_AUTH_INFO结构体保存这几个信息,该结构体的详细内容参见协议栈源码ppp/ppp.h文件//* 这里设置的apn等拨号认证信息会替代前面说过的APN_DEFAULT、AUTH_USER_DEFAULT、AUTH_PASSWORD_DEFAULT等缺省设置const ST_DIAL_AUTH_INFO or_staDialAuth[PPP_NETLINK_NUM] = {{ "4gnet", "card", "any_char" },//* 注意ppp账户和密码尽量控制在20个字节以内,太长需要需要修改chap.c//* 中send_response()函数的szData数组容量及pap.c中pap_send_auth_request()函数的//* ubaPacket数组的容量,确保其能够封装一个完整的响应报文/* 系统存在几路ppp链路,就在这里添加几路拨号认证信息 */}; //* ppp链路协商的初始协商配置信息,协商成功后这里保存最终的协商结果,ST_PPPNEGORESULT结构体的详细说明参见下文ST_PPPNEGORESULT o_staNegoResult[PPP_NETLINK_NUM] = {{{ 0, PPP_MRU, ACCM_INIT,{ PPP_CHAP, 0x05 /* CHAP协议,0-4未使用,0x05代表采用MD5算法 */ }, TRUE, TRUE, FALSE, FALSE },{ IP_ADDR_INIT, DNS_ADDR_INIT, DNS_ADDR_INIT, IP_ADDR_INIT, MASK_INIT }, 0},/* 系统存在几路ppp链路,就在这里添加几路的协商初始值,如果不确定,可以将上面预定义的初始值直接复制过来即可 */};#endif
上面给出的代码做了几件事情:1)指定tty设备连接的串口名称;2)指定拨号认证信息:apn、用户和密码;3)指定ppp链路协商初始值;
总之,你的目标系统连接了几个拨号终端,这几件事情就要针对特定的终端分别做一遍,单独指定 。这里需要重点说明的是ppp链路协商配置信息 。这些信息由ST_PPPNEGORESULT结构体保存(参见negotiation_storage.h文件):
经验总结扩展阅读
- 2 onps栈移植说明——编译器及os适配层移植
- 1 onps栈移植说明——onps栈的配置及裁剪
- 亲爱的客栈杨紫乔欣是哪期?
- <一>从指令角度了解函数堆栈调用过程
- stm32h750移植lvgl
- 3 Python全栈工程师之从网页搭建入门到Flask全栈项目实战 - 入门Flask微框架
- 都卷Java,你看看你得学多少技术栈才能工作!
- flutter系列之:flutter中可以建索引的栈布局IndexedStack
- 官栈花胶多久吃一次 官栈即食花胶要加热吗
- 官栈即食花胶是不是真的 官栈即食花胶有激素吗