文章目录
这篇文章主要记录lora原型基站开发的过程,基站支持对接市场上默认的 LoRaWAN Server,支持有线口回传,支持4G回传。
架构
- 步骤
- CPU 移植运行 OpenWRT 系统,有线口正常,这块我是基于现成的,此处省略
- 调试 SX1301 芯片驱动
- 移植 Semtech 公司开源的
packet_forwarder
到 OpenWRT 平台,对接通用的 LoRaWAN Server - 调试移植4G模块驱动
- 硬件组成:CPU 使用 SOC AR95xx 系列芯片,通过 SPI 接口跟基带芯片通信,LoRa 基带射频使用 Semtech 公司的多路芯片 SX1301 + SX1255,4G 模组使用龙尚 U8300
- 软件:平台 OpenWRT ,版本 Attitude Adjustment 12.09,内核 3.3.8
- 报文流程
- AR95xx 通过
HAL
模块的 SPI 读写操作控制 SX1301 接收终端发送的报文,经过packet forwarder
模块封装打包后走有线口、WIFI 或 4G 通路,通过UDP方式发送给后台 LoRaWAN Server。
- AR95xx 通过
LoRa 芯片驱动调试
AR9531 可以通过 USB 或 SPI 驱动 SX1301,USB方式需要FTDI转 SPI 芯片方式网上教程较多。由于板子限制,这里采用 SPI 方式,由于板子的 SPI 控制器已经用来驱动 flash,控制 SX1301 有两种方式:
- GPIO 模拟 SPI 来控制(软 SPI )
- 实际的硬件 SPI 通过片选控制
为提高调试效率,先修改Makefile的 cmdline
字段波特率,以串口 ttyS0 为例下面命令可以查找包含 ttyS0 对应行,使用 VIM 修改成 115200。
grep ttyS0 ./target/linux/ar71xx/image/Makefile
GPIO 模拟 SPI
参考
https://randomcoderdude.wordpress.com/2013/08/15/spi-over-gpio-in-openwrt/
- GPIO 管脚使用
先确认 GPIO 管脚是否可用,是否能拉高拉低
cat /sys/kernel/debug/gpio # 查看 GPIO 调试信息
cd /sys/class/gpio
echo 2 > export # 把 GPIO 管脚 2 导出到用户空间
cd gpio2
echo out > direction # 配置成输出
echo 0 > value # 输入值 0
cat value # 查看值是否改变
echo 1 > value # 输入值 1
cat value
如果CPU用到对应 GPIO 口存在 JTAG 复用的话,芯片初始化 GPIO 时把 JTAG 关掉
//文件:linux-3.3.8/arch/mips/ath79/gpio.c
//函数:ath79_gpio_init
if (soc_is_qca953x())
ath79_gpio_function_enable(AR934X_GPIO_FUNC_JTAG_DISABLE);
-
移植编译内核模块
OpenWRT 内核默认就已经有 GPIO 模拟 SPI 的驱动模块(
spi-gpio
、spi-bitbang
),另外有spi-dev
设备层通用驱动,用来导出到用户空间,编译内核前把这三个模块打开。spi-dev
模块问题是不大方便调试,建议下载移植spi-gpio-custom
模块用于动态加载软 SPI 模块,根据对应 GPIO 管脚加载。
# 参数说明 * bus0 These four arguments can be arrays of * bus1 1-8 unsigned integers as follows: * bus2 * bus3 <id>,<sck>,<mosi>,<miso>,<mode1>,<maxfreq1>,<cs1>,... * where: * * <id> ID to used as device_id for the corresponding bus (required) * <sck> GPIO pin ID to be used for bus SCK (required) * <mosi> GPIO pin ID to be used for bus MOSI (required*) * <miso> GPIO pin ID to be used for bus MISO (required*) * <modeX> Mode configuration for slave X in the bus (required) * (see /include/linux/spi/spi.h) * <maxfreqX> Maximum clock frequency in Hz for slave X in the bus (required) * <csX> GPIO pin ID to be used for slave X CS (required**) insmod spi-gpio-custom bus0=1,14,15,16,0,1000000,4 # 加载模块 ls /dev/ | grep spidev1.0 # 确认 spidev 设备是否出现,存在则加载成功
硬件SPI片选控制
待完善,主要修订代码 dev-m25p80.c,
+static struct ath79_spi_controller_data ath79_spi_cdata0 =
+{
+ .cs_type = ATH79_SPI_CS_TYPE_INTERN