Compare commits
75
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
807b045b75 | ||
|
|
6f4774f6b8 | ||
|
|
de5759b392 | ||
|
|
2b18765563 | ||
|
|
03a6d86a3a | ||
|
|
729bbeb60e | ||
|
|
33545b63e1 | ||
|
|
6c64421336 | ||
|
|
dda9d09f2a | ||
|
|
14f2be3053 | ||
|
|
b7607a7a1b | ||
|
|
c07cd00f2f | ||
|
|
20da80f6c2 | ||
|
|
c7e3eb2800 | ||
|
|
9acdd0609a | ||
|
|
66529637a3 | ||
|
|
62cc15c3d4 | ||
|
|
98e6935d9a | ||
|
|
0c6d861620 | ||
|
|
f6c2568a75 | ||
|
|
ef1c41b500 | ||
|
|
9a7b89ca82 | ||
|
|
80035d5208 | ||
|
|
ab7ce2e082 | ||
|
|
f5aca7d5cf | ||
|
|
c3e0c7a66a | ||
|
|
2898bdfa15 | ||
|
|
31dcb5aa69 | ||
|
|
a1fc87dc97 | ||
|
|
009ddfd895 | ||
|
|
222dcb789c | ||
|
|
6b016e1181 | ||
|
|
712d37061a | ||
|
|
dfecadac56 | ||
|
|
c09bd57408 | ||
|
|
ec772ba9e3 | ||
|
|
51b96825a3 | ||
|
|
274ee8922e | ||
|
|
8c12c0e755 | ||
|
|
1e5f8052e5 | ||
|
|
10c72585de | ||
|
|
c3e47b0fae | ||
|
|
60033f36a7 | ||
|
|
582cbd57af | ||
|
|
34b851fab7 | ||
|
|
8ffcb8b048 | ||
|
|
b0067e53a6 | ||
|
|
3073a2767b | ||
|
|
7818a754c6 | ||
|
|
b99d0bfca0 | ||
|
|
3dedebbe79 | ||
|
|
22417853dd | ||
|
|
633f6dff37 | ||
|
|
1192f7b4cd | ||
|
|
871c9882b4 | ||
|
|
04a75154c5 | ||
|
|
f1e1ddf48f | ||
|
|
09cc2ce347 | ||
|
|
0c270df599 | ||
|
|
8be194a410 | ||
|
|
ea5d6e0962 | ||
|
|
7edb8cb3f0 | ||
|
|
6299d8982d | ||
|
|
8af1439087 | ||
|
|
95041a8395 | ||
|
|
5cabf2ab65 | ||
|
|
638b24a6a1 | ||
|
|
2b74942521 | ||
|
|
597ea2c7cd | ||
|
|
6d08ee216a | ||
|
|
d87a4434c7 | ||
|
|
c27d6fc455 | ||
|
|
0701eb6f43 | ||
|
|
ffc9f22694 | ||
|
|
c7898003c0 |
@@ -0,0 +1,440 @@
|
|||||||
|
'''
|
||||||
|
@brief This is an example plugin, can receive and send data
|
||||||
|
@author
|
||||||
|
@date
|
||||||
|
@license LGPL-3.0
|
||||||
|
'''
|
||||||
|
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QTextEdit, QPushButton, QLabel, QScrollArea, QSplitter
|
||||||
|
from PyQt5.QtCore import Qt, pyqtSignal
|
||||||
|
from PyQt5.QtGui import QFont, QTextCursor
|
||||||
|
from struct import Struct
|
||||||
|
try:
|
||||||
|
import utils_ui
|
||||||
|
from plugins.base import Plugin_Base
|
||||||
|
from conn import ConnectionStatus
|
||||||
|
from i18n import _
|
||||||
|
from widgets import statusBar
|
||||||
|
except ImportError:
|
||||||
|
from COMTool import utils_ui
|
||||||
|
from COMTool.plugins.base import Plugin_Base
|
||||||
|
from COMTool.i18n import _
|
||||||
|
from COMTool.conn import ConnectionStatus
|
||||||
|
from COMTool.widgets import statusBar
|
||||||
|
|
||||||
|
class Plugin(Plugin_Base):
|
||||||
|
id = "DEIFEI"
|
||||||
|
name = _("DUIFEI")
|
||||||
|
showReceiveDataSignal = pyqtSignal(str)
|
||||||
|
|
||||||
|
def onInit(self, config):
|
||||||
|
'''
|
||||||
|
init params
|
||||||
|
'''
|
||||||
|
default = {
|
||||||
|
"version": 1,
|
||||||
|
"customSendItems": [
|
||||||
|
{
|
||||||
|
"caption": "自检",
|
||||||
|
"icon": "fa5.question-circle",
|
||||||
|
"data": "5A 54 E1 DD 00 BE 02 5A FE"
|
||||||
|
},
|
||||||
|
# {
|
||||||
|
# "caption": "数据发送测试 - 1",
|
||||||
|
# "icon": "fa5.play-circle",
|
||||||
|
# "data": ""
|
||||||
|
# },
|
||||||
|
# {
|
||||||
|
# "caption": "数据发送测试 - 2",
|
||||||
|
# "icon": "fa5.play-circle",
|
||||||
|
# "data": ""
|
||||||
|
# },
|
||||||
|
{
|
||||||
|
"caption": "装订 - 【主】反拦截小功率",
|
||||||
|
"icon": "fa5.play-circle",
|
||||||
|
"data": "5A 54 E3 DD 77 11 00 00 00 48 06 5A FE"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"caption": "装订 - 【主】反拦截全功率",
|
||||||
|
"icon": "fa5.play-circle",
|
||||||
|
"data": "5A 54 E3 DD 66 11 00 00 00 37 06 5A FE"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"caption": "装订 - 【主】反拦截静默",
|
||||||
|
"icon": "fa5.play-circle",
|
||||||
|
"data": "5A 54 E3 DD 88 11 00 00 00 59 06 5A FE"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"caption": "遥测 - 【主】反拦截",
|
||||||
|
"icon": "fa5.play-circle",
|
||||||
|
"data": "5A 54 E6 DD 99 00 5C 03 5A FE"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"caption": "点名 - 【主】反拦截",
|
||||||
|
"icon": "fa5.play-circle",
|
||||||
|
"data": "5A 54 E5 DD 77 00 39 03 5A FE"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"caption": "装订 - 【从】拦截小功率",
|
||||||
|
"icon": "fa5.play-circle",
|
||||||
|
"data": "5A 54 E3 DD 77 00 00 00 00 37 06 5A FE"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"caption": "装订 - 【从】拦截大功率",
|
||||||
|
"icon": "fa5.play-circle",
|
||||||
|
"data": "5A 54 E3 DD 66 00 00 00 00 26 06 5A FE"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"caption": "装订 - 【从】拦截静默",
|
||||||
|
"icon": "fa5.play-circle",
|
||||||
|
"data": "5A 54 E3 DD 88 00 00 00 00 48 06 5A FE"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"caption": "遥测 - 【从】拦截",
|
||||||
|
"icon": "fa5.play-circle",
|
||||||
|
"data": "5A 54 F6 DD 99 00 6C 03 5A FE"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"caption": "点名 - 【从】拦截",
|
||||||
|
"icon": "fa5.play-circle",
|
||||||
|
"data": "5A 54 F5 DD 77 00 49 03 5A FE"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
self.config = config
|
||||||
|
for k in default:
|
||||||
|
if not k in self.config:
|
||||||
|
self.config[k] = default[k]
|
||||||
|
|
||||||
|
def onConnChanged(self, status:ConnectionStatus, msg:str):
|
||||||
|
print("-- connection changed: {}, msg: {}".format(status, msg))
|
||||||
|
|
||||||
|
def onWidgetMain(self, parent):
|
||||||
|
'''
|
||||||
|
main widget, just return a QWidget object
|
||||||
|
'''
|
||||||
|
self.mainWidget = QSplitter(Qt.Vertical)
|
||||||
|
# receive widget
|
||||||
|
self.receiveWidget = QTextEdit("")
|
||||||
|
font = QFont('Consolas, DejaVu Sans Mono, Courier New, monospace, Microsoft YaHei', 10)
|
||||||
|
self.receiveWidget.setFont(font)
|
||||||
|
self.receiveWidget.setLineWrapMode(QTextEdit.NoWrap)
|
||||||
|
# clear button
|
||||||
|
self.clearBtn = QPushButton("")
|
||||||
|
utils_ui.setButtonIcon(self.clearBtn, "mdi6.broom")
|
||||||
|
# send scroll
|
||||||
|
self.customSendScroll = QScrollArea()
|
||||||
|
self.customSendScroll.setMinimumHeight(20)
|
||||||
|
self.customSendScroll.setWidgetResizable(True)
|
||||||
|
self.customSendScroll.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
|
||||||
|
self.customSendScroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
|
||||||
|
cutomSendItemsWraper = QWidget()
|
||||||
|
self.customSendScroll.setWidget(cutomSendItemsWraper)
|
||||||
|
|
||||||
|
# -- wrapper widget
|
||||||
|
cutomSendItemsWraper0 = QWidget()
|
||||||
|
cutomSendItemsWraper0.setProperty("class", "scrollbar2")
|
||||||
|
layout0 = QVBoxLayout()
|
||||||
|
layout0.setContentsMargins(0,8,0,0)
|
||||||
|
cutomSendItemsWraper0.setLayout(layout0)
|
||||||
|
layout0.addWidget(self.customSendScroll)
|
||||||
|
customSendItemsLayoutWrapper = QVBoxLayout()
|
||||||
|
customSendItemsLayoutWrapper.setContentsMargins(0,0,0,0)
|
||||||
|
cutomSendItemsWraper.setLayout(customSendItemsLayoutWrapper)
|
||||||
|
|
||||||
|
# -- items container
|
||||||
|
self.customItems = QWidget()
|
||||||
|
self.customSendItemsLayout = QVBoxLayout()
|
||||||
|
self.customSendItemsLayout.setContentsMargins(0,0,0,0)
|
||||||
|
self.customItems.setLayout(self.customSendItemsLayout)
|
||||||
|
customSendItemsLayoutWrapper.addWidget(self.customItems)
|
||||||
|
customSendItemsLayoutWrapper.addStretch(0)
|
||||||
|
|
||||||
|
# add widgets
|
||||||
|
self.mainWidget.addWidget(self.receiveWidget)
|
||||||
|
self.mainWidget.addWidget(self.clearBtn)
|
||||||
|
self.mainWidget.addWidget(cutomSendItemsWraper0)
|
||||||
|
self.mainWidget.setStretchFactor(0, 2)
|
||||||
|
self.mainWidget.setStretchFactor(1, 1)
|
||||||
|
self.mainWidget.setStretchFactor(2, 11)
|
||||||
|
|
||||||
|
# event
|
||||||
|
def clearReceived():
|
||||||
|
self.receiveWidget.clear();self.statusBar.clear()
|
||||||
|
self.clearBtn.clicked.connect(clearReceived)
|
||||||
|
return self.mainWidget
|
||||||
|
|
||||||
|
def onWidgetStatusBar(self, parent):
|
||||||
|
self.statusBar = statusBar(rxTxCount=True)
|
||||||
|
return self.statusBar
|
||||||
|
|
||||||
|
def onUiInitDone(self):
|
||||||
|
'''
|
||||||
|
UI init done, you can update your widget here
|
||||||
|
this method runs in UI thread, do not block too long
|
||||||
|
'''
|
||||||
|
newItems = []
|
||||||
|
print(self.config["customSendItems"])
|
||||||
|
for item in self.config["customSendItems"]:
|
||||||
|
print(item)
|
||||||
|
item = self.insertSendItem(item, load=True)
|
||||||
|
newItems.append(item)
|
||||||
|
self.config["customSendItems"] = newItems
|
||||||
|
self.showReceiveDataSignal.connect(self.showReceivedData)
|
||||||
|
# frame struct
|
||||||
|
self.structSelfTestRsp = Struct("<BB B BBBbbb BbBBB H")
|
||||||
|
self.structStatusCheckRsp = Struct("<BB Q HIII IBBBBI BBHH HHHIIIIII i II 4s IIII d Q dBB dB H B 3s BBBbbb BbBBB 2s")
|
||||||
|
self.structFljData = Struct("<dddd IHI fff fff")
|
||||||
|
self.structLjData = Struct("<IHI ffff IHI fff fff fff IHI fff fff fff IHI fff fff fff I")
|
||||||
|
self.structSysInfo = Struct("<IHI H B I B fff fff fff")
|
||||||
|
|
||||||
|
def insertSendItem(self, item = None, load = False):
|
||||||
|
caption = item["caption"]
|
||||||
|
itemWidget = QWidget()
|
||||||
|
layout = QHBoxLayout()
|
||||||
|
layout.setContentsMargins(0,0,0,0)
|
||||||
|
itemWidget.setLayout(layout)
|
||||||
|
send = QPushButton("")
|
||||||
|
label = QLabel(caption)
|
||||||
|
if (not "icon" in item) or not item["icon"]:
|
||||||
|
item["icon"] = "fa.send"
|
||||||
|
utils_ui.setButtonIcon(send, item["icon"])
|
||||||
|
send.setProperty("class", "smallBtn")
|
||||||
|
def sendCustomData(idx):
|
||||||
|
self.sendCustomItem(self.config["customSendItems"][idx])
|
||||||
|
send.clicked.connect(lambda: sendCustomData(self.customSendItemsLayout.indexOf(itemWidget)))
|
||||||
|
layout.addWidget(label)
|
||||||
|
layout.addWidget(send)
|
||||||
|
self.customSendItemsLayout.addWidget(itemWidget)
|
||||||
|
if not load:
|
||||||
|
self.config["customSendItems"].append(item)
|
||||||
|
return item
|
||||||
|
|
||||||
|
def showReceivedData(self, text: str):
|
||||||
|
curScrollValue = self.receiveWidget.verticalScrollBar().value()
|
||||||
|
self.receiveWidget.moveCursor(QTextCursor.End)
|
||||||
|
endScrollValue = self.receiveWidget.verticalScrollBar().value()
|
||||||
|
self.receiveWidget.insertPlainText(text)
|
||||||
|
if curScrollValue < endScrollValue:
|
||||||
|
self.receiveWidget.verticalScrollBar().setValue(curScrollValue)
|
||||||
|
else:
|
||||||
|
self.receiveWidget.moveCursor(QTextCursor.End)
|
||||||
|
|
||||||
|
def onReceived(self, data : bytes):
|
||||||
|
'''
|
||||||
|
call in receive thread, not UI thread
|
||||||
|
'''
|
||||||
|
self.statusBar.addRx(len(data))
|
||||||
|
## Apply data validation check
|
||||||
|
if len(data) < 7:
|
||||||
|
self.showReceiveDataSignal.emit("\n### Wrong data format: wrong frame header/tail\n")
|
||||||
|
return
|
||||||
|
|
||||||
|
dataLen = data[-3]
|
||||||
|
if data[0] != 0x5A or data[1] != 0x54 or data[-1] != 0xFE or data[-2] != 0x5A:
|
||||||
|
self.showReceiveDataSignal.emit("\n### Wrong data format: wrong length\n")
|
||||||
|
|
||||||
|
checkSum = 0
|
||||||
|
for i in data[2:-4]:
|
||||||
|
checkSum += i
|
||||||
|
if checkSum & 0xFF != data[-4]:
|
||||||
|
self.showReceiveDataSignal.emit("\n### Wrong data format: wrong check sum\n")
|
||||||
|
|
||||||
|
## Eval data
|
||||||
|
data = data[2:-5].replace(b'\x00\x54\xFE', b'\x54\xFE')
|
||||||
|
# self.printFrame(data)
|
||||||
|
if data[0] == 0xE1:
|
||||||
|
# eval self test
|
||||||
|
self.showReceiveDataSignal.emit(self.evalSelfTestRsp(data) + "\n")
|
||||||
|
elif data[0] == 0xE6 or data[0] == 0xF6:
|
||||||
|
self.showReceiveDataSignal.emit(self.evalStatusCheckRsp(data) + "\n")
|
||||||
|
elif data[0] == 0xE5 or data[0] == 0xF5:
|
||||||
|
self.showReceiveDataSignal.emit('Retrieved Data Frame:\n' + self.printFrame(data) + "\n")
|
||||||
|
else:
|
||||||
|
self.showReceiveDataSignal.emit(f"\n### Unexpected response code 0x{data[0]:02x}.\n")
|
||||||
|
|
||||||
|
def evalSelfTestRsp(self, data: bytes):
|
||||||
|
try:
|
||||||
|
payload = self.structSelfTestRsp.unpack(data)
|
||||||
|
except :
|
||||||
|
return f"\n### evalSelfTestRsp:: Failed to unpack data (data length {len(data)} byte).\n"
|
||||||
|
|
||||||
|
ret = "----------- 自检回令 -----------\n"
|
||||||
|
|
||||||
|
ret += "节点类型: "
|
||||||
|
if payload[1] == 0xDD:
|
||||||
|
ret += f"K频段 (0x{payload[1]:02X})\n"
|
||||||
|
elif payload[1] == 0xEE:
|
||||||
|
ret += f"S频段 (0x{payload[1]:02X})\n"
|
||||||
|
else:
|
||||||
|
ret += f"【未知错误】(0x{payload[1]:02X})\n"
|
||||||
|
|
||||||
|
ret += "自检结果: "
|
||||||
|
if payload[2] == 0xAA:
|
||||||
|
ret += f"正常 (0x{payload[2]:02X})\n"
|
||||||
|
elif payload[2] == 0x55:
|
||||||
|
ret += f"异常 (0x{payload[2]:02X})\n"
|
||||||
|
else:
|
||||||
|
ret += f"【未知错误】(0x{payload[2]:02X})\n"
|
||||||
|
|
||||||
|
hwOffset = 3
|
||||||
|
|
||||||
|
ret += f"FPGA 电压监测: {bin(payload[hwOffset+0])[2:].zfill(8)}\n"
|
||||||
|
ret += f"时钟锁定状态: {bin(payload[hwOffset+1])[2:].zfill(8)}\n"
|
||||||
|
ret += f"AD 锁定状态: {bin(payload[hwOffset+2])[2:].zfill(8)}\n"
|
||||||
|
ret += f"AD 温度 1: {payload[hwOffset+3]:>4d}\n"
|
||||||
|
ret += f"AD 温度 2: {payload[hwOffset+4]:>4d}\n"
|
||||||
|
ret += f"FPGA 温度: {payload[hwOffset+5]:>4d}\n"
|
||||||
|
ret += f"电压监测: {bin(payload[hwOffset+6])[2:].zfill(8)}\n"
|
||||||
|
ret += f"射频温度: {payload[hwOffset+7]:>4d}\n"
|
||||||
|
ret += f"锁定指示: {bin(payload[hwOffset+8])[2:].zfill(8)}\n"
|
||||||
|
ret += f"MGC 1~2: {payload[hwOffset+9] & 0x0f:>2d} - {payload[hwOffset+9] >> 4:>2d}\n"
|
||||||
|
ret += f"MGC 3~4: {payload[hwOffset+10] & 0x0f:>2d} - {payload[hwOffset+10] >> 4:>2d}\n"
|
||||||
|
ret += "--------------------------------\n"
|
||||||
|
|
||||||
|
return ret + '\n' + self.printFrame(data)
|
||||||
|
|
||||||
|
def printFrame(self, data: bytes):
|
||||||
|
ret = ''
|
||||||
|
for i in range(len(data)):
|
||||||
|
ret += f'{data[i]:02X}'
|
||||||
|
ret += '\n' if i%16 == 15 else ' '
|
||||||
|
ret += '\n'
|
||||||
|
return ret
|
||||||
|
|
||||||
|
def evalStatusCheckRsp(self, data: bytes):
|
||||||
|
try:
|
||||||
|
payload = self.structStatusCheckRsp.unpack(data)
|
||||||
|
except :
|
||||||
|
return f"\n### evalStatusCheckRsp:: Failed to unpack data (data length {len(data)} byte).\n"
|
||||||
|
|
||||||
|
ret = "----------- 遥测回令 -----------\n"
|
||||||
|
|
||||||
|
ret += "节点类型: "
|
||||||
|
if payload[1] == 0xDD:
|
||||||
|
ret += f"K频段 (0x{payload[1]:02X})\n"
|
||||||
|
elif payload[1] == 0xEE:
|
||||||
|
ret += f"S频段 (0x{payload[1]:02X})\n"
|
||||||
|
else:
|
||||||
|
ret += f"【未知错误】(0x{payload[1]:02X})\n"
|
||||||
|
|
||||||
|
ret += f"时间戳: {payload[2]/1e5:.2f} ms\n"
|
||||||
|
|
||||||
|
sysbusOffset = 3
|
||||||
|
linkOffset = 7
|
||||||
|
phyOffset = 30
|
||||||
|
hwOffset = 44
|
||||||
|
|
||||||
|
ret += "\n -- 总线状态\n"
|
||||||
|
ret += f"配置装订: {payload[sysbusOffset + 0]:04X}\n"
|
||||||
|
ret += f"装置点名计数: {payload[sysbusOffset + 1]:>6d}\n"
|
||||||
|
ret += f"业务下发计数: {payload[sysbusOffset + 2]:>6d}\n"
|
||||||
|
ret += f"遥测请求计数: {payload[sysbusOffset + 3]:>6d}\n"
|
||||||
|
|
||||||
|
ret += "\n -- 链路层状态\n"
|
||||||
|
ret += f"帧号: {payload[linkOffset + 0]:>6d}\n"
|
||||||
|
ret += f"时隙号: {payload[linkOffset + 1]:>3d}\n"
|
||||||
|
|
||||||
|
ret += "当前角色: "
|
||||||
|
if payload[linkOffset + 2] == 0xAA:
|
||||||
|
ret += f"反拦截 (0x{payload[linkOffset + 2]:02X})\n"
|
||||||
|
elif payload[linkOffset + 2] == 0xCC:
|
||||||
|
ret += f"拦截 (0x{payload[linkOffset + 2]:02X})\n"
|
||||||
|
else:
|
||||||
|
ret += f"【未知错误】(0x{payload[linkOffset + 2]:02X})\n"
|
||||||
|
|
||||||
|
ret += "网络连接状态: "
|
||||||
|
if payload[linkOffset + 3] == 0x11:
|
||||||
|
ret += f"已连接 (0x{payload[linkOffset + 3]:02X})\n"
|
||||||
|
elif payload[linkOffset + 3] == 0x00:
|
||||||
|
ret += f"未连接 (0x{payload[linkOffset + 3]:02X})\n"
|
||||||
|
else:
|
||||||
|
ret += f"【未知错误】(0x{payload[linkOffset + 3]:02X})\n"
|
||||||
|
|
||||||
|
ret += "网络运行阶段: "
|
||||||
|
if payload[linkOffset + 4] == 0x11:
|
||||||
|
ret += f"扫描建网 (0x{payload[linkOffset + 4]:02X})\n"
|
||||||
|
elif payload[linkOffset + 4] == 0x22:
|
||||||
|
ret += f"业务通信 (0x{payload[linkOffset + 4]:02X})\n"
|
||||||
|
else:
|
||||||
|
ret += f"【未知错误】(0x{payload[linkOffset + 4]:02X})\n"
|
||||||
|
|
||||||
|
ret += f"重建/入网计数: {payload[linkOffset + 5]:>6d}\n"
|
||||||
|
ret += f"通信波位号: {payload[linkOffset + 6]:>2d}\n"
|
||||||
|
|
||||||
|
ret += "通信波束宽度: "
|
||||||
|
if payload[linkOffset + 7] == 0x01:
|
||||||
|
ret += f"120° 宽波束 (0x{payload[linkOffset + 7]:02X})\n"
|
||||||
|
elif payload[linkOffset + 7] == 0x02:
|
||||||
|
ret += f"60° 次波束 (0x{payload[linkOffset + 7]:02X})\n"
|
||||||
|
elif payload[linkOffset + 7] == 0x03:
|
||||||
|
ret += f"25° 次波束 (0x{payload[linkOffset + 7]:02X})\n"
|
||||||
|
elif payload[linkOffset + 7] == 0x04:
|
||||||
|
ret += f"8° 窄波束 (0x{payload[linkOffset + 7]:02X})\n"
|
||||||
|
else:
|
||||||
|
ret += f"【未知错误】(0x{payload[linkOffset + 7]:02X})\n"
|
||||||
|
|
||||||
|
ret += f"离轴角: {payload[linkOffset + 8]*0.1:.2f}°\n"
|
||||||
|
ret += f"偏航角: {payload[linkOffset + 9]*0.1:.2f}°\n"
|
||||||
|
ret += f"基准帧发送计数: {payload[linkOffset + 10]:>6d}\n"
|
||||||
|
ret += f"基准帧接收计数: {payload[linkOffset + 11]:>6d}\n"
|
||||||
|
ret += f"基准帧正确计数: {payload[linkOffset + 12]:>6d}\n"
|
||||||
|
ret += f"双向握手帧发送计数: {payload[linkOffset + 13]:>6d}\n"
|
||||||
|
ret += f"双向握手帧接收计数: {payload[linkOffset + 14]:>6d}\n"
|
||||||
|
ret += f"双向握手帧正确计数: {payload[linkOffset + 15]:>6d}\n"
|
||||||
|
ret += f"业务帧发送计数: {payload[linkOffset + 16]:>6d}\n"
|
||||||
|
ret += f"业务帧接收计数: {payload[linkOffset + 17]:>6d}\n"
|
||||||
|
ret += f"业务帧正确计数: {payload[linkOffset + 18]:>6d}\n"
|
||||||
|
ret += f"时间偏差记录: {payload[linkOffset + 19]/1e2:.2f} us\n"
|
||||||
|
ret += f"发送数据 ID: {payload[linkOffset + 20]:>6d}\n"
|
||||||
|
ret += f"接收数据 ID: {payload[linkOffset + 21]:>6d}\n"
|
||||||
|
|
||||||
|
ret += "\n -- 物理层状态\n"
|
||||||
|
ret += f"捕获计数: {payload[phyOffset + 0]:>6d}\n"
|
||||||
|
ret += f"帧同步计数: {payload[phyOffset + 1]:>6d}\n"
|
||||||
|
ret += f"译码计数: {payload[phyOffset + 2]:>6d}\n"
|
||||||
|
ret += f"CRC 正确计数:{payload[phyOffset + 3]:>6d}\n"
|
||||||
|
ret += f"多普勒估计: {payload[phyOffset + 4]:.2f} Hz\n"
|
||||||
|
ret += f"正确接收时刻: {payload[phyOffset + 5]/1e2:.2f} us\n"
|
||||||
|
ret += f"捕获峰均比: {payload[phyOffset + 6]:.2f}\n"
|
||||||
|
ret += f"捕获相位值: {payload[phyOffset + 7]:>3d}\n"
|
||||||
|
ret += f"捕获频偏通道: {payload[phyOffset + 8]:>3d}\n"
|
||||||
|
ret += f"帧同步峰均比: {payload[phyOffset + 9]:.2f}\n"
|
||||||
|
ret += f"帧同步频偏通道: {payload[phyOffset + 10]:>3d}\n"
|
||||||
|
ret += f"交织输入数据幅度统计:\t0x{payload[phyOffset + 11]:04X}\n"
|
||||||
|
ret += "天线工作模式: "
|
||||||
|
if payload[phyOffset + 12] == 0x01:
|
||||||
|
ret += f"静默模式 (0x{payload[phyOffset + 12]:02X})\n"
|
||||||
|
elif payload[phyOffset + 12] == 0x02:
|
||||||
|
ret += f"低功率模式 (0x{payload[phyOffset + 12]:02X})\n"
|
||||||
|
elif payload[phyOffset + 12] == 0x03:
|
||||||
|
ret += f"全功率模式 (0x{payload[phyOffset + 12]:02X})\n"
|
||||||
|
else:
|
||||||
|
ret += f"【未知错误】(0x{payload[phyOffset + 12]:02X})\n"
|
||||||
|
|
||||||
|
ret += "\n -- 硬件状态\n"
|
||||||
|
ret += f"FPGA 电压监测: {bin(payload[hwOffset+0])[2:].zfill(8)}\n"
|
||||||
|
ret += f"时钟锁定状态: {bin(payload[hwOffset+1])[2:].zfill(8)}\n"
|
||||||
|
ret += f"AD 锁定状态: {bin(payload[hwOffset+2])[2:].zfill(8)}\n"
|
||||||
|
ret += f"AD 温度 1: {payload[hwOffset+3]:>4d}\n"
|
||||||
|
ret += f"AD 温度 2: {payload[hwOffset+4]:>4d}\n"
|
||||||
|
ret += f"FPGA 温度: {payload[hwOffset+5]:>4d}\n"
|
||||||
|
ret += f"电压监测: {bin(payload[hwOffset+6])[2:].zfill(8)}\n"
|
||||||
|
ret += f"射频温度: {payload[hwOffset+7]:>4d}\n"
|
||||||
|
ret += f"锁定指示: {bin(payload[hwOffset+8])[2:].zfill(8)}\n"
|
||||||
|
ret += f"MGC 1~2: {payload[hwOffset+9] & 0x0f:>2d} - {payload[hwOffset+9] >> 4:>2d}\n"
|
||||||
|
ret += f"MGC 3~4: {payload[hwOffset+10] & 0x0f:>2d} - {payload[hwOffset+10] >> 4:>2d}\n"
|
||||||
|
|
||||||
|
ret += "--------------------------------\n"
|
||||||
|
return ret + '\n' + self.printFrame(data)
|
||||||
|
|
||||||
|
def onSent(self, ok, msg, length, path):
|
||||||
|
if ok:
|
||||||
|
self.statusBar.addTx(length)
|
||||||
|
else:
|
||||||
|
self.hintSignal.emit("error", _("Error"), _("Send data failed!") + " " + msg)
|
||||||
|
|
||||||
|
def sendCustomItem(self, item):
|
||||||
|
data = item["data"]
|
||||||
|
dateBytes = self.parseSendData(data, encoding = self.configGlobal["encoding"], isHexStr = True)
|
||||||
|
if dateBytes:
|
||||||
|
self.send(dateBytes, callback=self.onSent)
|
||||||
@@ -359,20 +359,20 @@
|
|||||||
/* Definitions for driver GPIO */
|
/* Definitions for driver GPIO */
|
||||||
#define XPAR_XGPIO_NUM_INSTANCES 1
|
#define XPAR_XGPIO_NUM_INSTANCES 1
|
||||||
|
|
||||||
/* Definitions for peripheral CONFIG_GPIO */
|
/* Definitions for peripheral MPC_GPIO */
|
||||||
#define XPAR_CONFIG_GPIO_BASEADDR 0x41200000
|
#define XPAR_MPC_GPIO_BASEADDR 0x41200000
|
||||||
#define XPAR_CONFIG_GPIO_HIGHADDR 0x4120FFFF
|
#define XPAR_MPC_GPIO_HIGHADDR 0x4120FFFF
|
||||||
#define XPAR_CONFIG_GPIO_DEVICE_ID 0
|
#define XPAR_MPC_GPIO_DEVICE_ID 0
|
||||||
#define XPAR_CONFIG_GPIO_INTERRUPT_PRESENT 0
|
#define XPAR_MPC_GPIO_INTERRUPT_PRESENT 0
|
||||||
#define XPAR_CONFIG_GPIO_IS_DUAL 1
|
#define XPAR_MPC_GPIO_IS_DUAL 1
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************/
|
/******************************************************************/
|
||||||
|
|
||||||
/* Canonical definitions for peripheral CONFIG_GPIO */
|
/* Canonical definitions for peripheral MPC_GPIO */
|
||||||
#define XPAR_GPIO_0_BASEADDR 0x41200000
|
#define XPAR_GPIO_0_BASEADDR 0x41200000
|
||||||
#define XPAR_GPIO_0_HIGHADDR 0x4120FFFF
|
#define XPAR_GPIO_0_HIGHADDR 0x4120FFFF
|
||||||
#define XPAR_GPIO_0_DEVICE_ID XPAR_CONFIG_GPIO_DEVICE_ID
|
#define XPAR_GPIO_0_DEVICE_ID XPAR_MPC_GPIO_DEVICE_ID
|
||||||
#define XPAR_GPIO_0_INTERRUPT_PRESENT 0
|
#define XPAR_GPIO_0_INTERRUPT_PRESENT 0
|
||||||
#define XPAR_GPIO_0_IS_DUAL 1
|
#define XPAR_GPIO_0_IS_DUAL 1
|
||||||
|
|
||||||
@@ -425,17 +425,14 @@
|
|||||||
|
|
||||||
/* Definitions for Fabric interrupts connected to ps7_scugic_0 */
|
/* Definitions for Fabric interrupts connected to ps7_scugic_0 */
|
||||||
#define XPAR_FABRIC_PHY_IRQ_INTR 61U
|
#define XPAR_FABRIC_PHY_IRQ_INTR 61U
|
||||||
#define XPAR_FABRIC_FRAME_UART_0_RX_INTR_INTR 62U
|
#define XPAR_FABRIC_PHY_5MS_INTR 62U
|
||||||
#define XPAR_FABRIC_FRAME_UART_0_TX_INTR_INTR 63U
|
#define XPAR_FABRIC_PHY_5MS_DELAY_2MS_INTR 63U
|
||||||
#define XPAR_FABRIC_MPC_IRQ_INTR 64U
|
#define XPAR_FABRIC_MPC_RX_IRQ_INTR 64U
|
||||||
#define XPAR_FABRIC_PHY_5MS_INTR 65U
|
#define XPAR_FABRIC_MPC_TX_IRQ_INTR 65U
|
||||||
#define XPAR_FABRIC_PHY_5MS_DELAY_2MS_INTR 66U
|
|
||||||
|
|
||||||
/******************************************************************/
|
/******************************************************************/
|
||||||
|
|
||||||
/* Canonical definitions for Fabric interrupts connected to ps7_scugic_0 */
|
/* Canonical definitions for Fabric interrupts connected to ps7_scugic_0 */
|
||||||
#define XPAR_FABRIC_FRAME_UART_0_RX_INTR_VEC_ID XPAR_FABRIC_FRAME_UART_0_RX_INTR_INTR
|
|
||||||
#define XPAR_FABRIC_FRAME_UART_0_TX_INTR_VEC_ID XPAR_FABRIC_FRAME_UART_0_TX_INTR_INTR
|
|
||||||
|
|
||||||
/******************************************************************/
|
/******************************************************************/
|
||||||
|
|
||||||
|
|||||||
@@ -43,10 +43,10 @@
|
|||||||
XGpio_Config XGpio_ConfigTable[XPAR_XGPIO_NUM_INSTANCES] =
|
XGpio_Config XGpio_ConfigTable[XPAR_XGPIO_NUM_INSTANCES] =
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
XPAR_CONFIG_GPIO_DEVICE_ID,
|
XPAR_MPC_GPIO_DEVICE_ID,
|
||||||
XPAR_CONFIG_GPIO_BASEADDR,
|
XPAR_MPC_GPIO_BASEADDR,
|
||||||
XPAR_CONFIG_GPIO_INTERRUPT_PRESENT,
|
XPAR_MPC_GPIO_INTERRUPT_PRESENT,
|
||||||
XPAR_CONFIG_GPIO_IS_DUAL
|
XPAR_MPC_GPIO_IS_DUAL
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -18,18 +18,6 @@ BEGIN PROCESSOR
|
|||||||
END
|
END
|
||||||
|
|
||||||
|
|
||||||
BEGIN DRIVER
|
|
||||||
PARAMETER DRIVER_NAME = frame_uart
|
|
||||||
PARAMETER DRIVER_VER = 1.0
|
|
||||||
PARAMETER HW_INSTANCE = Frame_Uart_0
|
|
||||||
END
|
|
||||||
|
|
||||||
BEGIN DRIVER
|
|
||||||
PARAMETER DRIVER_NAME = gpio
|
|
||||||
PARAMETER DRIVER_VER = 4.4
|
|
||||||
PARAMETER HW_INSTANCE = config_gpio
|
|
||||||
END
|
|
||||||
|
|
||||||
BEGIN DRIVER
|
BEGIN DRIVER
|
||||||
PARAMETER DRIVER_NAME = generic
|
PARAMETER DRIVER_NAME = generic
|
||||||
PARAMETER DRIVER_VER = 2.0
|
PARAMETER DRIVER_VER = 2.0
|
||||||
@@ -54,6 +42,12 @@ BEGIN DRIVER
|
|||||||
PARAMETER HW_INSTANCE = mpc_bram_interface_mpc_bram_ctrl
|
PARAMETER HW_INSTANCE = mpc_bram_interface_mpc_bram_ctrl
|
||||||
END
|
END
|
||||||
|
|
||||||
|
BEGIN DRIVER
|
||||||
|
PARAMETER DRIVER_NAME = gpio
|
||||||
|
PARAMETER DRIVER_VER = 4.4
|
||||||
|
PARAMETER HW_INSTANCE = mpc_gpio
|
||||||
|
END
|
||||||
|
|
||||||
BEGIN DRIVER
|
BEGIN DRIVER
|
||||||
PARAMETER DRIVER_NAME = bram
|
PARAMETER DRIVER_NAME = bram
|
||||||
PARAMETER DRIVER_VER = 4.3
|
PARAMETER DRIVER_VER = 4.3
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ RM := rm -rf
|
|||||||
-include sources.mk
|
-include sources.mk
|
||||||
-include src/util/subdir.mk
|
-include src/util/subdir.mk
|
||||||
-include src/time_ctrl/subdir.mk
|
-include src/time_ctrl/subdir.mk
|
||||||
-include src/systembus/subdir.mk
|
-include src/mpc/subdir.mk
|
||||||
-include src/networking/phy_layer/subdir.mk
|
-include src/networking/phy_layer/subdir.mk
|
||||||
-include src/networking/link_layer/geometry/subdir.mk
|
-include src/networking/link_layer/geometry/subdir.mk
|
||||||
-include src/networking/link_layer/subdir.mk
|
-include src/networking/link_layer/subdir.mk
|
||||||
|
|||||||
+6
-6
@@ -4,16 +4,16 @@
|
|||||||
|
|
||||||
# Add inputs and outputs from these tool invocations to the build variables
|
# Add inputs and outputs from these tool invocations to the build variables
|
||||||
C_SRCS += \
|
C_SRCS += \
|
||||||
../src/systembus/systembus.c \
|
../src/mpc/mpc.c \
|
||||||
../src/systembus/systembus_uart.c
|
../src/mpc/mpc_hw.c
|
||||||
|
|
||||||
OBJS += \
|
OBJS += \
|
||||||
./src/systembus/systembus.o \
|
./src/mpc/mpc.o \
|
||||||
./src/systembus/systembus_uart.o
|
./src/mpc/mpc_hw.o
|
||||||
|
|
||||||
C_DEPS += \
|
C_DEPS += \
|
||||||
./src/systembus/systembus.d \
|
./src/mpc/mpc.d \
|
||||||
./src/systembus/systembus_uart.d
|
./src/mpc/mpc_hw.d
|
||||||
|
|
||||||
|
|
||||||
# Each subdirectory must supply rules for building sources it contributes
|
# Each subdirectory must supply rules for building sources it contributes
|
||||||
@@ -71,9 +71,10 @@
|
|||||||
#define TIME_CONTROLLER_BASEADDR XPAR_TMC_BASEADDR
|
#define TIME_CONTROLLER_BASEADDR XPAR_TMC_BASEADDR
|
||||||
|
|
||||||
// System Bus Configs
|
// System Bus Configs
|
||||||
//#define SYSBUS_BASE_ADDR XPAR_SYSTEMBUS_BASEADDR
|
#define MPC_BRAM_ID XPAR_MPC_BRAM_INTERFACE_MPC_BRAM_CTRL_DEVICE_ID
|
||||||
//#define SYSBUS_TX_INTR_ID XPAR_FABRIC_SYSTEMBUS_TX_DONE_INTR
|
#define MPC_GPIO_ID XPAR_MPC_GPIO_DEVICE_ID
|
||||||
//#define SYSBUS_RX_INTR_ID XPAR_FABRIC_SYSTEMBUS_RX_DONE_INTR
|
#define MPC_TX_INTR_ID XPAR_FABRIC_MPC_TX_IRQ_INTR
|
||||||
|
#define MPC_RX_INTR_ID XPAR_FABRIC_MPC_RX_IRQ_INTR
|
||||||
|
|
||||||
// Global Timer config
|
// Global Timer config
|
||||||
#define GLOBAL_TIMER_DEVICE_ID XPAR_GLOBAL_TMR_DEVICE_ID
|
#define GLOBAL_TIMER_DEVICE_ID XPAR_GLOBAL_TMR_DEVICE_ID
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ struct xil_timer_init_param xil_scutimer_init_param = {
|
|||||||
struct timer_init_param scutimer_init_param = {
|
struct timer_init_param scutimer_init_param = {
|
||||||
.id = SCUTIMER_DEVICE_ID,
|
.id = SCUTIMER_DEVICE_ID,
|
||||||
.freq_hz = SCU_TIMER_CLK_HZ,
|
.freq_hz = SCU_TIMER_CLK_HZ,
|
||||||
.ticks_count = (SCU_TIMER_CLK_HZ/10), //update log every 100ms
|
.ticks_count = (SCU_TIMER_CLK_HZ/2), //update log every 500ms
|
||||||
.platform_ops = &xil_timer_ops,
|
.platform_ops = &xil_timer_ops,
|
||||||
.extra = &xil_scutimer_init_param
|
.extra = &xil_scutimer_init_param
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
/***************************************************************************//**
|
/******************************************************************************* * @file ad9371/src/app/headless.c
|
||||||
* @file ad9371/src/app/headless.c
|
|
||||||
* @brief Implementation of Main Function.
|
* @brief Implementation of Main Function.
|
||||||
********************************************************************************
|
********************************************************************************
|
||||||
* Copyright 2017(c) Analog Devices, Inc.
|
* Copyright 2017(c) Analog Devices, Inc.
|
||||||
@@ -66,7 +65,8 @@ int HARDWARE_initialize()
|
|||||||
|
|
||||||
Status = HARDWARE_ad9371Config();
|
Status = HARDWARE_ad9371Config();
|
||||||
|
|
||||||
if (Status != ADIERR_OK){
|
if (Status != ADIERR_OK)
|
||||||
|
{
|
||||||
return ADIERR_FAILED;
|
return ADIERR_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -75,11 +75,11 @@ int HARDWARE_initialize()
|
|||||||
// /**********************************************************/
|
// /**********************************************************/
|
||||||
// Status = HW_ad9371DynamicCfgInit();
|
// Status = HW_ad9371DynamicCfgInit();
|
||||||
// if (Status != ADIERR_OK){
|
// if (Status != ADIERR_OK){
|
||||||
// printf("HW:: AD9371 dynamic configuration initialization failed!\n");
|
// HW_PRINT("HW:: AD9371 dynamic configuration initialization failed!\n");
|
||||||
// return ADIERR_FAILED;
|
// return ADIERR_FAILED;
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// printf("HW:: AD9371 ready to be reconfigured!\n");
|
// HW_PRINT("HW:: AD9371 ready to be reconfigured!\n");
|
||||||
//
|
//
|
||||||
// // main loop
|
// // main loop
|
||||||
// while(1);
|
// while(1);
|
||||||
@@ -101,57 +101,64 @@ int HARDWARE_ad9371Config(void)
|
|||||||
/*********** Initialize Configuration Interface ***********/
|
/*********** Initialize Configuration Interface ***********/
|
||||||
/**********************************************************/
|
/**********************************************************/
|
||||||
Status = CMB_initPlatform();
|
Status = CMB_initPlatform();
|
||||||
if (Status != ADIERR_OK){
|
if (Status != ADIERR_OK)
|
||||||
|
{
|
||||||
return ADIERR_FAILED;
|
return ADIERR_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = HW_adiCfgProfileInit();
|
Status = HW_adiCfgProfileInit();
|
||||||
if (Status != ADIERR_OK){
|
if (Status != ADIERR_OK)
|
||||||
|
{
|
||||||
return ADIERR_FAILED;
|
return ADIERR_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("HW:: Initialize configuration interface done!\n");
|
HW_PRINT("HW:: Initialize configuration interface done!\n");
|
||||||
|
|
||||||
/**********************************************************/
|
/**********************************************************/
|
||||||
/****************** AD9528 Configuration ******************/
|
/****************** AD9528 Configuration ******************/
|
||||||
/**********************************************************/
|
/**********************************************************/
|
||||||
Status = HW_9528Config(ad9528Init);
|
Status = HW_9528Config(ad9528Init);
|
||||||
if (Status != ADIERR_OK){
|
if (Status != ADIERR_OK)
|
||||||
|
{
|
||||||
return ADIERR_FAILED;
|
return ADIERR_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("HW:: AD9528 configuration done!\n");
|
HW_PRINT("HW:: AD9528 configuration done!\n");
|
||||||
|
|
||||||
Status = HW_9528GetLockStatus(ad9528Init, ®508);
|
Status = HW_9528GetLockStatus(ad9528Init, ®508);
|
||||||
if (Status != ADIERR_OK){
|
if (Status != ADIERR_OK)
|
||||||
|
{
|
||||||
return ADIERR_FAILED;
|
return ADIERR_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("HW:: AD9528 REG508: 0x%02x\n",reg508);
|
HW_PRINT("HW:: AD9528 REG508: 0x%02x\n", reg508);
|
||||||
|
|
||||||
/**********************************************************/
|
/**********************************************************/
|
||||||
/****************** AD9371 Configuration ******************/
|
/****************** AD9371 Configuration ******************/
|
||||||
/**********************************************************/
|
/**********************************************************/
|
||||||
Status = HW_9371Config(ad9528Init, &mykDevice);
|
Status = HW_9371Config(ad9528Init, &mykDevice);
|
||||||
if (Status != ADIERR_OK){
|
if (Status != ADIERR_OK)
|
||||||
|
{
|
||||||
return ADIERR_FAILED;
|
return ADIERR_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = HW_9371CheckJesdStatus(&mykDevice, &framerStatus,
|
Status = HW_9371CheckJesdStatus(&mykDevice, &framerStatus,
|
||||||
&obsFramerStatus, &deframerStatus);
|
&obsFramerStatus, &deframerStatus);
|
||||||
if (Status != ADIERR_OK){
|
if (Status != ADIERR_OK)
|
||||||
|
{
|
||||||
return ADIERR_FAILED;
|
return ADIERR_FAILED;
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
|
{
|
||||||
// typical value: 0x3E
|
// typical value: 0x3E
|
||||||
printf("HW:: RxFramerStatus = 0x%x\n", framerStatus);
|
HW_PRINT("HW:: RxFramerStatus = 0x%x\n", framerStatus);
|
||||||
// typical value: 0x3E
|
// typical value: 0x3E
|
||||||
printf("HW:: OrxFramerStatus = 0x%x\n", obsFramerStatus);
|
HW_PRINT("HW:: OrxFramerStatus = 0x%x\n", obsFramerStatus);
|
||||||
// typical value: 0x28
|
// typical value: 0x28
|
||||||
printf("HW:: DeframerStatus = 0x%x\n", deframerStatus);
|
HW_PRINT("HW:: DeframerStatus = 0x%x\n", deframerStatus);
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("HW:: All configuration done!\n");
|
HW_PRINT("HW:: All configuration done!\n");
|
||||||
|
|
||||||
return ADIERR_OK;
|
return ADIERR_OK;
|
||||||
}
|
}
|
||||||
@@ -163,7 +170,7 @@ int HARDWARE_ad9371Config(void)
|
|||||||
//
|
//
|
||||||
// Status = HW_setupIntrSystem(INTC_DEVICE_ID, &Intc);
|
// Status = HW_setupIntrSystem(INTC_DEVICE_ID, &Intc);
|
||||||
// if (Status != XST_SUCCESS) {
|
// if (Status != XST_SUCCESS) {
|
||||||
// printf("HW: HW_setupIntrSystem() failed!\n");
|
// HW_PRINT("HW: HW_setupIntrSystem() failed!\n");
|
||||||
// return XST_FAILURE;
|
// return XST_FAILURE;
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
@@ -171,7 +178,7 @@ int HARDWARE_ad9371Config(void)
|
|||||||
// Status |= XGpio_Initialize(&GpioGainCtrl, GAIN_CTRL_DEVICE_ID);
|
// Status |= XGpio_Initialize(&GpioGainCtrl, GAIN_CTRL_DEVICE_ID);
|
||||||
// Status |= XGpio_Initialize(&GpioAttnCtrl, ATTN_CTRL_DEVICE_ID);
|
// Status |= XGpio_Initialize(&GpioAttnCtrl, ATTN_CTRL_DEVICE_ID);
|
||||||
// if (Status != XST_SUCCESS) {
|
// if (Status != XST_SUCCESS) {
|
||||||
// printf("HW: GPIO init failed!\n");
|
// HW_PRINT("HW: GPIO init failed!\n");
|
||||||
// return XST_FAILURE;
|
// return XST_FAILURE;
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
@@ -229,14 +236,16 @@ int HW_setupIntrSystem(u16 DeviceId, XScuGic * GicPtr)
|
|||||||
* use.
|
* use.
|
||||||
*/
|
*/
|
||||||
CfgPtr = XScuGic_LookupConfig(DeviceId);
|
CfgPtr = XScuGic_LookupConfig(DeviceId);
|
||||||
if (!CfgPtr) {
|
if (!CfgPtr)
|
||||||
printf("No interrupt config found for %d\n", DeviceId);
|
{
|
||||||
|
HW_PRINT("No interrupt config found for %d\n", DeviceId);
|
||||||
return XST_FAILURE;
|
return XST_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = XScuGic_CfgInitialize(GicPtr, CfgPtr, CfgPtr->CpuBaseAddress);
|
Status = XScuGic_CfgInitialize(GicPtr, CfgPtr, CfgPtr->CpuBaseAddress);
|
||||||
if (Status != XST_SUCCESS) {
|
if (Status != XST_SUCCESS)
|
||||||
printf("No interrupt config found for %d\n", DeviceId);
|
{
|
||||||
|
HW_PRINT("No interrupt config found for %d\n", DeviceId);
|
||||||
return XST_FAILURE;
|
return XST_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -249,7 +258,6 @@ int HW_setupIntrSystem(u16 DeviceId, XScuGic * GicPtr)
|
|||||||
return XST_SUCCESS;
|
return XST_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int HW_connectIntr(XScuGic *GicPtr, u32 IntrId, Xil_InterruptHandler Handler,
|
int HW_connectIntr(XScuGic *GicPtr, u32 IntrId, Xil_InterruptHandler Handler,
|
||||||
void *CallBackRef, u8 Priority, u8 Trigger)
|
void *CallBackRef, u8 Priority, u8 Trigger)
|
||||||
{
|
{
|
||||||
@@ -268,16 +276,17 @@ int HW_connectIntr(XScuGic *GicPtr,u32 IntrId,Xil_InterruptHandler Handler,
|
|||||||
return XST_SUCCESS;
|
return XST_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int HW_adiCfgProfileInit(void)
|
int HW_adiCfgProfileInit(void)
|
||||||
{
|
{
|
||||||
if (!ad9528Init) {
|
if (!ad9528Init)
|
||||||
printf("Cannot find ad9528 configuration profile with name 'ad9528Init'!");
|
{
|
||||||
|
HW_PRINT("Cannot find ad9528 configuration profile with name 'ad9528Init'!");
|
||||||
return ADIERR_FAILED;
|
return ADIERR_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!&mykDevice) {
|
if (!&mykDevice)
|
||||||
printf("Cannot find ad9371 configuration profile with name 'mykDevice'!");
|
{
|
||||||
|
HW_PRINT("Cannot find ad9371 configuration profile with name 'mykDevice'!");
|
||||||
return ADIERR_FAILED;
|
return ADIERR_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -293,7 +302,6 @@ int HW_adiCfgProfileInit(void)
|
|||||||
return ADIERR_OK;
|
return ADIERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int HW_9528Config(ad9528Device_t *clockAD9528_device)
|
int HW_9528Config(ad9528Device_t *clockAD9528_device)
|
||||||
{
|
{
|
||||||
ADI_ERR error;
|
ADI_ERR error;
|
||||||
@@ -303,8 +311,9 @@ int HW_9528Config(ad9528Device_t *clockAD9528_device)
|
|||||||
|
|
||||||
/* Perform a hard reset on the AD9528 DUT */
|
/* Perform a hard reset on the AD9528 DUT */
|
||||||
error = AD9528_resetDevice(clockAD9528_device);
|
error = AD9528_resetDevice(clockAD9528_device);
|
||||||
if (error != ADIERR_OK) {
|
if (error != ADIERR_OK)
|
||||||
printf("AD9528_resetDevice() failed\n");
|
{
|
||||||
|
HW_PRINT("AD9528_resetDevice() failed\n");
|
||||||
return ADIERR_FAILED;
|
return ADIERR_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -312,35 +321,36 @@ int HW_9528Config(ad9528Device_t *clockAD9528_device)
|
|||||||
clockAD9528_device->pll1Settings->vcxo_Frequency_Hz,
|
clockAD9528_device->pll1Settings->vcxo_Frequency_Hz,
|
||||||
clockAD9528_device->pll1Settings->refA_Frequency_Hz,
|
clockAD9528_device->pll1Settings->refA_Frequency_Hz,
|
||||||
clockAD9528_device->outputSettings->outFrequency_Hz[1]);
|
clockAD9528_device->outputSettings->outFrequency_Hz[1]);
|
||||||
if (error != ADIERR_OK) {
|
if (error != ADIERR_OK)
|
||||||
printf("AD9528_initDeviceDataStruct() failed\n");
|
{
|
||||||
|
HW_PRINT("AD9528_initDeviceDataStruct() failed\n");
|
||||||
return ADIERR_FAILED;
|
return ADIERR_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize the AD9528 by writing all SPI registers */
|
/* Initialize the AD9528 by writing all SPI registers */
|
||||||
error = AD9528_initialize(clockAD9528_device);
|
error = AD9528_initialize(clockAD9528_device);
|
||||||
if (error != ADIERR_OK) {
|
if (error != ADIERR_OK)
|
||||||
printf("WARNING: AD9528_initialize() issues.\n");
|
{
|
||||||
|
HW_PRINT("WARNING: AD9528_initialize() issues.\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
return ADIERR_OK;
|
return ADIERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int HW_9528GetLockStatus(ad9528Device_t *device, uint8_t *reg508)
|
int HW_9528GetLockStatus(ad9528Device_t *device, uint8_t *reg508)
|
||||||
{
|
{
|
||||||
ADI_ERR error;
|
ADI_ERR error;
|
||||||
|
|
||||||
error = CMB_SPIReadByte(device->spiSettings, AD9528_ADDR_STATUS_READBACK0, reg508);
|
error = CMB_SPIReadByte(device->spiSettings, AD9528_ADDR_STATUS_READBACK0, reg508);
|
||||||
if (error != ADIERR_OK) {
|
if (error != ADIERR_OK)
|
||||||
printf("HW_9528GetLockStatus failed.\n");
|
{
|
||||||
|
HW_PRINT("HW_9528GetLockStatus failed.\n");
|
||||||
return ADIERR_FAILED;
|
return ADIERR_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ADIERR_OK;
|
return ADIERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int HW_9371Config(ad9528Device_t *clockAD9528_device, mykonosDevice_t *mykDevice)
|
int HW_9371Config(ad9528Device_t *clockAD9528_device, mykonosDevice_t *mykDevice)
|
||||||
{
|
{
|
||||||
ADI_ERR error;
|
ADI_ERR error;
|
||||||
@@ -365,19 +375,19 @@ int HW_9371Config(ad9528Device_t *clockAD9528_device, mykonosDevice_t *mykDevice
|
|||||||
/* Allocating memory for the errorString */
|
/* Allocating memory for the errorString */
|
||||||
errorString = NULL;
|
errorString = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
/***** Mykonos Initialization Sequence *****/
|
/***** Mykonos Initialization Sequence *****/
|
||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
|
|
||||||
/* Perform a hard reset on the MYKONOS DUT (Toggle RESETB pin on device) */
|
/* Perform a hard reset on the MYKONOS DUT (Toggle RESETB pin on device) */
|
||||||
if ((mykError = MYKONOS_resetDevice(mykDevice)) != MYKONOS_ERR_OK) {
|
if ((mykError = MYKONOS_resetDevice(mykDevice)) != MYKONOS_ERR_OK)
|
||||||
|
{
|
||||||
errorString = getMykonosErrorMessage(mykError);
|
errorString = getMykonosErrorMessage(mykError);
|
||||||
goto error_11;
|
goto error_11;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((mykError = MYKONOS_initialize(mykDevice)) != MYKONOS_ERR_OK) {
|
if ((mykError = MYKONOS_initialize(mykDevice)) != MYKONOS_ERR_OK)
|
||||||
|
{
|
||||||
errorString = getMykonosErrorMessage(mykError);
|
errorString = getMykonosErrorMessage(mykError);
|
||||||
goto error_11;
|
goto error_11;
|
||||||
}
|
}
|
||||||
@@ -387,7 +397,8 @@ int HW_9371Config(ad9528Device_t *clockAD9528_device, mykonosDevice_t *mykDevice
|
|||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
|
|
||||||
if ((mykError = MYKONOS_checkPllsLockStatus(mykDevice,
|
if ((mykError = MYKONOS_checkPllsLockStatus(mykDevice,
|
||||||
&pllLockStatus)) != MYKONOS_ERR_OK) {
|
&pllLockStatus)) != MYKONOS_ERR_OK)
|
||||||
|
{
|
||||||
errorString = getMykonosErrorMessage(mykError);
|
errorString = getMykonosErrorMessage(mykError);
|
||||||
goto error_11;
|
goto error_11;
|
||||||
}
|
}
|
||||||
@@ -397,7 +408,8 @@ int HW_9371Config(ad9528Device_t *clockAD9528_device, mykonosDevice_t *mykDevice
|
|||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
|
|
||||||
if ((mykError = MYKONOS_enableMultichipSync(mykDevice, 1,
|
if ((mykError = MYKONOS_enableMultichipSync(mykDevice, 1,
|
||||||
&mcsStatus)) != MYKONOS_ERR_OK) {
|
&mcsStatus)) != MYKONOS_ERR_OK)
|
||||||
|
{
|
||||||
errorString = getMykonosErrorMessage(mykError);
|
errorString = getMykonosErrorMessage(mykError);
|
||||||
goto error_11;
|
goto error_11;
|
||||||
}
|
}
|
||||||
@@ -418,34 +430,40 @@ int HW_9371Config(ad9528Device_t *clockAD9528_device, mykonosDevice_t *mykDevice
|
|||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
|
|
||||||
if ((mykError = MYKONOS_enableMultichipSync(mykDevice, 0,
|
if ((mykError = MYKONOS_enableMultichipSync(mykDevice, 0,
|
||||||
&mcsStatus)) != MYKONOS_ERR_OK) {
|
&mcsStatus)) != MYKONOS_ERR_OK)
|
||||||
|
{
|
||||||
errorString = getMykonosErrorMessage(mykError);
|
errorString = getMykonosErrorMessage(mykError);
|
||||||
goto error_11;
|
goto error_11;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((mcsStatus & 0x0B) == 0x0B)
|
if ((mcsStatus & 0x0B) == 0x0B)
|
||||||
printf("MCS successful\n");
|
HW_PRINT("MCS successful\n");
|
||||||
else
|
else
|
||||||
printf("MCS failed\n");
|
HW_PRINT("MCS failed\n");
|
||||||
|
|
||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
/***** Mykonos Load ARM file *****/
|
/***** Mykonos Load ARM file *****/
|
||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
|
|
||||||
if (pllLockStatus & 0x01) {
|
if (pllLockStatus & 0x01)
|
||||||
printf("CLKPLL locked\n");
|
{
|
||||||
if ((mykError = MYKONOS_initArm(mykDevice)) != MYKONOS_ERR_OK) {
|
HW_PRINT("CLKPLL locked\n");
|
||||||
|
if ((mykError = MYKONOS_initArm(mykDevice)) != MYKONOS_ERR_OK)
|
||||||
|
{
|
||||||
errorString = getMykonosErrorMessage(mykError);
|
errorString = getMykonosErrorMessage(mykError);
|
||||||
goto error_11;
|
goto error_11;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((mykError = MYKONOS_loadArmFromBinary(mykDevice,
|
if ((mykError = MYKONOS_loadArmFromBinary(mykDevice,
|
||||||
&firmware_Mykonos_M3_bin[0], firmware_Mykonos_M3_bin_len)) != MYKONOS_ERR_OK) {
|
&firmware_Mykonos_M3_bin[0], firmware_Mykonos_M3_bin_len)) != MYKONOS_ERR_OK)
|
||||||
|
{
|
||||||
errorString = getMykonosErrorMessage(mykError);
|
errorString = getMykonosErrorMessage(mykError);
|
||||||
goto error_11;
|
goto error_11;
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
printf("CLKPLL not locked (0x%x)\n", pllLockStatus);
|
else
|
||||||
|
{
|
||||||
|
HW_PRINT("CLKPLL not locked (0x%x)\n", pllLockStatus);
|
||||||
error = ADIERR_FAILED;
|
error = ADIERR_FAILED;
|
||||||
goto error_2;
|
goto error_2;
|
||||||
}
|
}
|
||||||
@@ -453,26 +471,29 @@ int HW_9371Config(ad9528Device_t *clockAD9528_device, mykonosDevice_t *mykDevice
|
|||||||
/* Read back the version of the ARM binary loaded into the Mykonos ARM memory */
|
/* Read back the version of the ARM binary loaded into the Mykonos ARM memory */
|
||||||
if ((mykError = MYKONOS_getArmVersion(mykDevice, &arm_major, &arm_minor,
|
if ((mykError = MYKONOS_getArmVersion(mykDevice, &arm_major, &arm_minor,
|
||||||
&arm_release, NULL)) == MYKONOS_ERR_OK)
|
&arm_release, NULL)) == MYKONOS_ERR_OK)
|
||||||
printf("AD9371 ARM version %d.%d.%d\n", arm_major, arm_minor, arm_release);
|
HW_PRINT("AD9371 ARM version %d.%d.%d\n", arm_major, arm_minor, arm_release);
|
||||||
|
|
||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
/***** Mykonos Set RF PLL Frequencies *****/
|
/***** Mykonos Set RF PLL Frequencies *****/
|
||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
|
|
||||||
if ((mykError = MYKONOS_setRfPllFrequency(mykDevice, RX_PLL,
|
if ((mykError = MYKONOS_setRfPllFrequency(mykDevice, RX_PLL,
|
||||||
mykDevice->rx->rxPllLoFrequency_Hz)) != MYKONOS_ERR_OK) {
|
mykDevice->rx->rxPllLoFrequency_Hz)) != MYKONOS_ERR_OK)
|
||||||
|
{
|
||||||
errorString = getMykonosErrorMessage(mykError);
|
errorString = getMykonosErrorMessage(mykError);
|
||||||
goto error_11;
|
goto error_11;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((mykError = MYKONOS_setRfPllFrequency(mykDevice, TX_PLL,
|
if ((mykError = MYKONOS_setRfPllFrequency(mykDevice, TX_PLL,
|
||||||
mykDevice->tx->txPllLoFrequency_Hz)) != MYKONOS_ERR_OK) {
|
mykDevice->tx->txPllLoFrequency_Hz)) != MYKONOS_ERR_OK)
|
||||||
|
{
|
||||||
errorString = getMykonosErrorMessage(mykError);
|
errorString = getMykonosErrorMessage(mykError);
|
||||||
goto error_11;
|
goto error_11;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((mykError = MYKONOS_setRfPllFrequency(mykDevice, SNIFFER_PLL,
|
if ((mykError = MYKONOS_setRfPllFrequency(mykDevice, SNIFFER_PLL,
|
||||||
mykDevice->obsRx->snifferPllLoFrequency_Hz)) != MYKONOS_ERR_OK) {
|
mykDevice->obsRx->snifferPllLoFrequency_Hz)) != MYKONOS_ERR_OK)
|
||||||
|
{
|
||||||
errorString = getMykonosErrorMessage(mykError);
|
errorString = getMykonosErrorMessage(mykError);
|
||||||
goto error_11;
|
goto error_11;
|
||||||
}
|
}
|
||||||
@@ -481,15 +502,17 @@ int HW_9371Config(ad9528Device_t *clockAD9528_device, mykonosDevice_t *mykDevice
|
|||||||
mdelay(200);
|
mdelay(200);
|
||||||
|
|
||||||
if ((mykError = MYKONOS_checkPllsLockStatus(mykDevice,
|
if ((mykError = MYKONOS_checkPllsLockStatus(mykDevice,
|
||||||
&pllLockStatus)) != MYKONOS_ERR_OK) {
|
&pllLockStatus)) != MYKONOS_ERR_OK)
|
||||||
|
{
|
||||||
errorString = getMykonosErrorMessage(mykError);
|
errorString = getMykonosErrorMessage(mykError);
|
||||||
goto error_11;
|
goto error_11;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((pllLockStatus & 0x0F) == 0x0F)
|
if ((pllLockStatus & 0x0F) == 0x0F)
|
||||||
printf("PLLs locked\n");
|
HW_PRINT("PLLs locked\n");
|
||||||
else {
|
else
|
||||||
printf("PLLs not locked (0x%x)\n", pllLockStatus);
|
{
|
||||||
|
HW_PRINT("PLLs not locked (0x%x)\n", pllLockStatus);
|
||||||
error = ADIERR_FAILED;
|
error = ADIERR_FAILED;
|
||||||
goto error_2;
|
goto error_2;
|
||||||
}
|
}
|
||||||
@@ -592,56 +615,67 @@ int HW_9371Config(ad9528Device_t *clockAD9528_device, mykonosDevice_t *mykDevice
|
|||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
|
|
||||||
if ((mykError = MYKONOS_runInitCals(mykDevice,
|
if ((mykError = MYKONOS_runInitCals(mykDevice,
|
||||||
(initCalMask & ~TX_LO_LEAKAGE_EXTERNAL))) != MYKONOS_ERR_OK) {
|
(initCalMask & ~TX_LO_LEAKAGE_EXTERNAL))) != MYKONOS_ERR_OK)
|
||||||
|
{
|
||||||
errorString = getMykonosErrorMessage(mykError);
|
errorString = getMykonosErrorMessage(mykError);
|
||||||
goto error_11;
|
goto error_11;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((mykError = MYKONOS_waitInitCals(mykDevice, 60000, &errorFlag,
|
if ((mykError = MYKONOS_waitInitCals(mykDevice, 60000, &errorFlag,
|
||||||
&errorCode)) != MYKONOS_ERR_OK) {
|
&errorCode)) != MYKONOS_ERR_OK)
|
||||||
|
{
|
||||||
errorString = getMykonosErrorMessage(mykError);
|
errorString = getMykonosErrorMessage(mykError);
|
||||||
goto error_11;
|
goto error_11;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((errorFlag != 0) || (errorCode != 0)) {
|
if ((errorFlag != 0) || (errorCode != 0))
|
||||||
|
{
|
||||||
/*** < Info: abort init cals > ***/
|
/*** < Info: abort init cals > ***/
|
||||||
if ((mykError = MYKONOS_abortInitCals(mykDevice,
|
if ((mykError = MYKONOS_abortInitCals(mykDevice,
|
||||||
&initCalsCompleted)) != MYKONOS_ERR_OK) {
|
&initCalsCompleted)) != MYKONOS_ERR_OK)
|
||||||
|
{
|
||||||
errorString = getMykonosErrorMessage(mykError);
|
errorString = getMykonosErrorMessage(mykError);
|
||||||
goto error_11;
|
goto error_11;
|
||||||
}
|
}
|
||||||
if (initCalsCompleted)
|
if (initCalsCompleted)
|
||||||
printf("Completed calibrations: %x\n", (unsigned int)initCalsCompleted);
|
HW_PRINT("Completed calibrations: %x\n", (unsigned int)initCalsCompleted);
|
||||||
} else
|
}
|
||||||
printf("Calibrations completed successfully\n");
|
else
|
||||||
|
HW_PRINT("Calibrations completed successfully\n");
|
||||||
|
|
||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
/***** Mykonos ARM Initialization External LOL Calibrations with PA *****/
|
/***** Mykonos ARM Initialization External LOL Calibrations with PA *****/
|
||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
|
|
||||||
/* Please ensure PA is enabled operational at this time */
|
/* Please ensure PA is enabled operational at this time */
|
||||||
if (initCalMask & TX_LO_LEAKAGE_EXTERNAL) {
|
if (initCalMask & TX_LO_LEAKAGE_EXTERNAL)
|
||||||
|
{
|
||||||
if ((mykError = MYKONOS_runInitCals(mykDevice,
|
if ((mykError = MYKONOS_runInitCals(mykDevice,
|
||||||
TX_LO_LEAKAGE_EXTERNAL)) != MYKONOS_ERR_OK) {
|
TX_LO_LEAKAGE_EXTERNAL)) != MYKONOS_ERR_OK)
|
||||||
|
{
|
||||||
errorString = getMykonosErrorMessage(mykError);
|
errorString = getMykonosErrorMessage(mykError);
|
||||||
goto error_11;
|
goto error_11;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((mykError = MYKONOS_waitInitCals(mykDevice, 60000, &errorFlag,
|
if ((mykError = MYKONOS_waitInitCals(mykDevice, 60000, &errorFlag,
|
||||||
&errorCode)) != MYKONOS_ERR_OK) {
|
&errorCode)) != MYKONOS_ERR_OK)
|
||||||
|
{
|
||||||
errorString = getMykonosErrorMessage(mykError);
|
errorString = getMykonosErrorMessage(mykError);
|
||||||
goto error_11;
|
goto error_11;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((errorFlag != 0) || (errorCode != 0)) {
|
if ((errorFlag != 0) || (errorCode != 0))
|
||||||
|
{
|
||||||
/*** < Info: abort init cals > ***/
|
/*** < Info: abort init cals > ***/
|
||||||
if ((mykError = MYKONOS_abortInitCals(mykDevice,
|
if ((mykError = MYKONOS_abortInitCals(mykDevice,
|
||||||
&initCalsCompleted)) != MYKONOS_ERR_OK) {
|
&initCalsCompleted)) != MYKONOS_ERR_OK)
|
||||||
|
{
|
||||||
errorString = getMykonosErrorMessage(mykError);
|
errorString = getMykonosErrorMessage(mykError);
|
||||||
goto error_11;
|
goto error_11;
|
||||||
}
|
}
|
||||||
} else
|
}
|
||||||
printf("External LOL Calibrations completed successfully\n");
|
else
|
||||||
|
HW_PRINT("External LOL Calibrations completed successfully\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
@@ -649,7 +683,8 @@ int HW_9371Config(ad9528Device_t *clockAD9528_device, mykonosDevice_t *mykDevice
|
|||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
|
|
||||||
if ((mykError = MYKONOS_enableSysrefToRxFramer(mykDevice,
|
if ((mykError = MYKONOS_enableSysrefToRxFramer(mykDevice,
|
||||||
1)) != MYKONOS_ERR_OK) {
|
1)) != MYKONOS_ERR_OK)
|
||||||
|
{
|
||||||
errorString = getMykonosErrorMessage(mykError);
|
errorString = getMykonosErrorMessage(mykError);
|
||||||
goto error_11;
|
goto error_11;
|
||||||
}
|
}
|
||||||
@@ -657,7 +692,8 @@ int HW_9371Config(ad9528Device_t *clockAD9528_device, mykonosDevice_t *mykDevice
|
|||||||
* transmitting CGS from the RxFramer> ***/
|
* transmitting CGS from the RxFramer> ***/
|
||||||
|
|
||||||
if ((mykError = MYKONOS_enableSysrefToObsRxFramer(mykDevice,
|
if ((mykError = MYKONOS_enableSysrefToObsRxFramer(mykDevice,
|
||||||
1)) != MYKONOS_ERR_OK) {
|
1)) != MYKONOS_ERR_OK)
|
||||||
|
{
|
||||||
errorString = getMykonosErrorMessage(mykError);
|
errorString = getMykonosErrorMessage(mykError);
|
||||||
goto error_11;
|
goto error_11;
|
||||||
}
|
}
|
||||||
@@ -665,18 +701,20 @@ int HW_9371Config(ad9528Device_t *clockAD9528_device, mykonosDevice_t *mykDevice
|
|||||||
* transmitting CGS from the ObsRxFramer> ***/
|
* transmitting CGS from the ObsRxFramer> ***/
|
||||||
|
|
||||||
if ((mykError = MYKONOS_enableSysrefToDeframer(mykDevice,
|
if ((mykError = MYKONOS_enableSysrefToDeframer(mykDevice,
|
||||||
0)) != MYKONOS_ERR_OK) {
|
0)) != MYKONOS_ERR_OK)
|
||||||
|
{
|
||||||
errorString = getMykonosErrorMessage(mykError);
|
errorString = getMykonosErrorMessage(mykError);
|
||||||
goto error_11;
|
goto error_11;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((mykError = MYKONOS_resetDeframer(mykDevice)) != MYKONOS_ERR_OK) {
|
if ((mykError = MYKONOS_resetDeframer(mykDevice)) != MYKONOS_ERR_OK)
|
||||||
|
{
|
||||||
errorString = getMykonosErrorMessage(mykError);
|
errorString = getMykonosErrorMessage(mykError);
|
||||||
goto error_11;
|
goto error_11;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((mykError = MYKONOS_enableSysrefToDeframer(mykDevice,
|
if ((mykError = MYKONOS_enableSysrefToDeframer(mykDevice, 1)) != MYKONOS_ERR_OK)
|
||||||
1)) != MYKONOS_ERR_OK) {
|
{
|
||||||
errorString = getMykonosErrorMessage(mykError);
|
errorString = getMykonosErrorMessage(mykError);
|
||||||
goto error_11;
|
goto error_11;
|
||||||
}
|
}
|
||||||
@@ -704,7 +742,8 @@ int HW_9371Config(ad9528Device_t *clockAD9528_device, mykonosDevice_t *mykDevice
|
|||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
|
|
||||||
if ((mykError = MYKONOS_enableTrackingCals(mykDevice,
|
if ((mykError = MYKONOS_enableTrackingCals(mykDevice,
|
||||||
trackingCalMask)) != MYKONOS_ERR_OK) {
|
trackingCalMask)) != MYKONOS_ERR_OK)
|
||||||
|
{
|
||||||
errorString = getMykonosErrorMessage(mykError);
|
errorString = getMykonosErrorMessage(mykError);
|
||||||
goto error_11;
|
goto error_11;
|
||||||
}
|
}
|
||||||
@@ -714,19 +753,22 @@ int HW_9371Config(ad9528Device_t *clockAD9528_device, mykonosDevice_t *mykDevice
|
|||||||
|
|
||||||
/*** < Info: Function to turn radio on, Enables transmitters and receivers
|
/*** < Info: Function to turn radio on, Enables transmitters and receivers
|
||||||
* that were setup during MYKONOS_initialize() > ***/
|
* that were setup during MYKONOS_initialize() > ***/
|
||||||
if ((mykError = MYKONOS_radioOn(mykDevice)) != MYKONOS_ERR_OK) {
|
if ((mykError = MYKONOS_radioOn(mykDevice)) != MYKONOS_ERR_OK)
|
||||||
|
{
|
||||||
errorString = getMykonosErrorMessage(mykError);
|
errorString = getMykonosErrorMessage(mykError);
|
||||||
goto error_11;
|
goto error_11;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*** < Info: Allow TxQEC to run when User: is not actively using ORx receive path > ***/
|
/*** < Info: Allow TxQEC to run when User: is not actively using ORx receive path > ***/
|
||||||
if ((mykError = MYKONOS_setObsRxPathSource(mykDevice,
|
if ((mykError = MYKONOS_setObsRxPathSource(mykDevice,
|
||||||
OBS_RXOFF)) != MYKONOS_ERR_OK) {
|
OBS_RXOFF)) != MYKONOS_ERR_OK)
|
||||||
|
{
|
||||||
errorString = getMykonosErrorMessage(mykError);
|
errorString = getMykonosErrorMessage(mykError);
|
||||||
goto error_11;
|
goto error_11;
|
||||||
}
|
}
|
||||||
if ((mykError = MYKONOS_setObsRxPathSource(mykDevice,
|
if ((mykError = MYKONOS_setObsRxPathSource(mykDevice,
|
||||||
OBS_INTERNALCALS)) != MYKONOS_ERR_OK) {
|
OBS_INTERNALCALS)) != MYKONOS_ERR_OK)
|
||||||
|
{
|
||||||
errorString = getMykonosErrorMessage(mykError);
|
errorString = getMykonosErrorMessage(mykError);
|
||||||
goto error_11;
|
goto error_11;
|
||||||
}
|
}
|
||||||
@@ -734,26 +776,26 @@ int HW_9371Config(ad9528Device_t *clockAD9528_device, mykonosDevice_t *mykDevice
|
|||||||
mdelay(1000);
|
mdelay(1000);
|
||||||
|
|
||||||
if ((mykError = MYKONOS_setObsRxPathSource(mykDevice,
|
if ((mykError = MYKONOS_setObsRxPathSource(mykDevice,
|
||||||
OBS_RX1_SNIFFERLO)) != MYKONOS_ERR_OK) {
|
OBS_RX1_SNIFFERLO)) != MYKONOS_ERR_OK)
|
||||||
|
{
|
||||||
errorString = getMykonosErrorMessage(mykError);
|
errorString = getMykonosErrorMessage(mykError);
|
||||||
goto error_11;
|
goto error_11;
|
||||||
}
|
}
|
||||||
|
|
||||||
Xil_DCacheInvalidateRange(DDR_MEM_BASEADDR + 0x800000, 16384 * 8);
|
Xil_DCacheInvalidateRange(DDR_MEM_BASEADDR + 0x800000, 16384 * 8);
|
||||||
|
|
||||||
printf("Done\n");
|
HW_PRINT("Done\n");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
error_11:
|
error_11:
|
||||||
printf("%s", errorString);
|
HW_PRINT("%s", errorString);
|
||||||
|
|
||||||
error_2:
|
error_2:
|
||||||
// axi_clkgen_remove(rx_clkgen);
|
// axi_clkgen_remove(rx_clkgen);
|
||||||
return FAILURE;
|
return FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int HW_9371CheckJesdStatus(mykonosDevice_t *mykDevice, uint8_t *framerStatus,
|
int HW_9371CheckJesdStatus(mykonosDevice_t *mykDevice, uint8_t *framerStatus,
|
||||||
uint8_t *obsFramerStatus, uint8_t *deframerStatus)
|
uint8_t *obsFramerStatus, uint8_t *deframerStatus)
|
||||||
{
|
{
|
||||||
@@ -767,19 +809,24 @@ int HW_9371CheckJesdStatus(mykonosDevice_t *mykDevice, uint8_t *framerStatus,
|
|||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
|
|
||||||
if ((mykError = MYKONOS_readRxFramerStatus(mykDevice,
|
if ((mykError = MYKONOS_readRxFramerStatus(mykDevice,
|
||||||
framerStatus)) != MYKONOS_ERR_OK) {
|
framerStatus)) != MYKONOS_ERR_OK)
|
||||||
|
{
|
||||||
errorString = getMykonosErrorMessage(mykError);
|
errorString = getMykonosErrorMessage(mykError);
|
||||||
return ADIERR_FAILED;
|
return ADIERR_FAILED;
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
|
{
|
||||||
// typical value: 0x3E
|
// typical value: 0x3E
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((mykError = MYKONOS_readOrxFramerStatus(mykDevice,
|
if ((mykError = MYKONOS_readOrxFramerStatus(mykDevice,
|
||||||
obsFramerStatus)) != MYKONOS_ERR_OK) {
|
obsFramerStatus)) != MYKONOS_ERR_OK)
|
||||||
|
{
|
||||||
errorString = getMykonosErrorMessage(mykError);
|
errorString = getMykonosErrorMessage(mykError);
|
||||||
return ADIERR_FAILED;
|
return ADIERR_FAILED;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
// typical value: 0x3E
|
// typical value: 0x3E
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -788,17 +835,19 @@ int HW_9371CheckJesdStatus(mykonosDevice_t *mykDevice, uint8_t *framerStatus,
|
|||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
|
|
||||||
if ((mykError = MYKONOS_readDeframerStatus(mykDevice,
|
if ((mykError = MYKONOS_readDeframerStatus(mykDevice,
|
||||||
deframerStatus)) != MYKONOS_ERR_OK) {
|
deframerStatus)) != MYKONOS_ERR_OK)
|
||||||
|
{
|
||||||
errorString = getMykonosErrorMessage(mykError);
|
errorString = getMykonosErrorMessage(mykError);
|
||||||
return ADIERR_FAILED;
|
return ADIERR_FAILED;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
// typical value: 0x28
|
// typical value: 0x28
|
||||||
}
|
}
|
||||||
|
|
||||||
return ADIERR_OK;
|
return ADIERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int HW_9371SmallFrequencyChange(mykonosDevice_t *mykDevice, uint64_t freq_Hz)
|
int HW_9371SmallFrequencyChange(mykonosDevice_t *mykDevice, uint64_t freq_Hz)
|
||||||
{
|
{
|
||||||
mykonosErr_t mykError = MYKONOS_ERR_OK;
|
mykonosErr_t mykError = MYKONOS_ERR_OK;
|
||||||
@@ -808,7 +857,7 @@ int HW_9371SmallFrequencyChange(mykonosDevice_t *mykDevice, uint64_t freq_Hz)
|
|||||||
*/
|
*/
|
||||||
if ((mykError = MYKONOS_radioOff(mykDevice)) != MYKONOS_ERR_OK)
|
if ((mykError = MYKONOS_radioOff(mykDevice)) != MYKONOS_ERR_OK)
|
||||||
{
|
{
|
||||||
printf("Turn radio off failed!\n\r");
|
HW_PRINT("Turn radio off failed!\n\r");
|
||||||
return ADIERR_FAILED;
|
return ADIERR_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -818,14 +867,14 @@ int HW_9371SmallFrequencyChange(mykonosDevice_t *mykDevice, uint64_t freq_Hz)
|
|||||||
if ((mykError = MYKONOS_setRfPllFrequency(mykDevice, TX_PLL,
|
if ((mykError = MYKONOS_setRfPllFrequency(mykDevice, TX_PLL,
|
||||||
freq_Hz)) != MYKONOS_ERR_OK)
|
freq_Hz)) != MYKONOS_ERR_OK)
|
||||||
{
|
{
|
||||||
printf("Set TX PLL failed!\n\r");
|
HW_PRINT("Set TX PLL failed!\n\r");
|
||||||
return ADIERR_FAILED;
|
return ADIERR_FAILED;
|
||||||
}
|
}
|
||||||
mykError = MYKONOS_checkPllsLockStatus(mykDevice, &pllLockStatus);
|
mykError = MYKONOS_checkPllsLockStatus(mykDevice, &pllLockStatus);
|
||||||
if ((pllLockStatus & 0x07) != 0x07)
|
if ((pllLockStatus & 0x07) != 0x07)
|
||||||
{
|
{
|
||||||
/*** < Info: Clock, Rx and Tx PLLs not locked > ***/
|
/*** < Info: Clock, Rx and Tx PLLs not locked > ***/
|
||||||
printf("Not all PLLs locked, lock status: 0x%02x\n", pllLockStatus);
|
HW_PRINT("Not all PLLs locked, lock status: 0x%02x\n", pllLockStatus);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -834,7 +883,7 @@ int HW_9371SmallFrequencyChange(mykonosDevice_t *mykDevice, uint64_t freq_Hz)
|
|||||||
// If((mykError = MYKONOS_resetExtTxLolChannel(mykDevice, TX1_TX2))
|
// If((mykError = MYKONOS_resetExtTxLolChannel(mykDevice, TX1_TX2))
|
||||||
// != MYKONOS_ERR_OK) ; //where TX1_TX2 is part of the enum mykonosTxChannels_t
|
// != MYKONOS_ERR_OK) ; //where TX1_TX2 is part of the enum mykonosTxChannels_t
|
||||||
// {
|
// {
|
||||||
// printf("Reset external channel FAILED!");
|
// HW_PRINT("Reset external channel FAILED!");
|
||||||
// }
|
// }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -842,7 +891,7 @@ int HW_9371SmallFrequencyChange(mykonosDevice_t *mykDevice, uint64_t freq_Hz)
|
|||||||
*/
|
*/
|
||||||
if ((mykError = MYKONOS_radioOn(mykDevice)) != MYKONOS_ERR_OK)
|
if ((mykError = MYKONOS_radioOn(mykDevice)) != MYKONOS_ERR_OK)
|
||||||
{
|
{
|
||||||
printf("Turn radio on failed!\n\r");
|
HW_PRINT("Turn radio on failed!\n\r");
|
||||||
return ADIERR_FAILED;
|
return ADIERR_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -852,12 +901,11 @@ int HW_9371SmallFrequencyChange(mykonosDevice_t *mykDevice, uint64_t freq_Hz)
|
|||||||
// If((mykError = MYKONOS_MYKONOS_setObsRxPathSource(mykDevice, OBS_INTERNALCALS))
|
// If((mykError = MYKONOS_MYKONOS_setObsRxPathSource(mykDevice, OBS_INTERNALCALS))
|
||||||
// != MYKONOS_ERR_OK) ; //where TX1_TX2 is part of the enum mykonosTxChannels_t
|
// != MYKONOS_ERR_OK) ; //where TX1_TX2 is part of the enum mykonosTxChannels_t
|
||||||
// {
|
// {
|
||||||
// printf("Reenable tracking calibrations FAILED!");
|
// HW_PRINT("Reenable tracking calibrations FAILED!");
|
||||||
// }
|
// }
|
||||||
return ADIERR_OK;
|
return ADIERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int HW_9371LargeFrequencyChange(mykonosDevice_t *mykDevice, uint64_t freq_Hz)
|
int HW_9371LargeFrequencyChange(mykonosDevice_t *mykDevice, uint64_t freq_Hz)
|
||||||
{
|
{
|
||||||
mykonosErr_t mykError = MYKONOS_ERR_OK;
|
mykonosErr_t mykError = MYKONOS_ERR_OK;
|
||||||
@@ -875,7 +923,7 @@ int HW_9371LargeFrequencyChange(mykonosDevice_t *mykDevice, uint64_t freq_Hz)
|
|||||||
*/
|
*/
|
||||||
if ((mykError = MYKONOS_radioOff(mykDevice)) != MYKONOS_ERR_OK)
|
if ((mykError = MYKONOS_radioOff(mykDevice)) != MYKONOS_ERR_OK)
|
||||||
{
|
{
|
||||||
printf("Turn radio off failed!\n\r");
|
HW_PRINT("Turn radio off failed!\n\r");
|
||||||
return ADIERR_FAILED;
|
return ADIERR_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -885,14 +933,14 @@ int HW_9371LargeFrequencyChange(mykonosDevice_t *mykDevice, uint64_t freq_Hz)
|
|||||||
if ((mykError = MYKONOS_setRfPllFrequency(mykDevice, TX_PLL,
|
if ((mykError = MYKONOS_setRfPllFrequency(mykDevice, TX_PLL,
|
||||||
freq_Hz)) != MYKONOS_ERR_OK)
|
freq_Hz)) != MYKONOS_ERR_OK)
|
||||||
{
|
{
|
||||||
printf("Set TX PLL failed!\n\r");
|
HW_PRINT("Set TX PLL failed!\n\r");
|
||||||
return ADIERR_FAILED;
|
return ADIERR_FAILED;
|
||||||
}
|
}
|
||||||
mykError = MYKONOS_checkPllsLockStatus(mykDevice, &pllLockStatus);
|
mykError = MYKONOS_checkPllsLockStatus(mykDevice, &pllLockStatus);
|
||||||
if ((pllLockStatus & 0x07) != 0x07)
|
if ((pllLockStatus & 0x07) != 0x07)
|
||||||
{
|
{
|
||||||
/*** < Info: Clock, Rx and Tx PLLs not locked > ***/
|
/*** < Info: Clock, Rx and Tx PLLs not locked > ***/
|
||||||
printf("Not all PLLs locked, lock status: 0x%02x\n", pllLockStatus);
|
HW_PRINT("Not all PLLs locked, lock status: 0x%02x\n", pllLockStatus);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -900,34 +948,30 @@ int HW_9371LargeFrequencyChange(mykonosDevice_t *mykDevice, uint64_t freq_Hz)
|
|||||||
*/
|
*/
|
||||||
uint32_t initCalMask = TX_QEC_INIT | LOOPBACK_RX_LO_DELAY |
|
uint32_t initCalMask = TX_QEC_INIT | LOOPBACK_RX_LO_DELAY |
|
||||||
LOOPBACK_RX_RX_QEC_INIT | RX_LO_DELAY | RX_QEC_INIT;
|
LOOPBACK_RX_RX_QEC_INIT | RX_LO_DELAY | RX_QEC_INIT;
|
||||||
if ((mykError = MYKONOS_runInitCals(mykDevice, initCalMask))
|
if ((mykError = MYKONOS_runInitCals(mykDevice, initCalMask)) != MYKONOS_ERR_OK)
|
||||||
!= MYKONOS_ERR_OK)
|
|
||||||
{
|
{
|
||||||
printf("Rerun the initialization calibrations FAILED!");
|
HW_PRINT("Rerun the initialization calibrations FAILED!");
|
||||||
return ADIERR_FAILED;
|
return ADIERR_FAILED;
|
||||||
}
|
}
|
||||||
if ((mykError = MYKONOS_waitInitCals(mykDevice, 60000, &errorFlag,
|
if ((mykError = MYKONOS_waitInitCals(mykDevice, 60000, &errorFlag,
|
||||||
&errorCode)) != MYKONOS_ERR_OK)
|
&errorCode)) != MYKONOS_ERR_OK)
|
||||||
{
|
{
|
||||||
printf("Initialize calibration TIME OUT!");
|
HW_PRINT("Initialize calibration TIME OUT!");
|
||||||
return ADIERR_FAILED;
|
return ADIERR_FAILED;
|
||||||
}
|
}
|
||||||
if ((errorFlag != 0) || (errorCode != 0))
|
if ((errorFlag != 0) || (errorCode != 0))
|
||||||
{
|
{
|
||||||
printf("initial cals error!\n\r");
|
HW_PRINT("initial cals error!\n\r");
|
||||||
|
|
||||||
if((mykError = MYKONOS_getInitCalStatus(mykDevice, &initCalStatus))
|
if ((mykError = MYKONOS_getInitCalStatus(mykDevice, &initCalStatus)) != MYKONOS_ERR_OK)
|
||||||
!= MYKONOS_ERR_OK)
|
|
||||||
{
|
{
|
||||||
/*** < User log error return value to debug why init failed > ***/
|
/*** < User log error return value to debug why init failed > ***/
|
||||||
}
|
}
|
||||||
|
|
||||||
// abort init calibrations
|
// abort init calibrations
|
||||||
if((mykError = MYKONOS_abortInitCals(mykDevice, &initCalsCompleted))
|
if ((mykError = MYKONOS_abortInitCals(mykDevice, &initCalsCompleted)) != MYKONOS_ERR_OK)
|
||||||
!= MYKONOS_ERR_OK)
|
|
||||||
{
|
{
|
||||||
/*** < User log error return value to debug why init failed > ***/
|
/*** < User log error return value to debug why init failed > ***/
|
||||||
|
|
||||||
}
|
}
|
||||||
if (initCalsCompleted)
|
if (initCalsCompleted)
|
||||||
{
|
{
|
||||||
@@ -938,10 +982,8 @@ int HW_9371LargeFrequencyChange(mykonosDevice_t *mykDevice, uint64_t freq_Hz)
|
|||||||
{
|
{
|
||||||
/*** < User log error return value to debug why init failed > ***/
|
/*** < User log error return value to debug why init failed > ***/
|
||||||
}
|
}
|
||||||
if((mykError = MYKONOS_readArmCmdStatusByte(mykDevice, 2, &status))
|
if ((mykError = MYKONOS_readArmCmdStatusByte(mykDevice, 2, &status)) != MYKONOS_ERR_OK)
|
||||||
!= MYKONOS_ERR_OK)
|
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
if (status != 0)
|
if (status != 0)
|
||||||
{
|
{
|
||||||
@@ -955,26 +997,25 @@ int HW_9371LargeFrequencyChange(mykonosDevice_t *mykDevice, uint64_t freq_Hz)
|
|||||||
*/
|
*/
|
||||||
if ((mykError = MYKONOS_radioOn(mykDevice)) != MYKONOS_ERR_OK)
|
if ((mykError = MYKONOS_radioOn(mykDevice)) != MYKONOS_ERR_OK)
|
||||||
{
|
{
|
||||||
printf("Turn radio on failed!\n\r");
|
HW_PRINT("Turn radio on failed!\n\r");
|
||||||
return ADIERR_FAILED;
|
return ADIERR_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ADIERR_OK;
|
return ADIERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// void FreqIntrHandler(void *CallbackRef)
|
// void FreqIntrHandler(void *CallbackRef)
|
||||||
// {
|
// {
|
||||||
// XGpio *GpioPtr = (XGpio *)CallbackRef;
|
// XGpio *GpioPtr = (XGpio *)CallbackRef;
|
||||||
// uint8_t IntrStatus;
|
// uint8_t IntrStatus;
|
||||||
// uint32_t NewFreqHz;
|
// uint32_t NewFreqHz;
|
||||||
// IntrStatus = XGpio_InterruptGetStatus(GpioPtr);
|
// IntrStatus = XGpio_InterruptGetStatus(GpioPtr);
|
||||||
//
|
|
||||||
// if (IntrStatus & XGPIO_IR_CH1_MASK)
|
// if (IntrStatus & XGPIO_IR_CH1_MASK)
|
||||||
// {
|
// {
|
||||||
// /* Clear the Interrupt */
|
// /* Clear the Interrupt */
|
||||||
// XGpio_InterruptClear(GpioPtr, XGPIO_IR_CH1_MASK);
|
// XGpio_InterruptClear(GpioPtr, XGPIO_IR_CH1_MASK);
|
||||||
//
|
|
||||||
// NewFreqHz = XGpio_DiscreteRead(GpioPtr, AXI_GPIO_BANK_1);
|
// NewFreqHz = XGpio_DiscreteRead(GpioPtr, AXI_GPIO_BANK_1);
|
||||||
// if (NewFreqHz != mykDevice.tx->txPllLoFrequency_Hz)
|
// if (NewFreqHz != mykDevice.tx->txPllLoFrequency_Hz)
|
||||||
// {
|
// {
|
||||||
@@ -989,20 +1030,20 @@ int HW_9371LargeFrequencyChange(mykonosDevice_t *mykDevice, uint64_t freq_Hz)
|
|||||||
// HW_9371LargeFrequencyChange(&mykDevice, NewFreqHz);
|
// HW_9371LargeFrequencyChange(&mykDevice, NewFreqHz);
|
||||||
// }
|
// }
|
||||||
// mykDevice.tx->txPllLoFrequency_Hz = NewFreqHz;
|
// mykDevice.tx->txPllLoFrequency_Hz = NewFreqHz;
|
||||||
// printf("New Tx frequency set to %d Hz!\n",NewFreqHz);
|
// HW_PRINT("New Tx frequency set to %d Hz!\n", NewFreqHz);
|
||||||
// }
|
// }
|
||||||
// else
|
// else
|
||||||
// {
|
// {
|
||||||
// printf("The desired Tx Frequency is out of range(300 ~ 6000 MHz)!\n");
|
// HW_PRINT("The desired Tx Frequency is out of range(300 ~ 6000 MHz)!\n");
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
//
|
|
||||||
// if (IntrStatus & XGPIO_IR_CH2_MASK)
|
// if (IntrStatus & XGPIO_IR_CH2_MASK)
|
||||||
// {
|
// {
|
||||||
// /* Clear the Interrupt */
|
// /* Clear the Interrupt */
|
||||||
// XGpio_InterruptClear(GpioPtr, XGPIO_IR_CH2_MASK);
|
// XGpio_InterruptClear(GpioPtr, XGPIO_IR_CH2_MASK);
|
||||||
//
|
|
||||||
// NewFreqHz = XGpio_DiscreteRead(GpioPtr, AXI_GPIO_BANK_2);
|
// NewFreqHz = XGpio_DiscreteRead(GpioPtr, AXI_GPIO_BANK_2);
|
||||||
// if (NewFreqHz != mykDevice.rx->rxPllLoFrequency_Hz)
|
// if (NewFreqHz != mykDevice.rx->rxPllLoFrequency_Hz)
|
||||||
// {
|
// {
|
||||||
@@ -1017,29 +1058,28 @@ int HW_9371LargeFrequencyChange(mykonosDevice_t *mykDevice, uint64_t freq_Hz)
|
|||||||
// HW_9371LargeFrequencyChange(&mykDevice, NewFreqHz);
|
// HW_9371LargeFrequencyChange(&mykDevice, NewFreqHz);
|
||||||
// }
|
// }
|
||||||
// mykDevice.rx->rxPllLoFrequency_Hz = NewFreqHz;
|
// mykDevice.rx->rxPllLoFrequency_Hz = NewFreqHz;
|
||||||
// printf("New Rx frequency set to %d Hz!\n",NewFreqHz);
|
// HW_PRINT("New Rx frequency set to %d Hz!\n", NewFreqHz);
|
||||||
// }
|
// }
|
||||||
// else
|
// else
|
||||||
// {
|
// {
|
||||||
// printf("The desired Rx Frequency is out of range(300 ~ 6000 MHz)!\n");
|
// HW_PRINT("The desired Rx Frequency is out of range(300 ~ 6000 MHz)!\n");
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
//
|
|
||||||
//
|
|
||||||
// void GainIntrHandler(void *CallbackRef)
|
// void GainIntrHandler(void *CallbackRef)
|
||||||
// {
|
// {
|
||||||
// XGpio *GpioPtr = (XGpio *)CallbackRef;
|
// XGpio *GpioPtr = (XGpio *)CallbackRef;
|
||||||
// uint8_t IntrStatus;
|
// uint8_t IntrStatus;
|
||||||
// uint32_t NewRxGain;
|
// uint32_t NewRxGain;
|
||||||
// IntrStatus = XGpio_InterruptGetStatus(GpioPtr);
|
// IntrStatus = XGpio_InterruptGetStatus(GpioPtr);
|
||||||
//
|
|
||||||
// if (IntrStatus & XGPIO_IR_CH1_MASK)
|
// if (IntrStatus & XGPIO_IR_CH1_MASK)
|
||||||
// {
|
// {
|
||||||
// /* Clear the Interrupt */
|
// /* Clear the Interrupt */
|
||||||
// XGpio_InterruptClear(GpioPtr, XGPIO_IR_CH1_MASK);
|
// XGpio_InterruptClear(GpioPtr, XGPIO_IR_CH1_MASK);
|
||||||
//
|
|
||||||
// NewRxGain = XGpio_DiscreteRead(GpioPtr, AXI_GPIO_BANK_1);
|
// NewRxGain = XGpio_DiscreteRead(GpioPtr, AXI_GPIO_BANK_1);
|
||||||
// if (NewRxGain != mykDevice.rx->rxGainCtrl->rx1GainIndex)
|
// if (NewRxGain != mykDevice.rx->rxGainCtrl->rx1GainIndex)
|
||||||
// {
|
// {
|
||||||
@@ -1048,21 +1088,21 @@ int HW_9371LargeFrequencyChange(mykonosDevice_t *mykDevice, uint64_t freq_Hz)
|
|||||||
// MYKONOS_setRx1ManualGain(&mykDevice, NewRxGain);
|
// MYKONOS_setRx1ManualGain(&mykDevice, NewRxGain);
|
||||||
// mykDevice.rx->rxGainCtrl->rx1GainIndex = NewRxGain;
|
// mykDevice.rx->rxGainCtrl->rx1GainIndex = NewRxGain;
|
||||||
// char buf[BUFSIZ];
|
// char buf[BUFSIZ];
|
||||||
// sprintf(buf, "%u", NewRxGain);
|
// sHW_PRINT(buf, "%u", NewRxGain);
|
||||||
// printf("New Rx1 gain index set to %s!\n",buf);
|
// HW_PRINT("New Rx1 gain index set to %s!\n", buf);
|
||||||
// }
|
// }
|
||||||
// else
|
// else
|
||||||
// {
|
// {
|
||||||
// printf("The desired Rx1 gain index is out of range(195 ~ 255), 0.5dB per stage!\n");
|
// HW_PRINT("The desired Rx1 gain index is out of range(195 ~ 255), 0.5dB per stage!\n");
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
//
|
|
||||||
// if (IntrStatus & XGPIO_IR_CH2_MASK)
|
// if (IntrStatus & XGPIO_IR_CH2_MASK)
|
||||||
// {
|
// {
|
||||||
// /* Clear the Interrupt */
|
// /* Clear the Interrupt */
|
||||||
// XGpio_InterruptClear(GpioPtr, XGPIO_IR_CH2_MASK);
|
// XGpio_InterruptClear(GpioPtr, XGPIO_IR_CH2_MASK);
|
||||||
//
|
|
||||||
// NewRxGain = XGpio_DiscreteRead(GpioPtr, AXI_GPIO_BANK_2);
|
// NewRxGain = XGpio_DiscreteRead(GpioPtr, AXI_GPIO_BANK_2);
|
||||||
// if (NewRxGain != mykDevice.rx->rxGainCtrl->rx2GainIndex)
|
// if (NewRxGain != mykDevice.rx->rxGainCtrl->rx2GainIndex)
|
||||||
// {
|
// {
|
||||||
@@ -1071,30 +1111,29 @@ int HW_9371LargeFrequencyChange(mykonosDevice_t *mykDevice, uint64_t freq_Hz)
|
|||||||
// MYKONOS_setRx2ManualGain(&mykDevice, NewRxGain);
|
// MYKONOS_setRx2ManualGain(&mykDevice, NewRxGain);
|
||||||
// mykDevice.rx->rxGainCtrl->rx2GainIndex = NewRxGain;
|
// mykDevice.rx->rxGainCtrl->rx2GainIndex = NewRxGain;
|
||||||
// char buf[BUFSIZ];
|
// char buf[BUFSIZ];
|
||||||
// sprintf(buf, "%u", NewRxGain);
|
// sHW_PRINT(buf, "%u", NewRxGain);
|
||||||
// printf("New Rx2 gain index set to %s!\n",buf);
|
// HW_PRINT("New Rx2 gain index set to %s!\n", buf);
|
||||||
// }
|
// }
|
||||||
// else
|
// else
|
||||||
// {
|
// {
|
||||||
// printf("The desired Rx2 gain index is out of range(195 ~ 255), 0.5dB per stage!\n");
|
// HW_PRINT("The desired Rx2 gain index is out of range(195 ~ 255), 0.5dB per stage!\n");
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
//
|
|
||||||
//
|
|
||||||
// void AttnIntrHandler(void *CallbackRef)
|
// void AttnIntrHandler(void *CallbackRef)
|
||||||
// {
|
// {
|
||||||
// XGpio *GpioPtr = (XGpio *)CallbackRef;
|
// XGpio *GpioPtr = (XGpio *)CallbackRef;
|
||||||
// uint8_t IntrStatus;
|
// uint8_t IntrStatus;
|
||||||
// uint32_t NewTxAttn;
|
// uint32_t NewTxAttn;
|
||||||
// IntrStatus = XGpio_InterruptGetStatus(GpioPtr);
|
// IntrStatus = XGpio_InterruptGetStatus(GpioPtr);
|
||||||
//
|
|
||||||
// if (IntrStatus & XGPIO_IR_CH1_MASK)
|
// if (IntrStatus & XGPIO_IR_CH1_MASK)
|
||||||
// {
|
// {
|
||||||
// /* Clear the Interrupt */
|
// /* Clear the Interrupt */
|
||||||
// XGpio_InterruptClear(GpioPtr, XGPIO_IR_CH1_MASK);
|
// XGpio_InterruptClear(GpioPtr, XGPIO_IR_CH1_MASK);
|
||||||
//
|
|
||||||
// NewTxAttn = XGpio_DiscreteRead(GpioPtr, AXI_GPIO_BANK_1);
|
// NewTxAttn = XGpio_DiscreteRead(GpioPtr, AXI_GPIO_BANK_1);
|
||||||
// if (NewTxAttn != mykDevice.tx->tx1Atten_mdB)
|
// if (NewTxAttn != mykDevice.tx->tx1Atten_mdB)
|
||||||
// {
|
// {
|
||||||
@@ -1103,21 +1142,21 @@ int HW_9371LargeFrequencyChange(mykonosDevice_t *mykDevice, uint64_t freq_Hz)
|
|||||||
// MYKONOS_setTx1Attenuation(&mykDevice, NewTxAttn);
|
// MYKONOS_setTx1Attenuation(&mykDevice, NewTxAttn);
|
||||||
// mykDevice.tx->tx1Atten_mdB = NewTxAttn;
|
// mykDevice.tx->tx1Atten_mdB = NewTxAttn;
|
||||||
// char buf[BUFSIZ];
|
// char buf[BUFSIZ];
|
||||||
// sprintf(buf, "%u", NewTxAttn);
|
// sHW_PRINT(buf, "%u", NewTxAttn);
|
||||||
// printf("New Tx1 attenuation set to %s dBm!\n",buf);
|
// HW_PRINT("New Tx1 attenuation set to %s dBm!\n", buf);
|
||||||
// }
|
// }
|
||||||
// else
|
// else
|
||||||
// {
|
// {
|
||||||
// printf("The desired Tx1 attenuation is out of range(0 ~ 41950 dBm), 50 dBm step!\n");
|
// HW_PRINT("The desired Tx1 attenuation is out of range(0 ~ 41950 dBm), 50 dBm step!\n");
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
//
|
|
||||||
// if (IntrStatus & XGPIO_IR_CH2_MASK)
|
// if (IntrStatus & XGPIO_IR_CH2_MASK)
|
||||||
// {
|
// {
|
||||||
// /* Clear the Interrupt */
|
// /* Clear the Interrupt */
|
||||||
// XGpio_InterruptClear(GpioPtr, XGPIO_IR_CH2_MASK);
|
// XGpio_InterruptClear(GpioPtr, XGPIO_IR_CH2_MASK);
|
||||||
//
|
|
||||||
// NewTxAttn = XGpio_DiscreteRead(GpioPtr, AXI_GPIO_BANK_2);
|
// NewTxAttn = XGpio_DiscreteRead(GpioPtr, AXI_GPIO_BANK_2);
|
||||||
// if (NewTxAttn != mykDevice.tx->tx2Atten_mdB)
|
// if (NewTxAttn != mykDevice.tx->tx2Atten_mdB)
|
||||||
// {
|
// {
|
||||||
@@ -1126,12 +1165,12 @@ int HW_9371LargeFrequencyChange(mykonosDevice_t *mykDevice, uint64_t freq_Hz)
|
|||||||
// MYKONOS_setTx2Attenuation(&mykDevice, NewTxAttn);
|
// MYKONOS_setTx2Attenuation(&mykDevice, NewTxAttn);
|
||||||
// mykDevice.tx->tx2Atten_mdB = NewTxAttn;
|
// mykDevice.tx->tx2Atten_mdB = NewTxAttn;
|
||||||
// char buf[BUFSIZ];
|
// char buf[BUFSIZ];
|
||||||
// sprintf(buf, "%u", NewTxAttn);
|
// sHW_PRINT(buf, "%u", NewTxAttn);
|
||||||
// printf("New Tx2 attenuation set to %s dBm!\n",buf);
|
// HW_PRINT("New Tx2 attenuation set to %s dBm!\n", buf);
|
||||||
// }
|
// }
|
||||||
// else
|
// else
|
||||||
// {
|
// {
|
||||||
// printf("The desired Tx2 attenuation is out of range(0 ~ 41950 dBm), 50 dBm step!\n");
|
// HW_PRINT("The desired Tx2 attenuation is out of range(0 ~ 41950 dBm), 50 dBm step!\n");
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* headless.h
|
* headless.h
|
||||||
*
|
*
|
||||||
* Created on: 2021Äê6ÔÂ8ÈÕ
|
* Created on: 2021��6��8��
|
||||||
* Author: Josh
|
* Author: Josh
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -30,7 +30,8 @@
|
|||||||
/**************************** Type Definitions *******************************/
|
/**************************** Type Definitions *******************************/
|
||||||
|
|
||||||
/***************** Macros (Inline Functions) Definitions *********************/
|
/***************** Macros (Inline Functions) Definitions *********************/
|
||||||
|
#define HW_PRINT(...) __asm__("nop")
|
||||||
|
// #define HW_PRINT(...) printf(__VA_ARGS__)
|
||||||
/************************** Variable Definitions *****************************/
|
/************************** Variable Definitions *****************************/
|
||||||
|
|
||||||
/************************** Function Prototypes ******************************/
|
/************************** Function Prototypes ******************************/
|
||||||
|
|||||||
+130
-113
@@ -36,7 +36,7 @@
|
|||||||
#include "timer.h"
|
#include "timer.h"
|
||||||
#include "config/app_config.h"
|
#include "config/app_config.h"
|
||||||
#include "dev_profile/dev_profile.h"
|
#include "dev_profile/dev_profile.h"
|
||||||
#include "systembus/systembus.h"
|
#include "mpc/mpc.h"
|
||||||
#include "networking/phy_layer/phy_layer.h"
|
#include "networking/phy_layer/phy_layer.h"
|
||||||
#include "networking/link_layer/link_layer.h"
|
#include "networking/link_layer/link_layer.h"
|
||||||
// RF-Driver
|
// RF-Driver
|
||||||
@@ -48,36 +48,42 @@ int32_t SetupInterruptSystem(struct irq_ctrl_desc *descPtr);
|
|||||||
void Phy_IntrHandler(void *context);
|
void Phy_IntrHandler(void *context);
|
||||||
void PeriodicPull_Handler(void *callBackRef);
|
void PeriodicPull_Handler(void *callBackRef);
|
||||||
void ScuTimer_IntrHandler(void *context);
|
void ScuTimer_IntrHandler(void *context);
|
||||||
void Systembus_RxIntrHandler(void *context);
|
void Mpc_RxIntrHandler(void *context);
|
||||||
void Systembus_TxIntrHandler(void *context);
|
void Mpc_TxIntrHandler(void *context);
|
||||||
/************************** Constant Definitions *****************************/
|
/************************** Constant Definitions *****************************/
|
||||||
struct callback_desc phy_callback_desc = {
|
struct callback_desc phy_callback_desc =
|
||||||
|
{
|
||||||
.callback = Phy_IntrHandler,
|
.callback = Phy_IntrHandler,
|
||||||
.ctx = NULL
|
.ctx = NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
struct callback_desc periodicpull_callback_desc = {
|
struct callback_desc periodicpull_callback_desc =
|
||||||
|
{
|
||||||
.callback = PeriodicPull_Handler,
|
.callback = PeriodicPull_Handler,
|
||||||
.ctx = NULL
|
.ctx = NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
struct callback_desc sysbus_rx_callback_desc = {
|
struct callback_desc mpc_rx_callback_desc =
|
||||||
.callback = Systembus_RxIntrHandler,
|
{
|
||||||
|
.callback = Mpc_RxIntrHandler,
|
||||||
.ctx = NULL
|
.ctx = NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
struct callback_desc sysbus_tx_callback_desc = {
|
struct callback_desc mpc_tx_callback_desc =
|
||||||
.callback = Systembus_TxIntrHandler,
|
{
|
||||||
|
.callback = Mpc_TxIntrHandler,
|
||||||
.ctx = NULL
|
.ctx = NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
struct callback_desc scutm_callback_desc = {
|
struct callback_desc scutm_callback_desc =
|
||||||
|
{
|
||||||
.callback = ScuTimer_IntrHandler,
|
.callback = ScuTimer_IntrHandler,
|
||||||
.ctx = NULL
|
.ctx = NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
L2_CONFIG linkConfig = {
|
L2_CONFIG linkConfig =
|
||||||
|
{
|
||||||
.myType = L2_NODE_HEAD,
|
.myType = L2_NODE_HEAD,
|
||||||
.clustId = 1,
|
.clustId = 1,
|
||||||
.myId = 1,
|
.myId = 1,
|
||||||
@@ -99,29 +105,37 @@ L2_CONFIG linkConfig = {
|
|||||||
// .tmcInstPtr = NULL
|
// .tmcInstPtr = NULL
|
||||||
// };
|
// };
|
||||||
|
|
||||||
static PHY_CONFIG phyConfig = {
|
static PHY_CONFIG phyConfig =
|
||||||
|
{
|
||||||
.devId = 0,
|
.devId = 0,
|
||||||
.baseAddr = PHY_BASEADDR,
|
.baseAddr = PHY_BASEADDR,
|
||||||
.antBramId = PHY_ANTCONFIG_BRAM_DEVICE_ID,
|
.antBramId = PHY_ANTCONFIG_BRAM_DEVICE_ID,
|
||||||
|
.antInfoBramId = -1,
|
||||||
.txBramId = PHY_TXBUFF_BRAM_DEVICE_ID,
|
.txBramId = PHY_TXBUFF_BRAM_DEVICE_ID,
|
||||||
.rxBramId = PHY_RXBUFF_BRAM_DEVICE_ID,
|
.rxBramId = PHY_RXBUFF_BRAM_DEVICE_ID,
|
||||||
.hwXadcId = PHY_HW_XADC_DEVICE_ID
|
.hwXadcId = PHY_HW_XADC_DEVICE_ID,
|
||||||
|
.get_clk_state = NULL,
|
||||||
|
.get_ad_lock_state = NULL,
|
||||||
|
.get_ad0_temp = NULL,
|
||||||
|
.get_ad1_temp = NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
TMC_CONFIG tmcConfig = {
|
TMC_CONFIG tmcConfig =
|
||||||
|
{
|
||||||
.baseAddr = TIME_CONTROLLER_BASEADDR,
|
.baseAddr = TIME_CONTROLLER_BASEADDR,
|
||||||
.reset = 10
|
.reset = 10
|
||||||
};
|
};
|
||||||
|
|
||||||
//static SYSBUS_CONFIG sysbusConfig = {
|
static MPC_CONFIG mpcConfig = {
|
||||||
// .baseAddr = SYSBUS_BASE_ADDR,
|
.bramId = MPC_BRAM_ID,
|
||||||
// .txQueueMax = 16,
|
.gpioId = MPC_GPIO_ID,
|
||||||
// .rxQueueMax = 16
|
.txQueueMax = 16,
|
||||||
//};
|
.rxQueueMax = 16
|
||||||
|
};
|
||||||
/************************** Function Prototypes ******************************/
|
/************************** Function Prototypes ******************************/
|
||||||
static struct irq_ctrl_desc *intcDescPtr; // General interrupt controller descriptor
|
static struct irq_ctrl_desc *intcDescPtr; // General interrupt controller descriptor
|
||||||
static struct timer_desc *logTmPtr;
|
static struct timer_desc *logTmPtr;
|
||||||
static SYSBUS *sysbusDescPtr;
|
static MPC *mpcDescPtr;
|
||||||
static PHY_INST *phyInstPtr;
|
static PHY_INST *phyInstPtr;
|
||||||
static TMC_INST *tmcInstPtr = NULL;
|
static TMC_INST *tmcInstPtr = NULL;
|
||||||
L2_INST *linkInstPtr;
|
L2_INST *linkInstPtr;
|
||||||
@@ -200,64 +214,64 @@ int32_t SetupInterruptSystem(struct irq_ctrl_desc *descPtr)
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
// /* Initialize system bus interrupt. */
|
/* Initialize system bus interrupt. */
|
||||||
// Status = irq_trigger_level_set(descPtr, SYSBUS_TX_INTR_ID, IRQ_EDGE_RISING);
|
Status = irq_trigger_level_set(descPtr, MPC_TX_INTR_ID, IRQ_EDGE_RISING);
|
||||||
// if (Status != SUCCESS)
|
if (Status != SUCCESS)
|
||||||
// {
|
{
|
||||||
// DBG_ERROR("PHY_INTR trigger level set FAILED, ErrorCode: %" PRId32 ".\n", Status);
|
DBG_ERROR("PHY_INTR trigger level set FAILED, ErrorCode: %" PRId32 ".\n", Status);
|
||||||
// return Status;
|
return Status;
|
||||||
// }
|
}
|
||||||
// // Set interrupt priority
|
// Set interrupt priority
|
||||||
// Status = irq_set_priority(descPtr, SYSBUS_TX_INTR_ID, 0x10);
|
Status = irq_set_priority(descPtr, MPC_TX_INTR_ID, 0x10);
|
||||||
// if (Status != SUCCESS)
|
if (Status != SUCCESS)
|
||||||
// {
|
{
|
||||||
// DBG_ERROR("PHY_INTR priority level set FAILED, ErrorCode: %" PRId32 ".\n", Status);
|
DBG_ERROR("PHY_INTR priority level set FAILED, ErrorCode: %" PRId32 ".\n", Status);
|
||||||
// return Status;
|
return Status;
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// // Connect the interrupt service routine isr1 to the interrupt controller
|
// Connect the interrupt service routine isr1 to the interrupt controller
|
||||||
// Status = irq_register_callback(descPtr, SYSBUS_TX_INTR_ID, &sysbus_tx_callback_desc);
|
Status = irq_register_callback(descPtr, MPC_TX_INTR_ID, &mpc_tx_callback_desc);
|
||||||
// if (Status != SUCCESS)
|
if (Status != SUCCESS)
|
||||||
// {
|
{
|
||||||
// DBG_ERROR("PHY_INTR register callback FAILED, ErrorCode: %" PRId32 ".\n", Status);
|
DBG_ERROR("PHY_INTR register callback FAILED, ErrorCode: %" PRId32 ".\n", Status);
|
||||||
// return Status;
|
return Status;
|
||||||
// }
|
}
|
||||||
// Status = irq_trigger_level_set(descPtr, SYSBUS_RX_INTR_ID, IRQ_EDGE_RISING);
|
Status = irq_trigger_level_set(descPtr, MPC_RX_INTR_ID, IRQ_EDGE_RISING);
|
||||||
// if (Status != SUCCESS)
|
if (Status != SUCCESS)
|
||||||
// {
|
{
|
||||||
// DBG_ERROR("PHY_INTR trigger level set FAILED, ErrorCode: %" PRId32 ".\n", Status);
|
DBG_ERROR("PHY_INTR trigger level set FAILED, ErrorCode: %" PRId32 ".\n", Status);
|
||||||
// return Status;
|
return Status;
|
||||||
// }
|
}
|
||||||
// // Set interrupt priority
|
// Set interrupt priority
|
||||||
// Status = irq_set_priority(descPtr, SYSBUS_RX_INTR_ID, 0x18);
|
Status = irq_set_priority(descPtr, MPC_RX_INTR_ID, 0x18);
|
||||||
// if (Status != SUCCESS)
|
if (Status != SUCCESS)
|
||||||
// {
|
{
|
||||||
// DBG_ERROR("PHY_INTR priority level set FAILED, ErrorCode: %" PRId32 ".\n", Status);
|
DBG_ERROR("PHY_INTR priority level set FAILED, ErrorCode: %" PRId32 ".\n", Status);
|
||||||
// return Status;
|
return Status;
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// // Connect the interrupt service routine isr1 to the interrupt controller
|
// Connect the interrupt service routine isr1 to the interrupt controller
|
||||||
// Status = irq_register_callback(descPtr, SYSBUS_RX_INTR_ID, &sysbus_rx_callback_desc);
|
Status = irq_register_callback(descPtr, MPC_RX_INTR_ID, &mpc_rx_callback_desc);
|
||||||
// if (Status != SUCCESS)
|
if (Status != SUCCESS)
|
||||||
// {
|
{
|
||||||
// DBG_ERROR("PHY_INTR register callback FAILED, ErrorCode: %" PRId32 ".\n", Status);
|
DBG_ERROR("PHY_INTR register callback FAILED, ErrorCode: %" PRId32 ".\n", Status);
|
||||||
// return Status;
|
return Status;
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// /* Initialize Scu timer interrupt. */
|
/* Initialize Scu timer interrupt. */
|
||||||
// // Connect the interrupt service routine isr1 to the interrupt controller
|
// Connect the interrupt service routine isr1 to the interrupt controller
|
||||||
// Status = irq_register_callback(descPtr, SCUTIMER_INTR_ID, &scutm_callback_desc);
|
Status = irq_register_callback(descPtr, SCUTIMER_INTR_ID, &scutm_callback_desc);
|
||||||
// if (Status != SUCCESS)
|
if (Status != SUCCESS)
|
||||||
// {
|
{
|
||||||
// DBG_ERROR("PHY_INTR register callback FAILED, ErrorCode: %" PRId32 ".\n", Status);
|
DBG_ERROR("PHY_INTR register callback FAILED, ErrorCode: %" PRId32 ".\n", Status);
|
||||||
// return Status;
|
return Status;
|
||||||
// }
|
}
|
||||||
|
|
||||||
// Enable interrupts
|
// Enable interrupts
|
||||||
irq_enable(descPtr, PHY_INTR_ID);
|
irq_enable(descPtr, PHY_INTR_ID);
|
||||||
irq_enable(descPtr, PERIODIC_5MS_INTR_ID);
|
irq_enable(descPtr, PERIODIC_5MS_INTR_ID);
|
||||||
// irq_enable(descPtr, SYSBUS_RX_INTR_ID);
|
irq_enable(descPtr, MPC_RX_INTR_ID);
|
||||||
// irq_enable(descPtr, SYSBUS_TX_INTR_ID);
|
irq_enable(descPtr, MPC_TX_INTR_ID);
|
||||||
irq_enable(descPtr, SCUTIMER_INTR_ID);
|
irq_enable(descPtr, SCUTIMER_INTR_ID);
|
||||||
|
|
||||||
// Enable Exceptions
|
// Enable Exceptions
|
||||||
@@ -315,13 +329,13 @@ void PeriodicPull_Handler(void *callBackRef)
|
|||||||
* @return None.
|
* @return None.
|
||||||
*
|
*
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
void Systembus_RxIntrHandler(void *context)
|
void Mpc_RxIntrHandler(void *context)
|
||||||
{
|
{
|
||||||
int32_t Status;
|
int32_t Status;
|
||||||
Status = SystemBus_RxIntrHandler(sysbusDescPtr);
|
Status = Mpc_RxIrqHandler(mpcDescPtr);
|
||||||
if (Status != SUCCESS)
|
if (Status != SUCCESS)
|
||||||
{
|
{
|
||||||
DBG_ERROR("SystemBus_RxIntrHandler exit with error code %" PRId32 ",\n", Status);
|
DBG_ERROR("Mpc_RxIrqHandler exit with error code %" PRId32 ",\n", Status);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -334,13 +348,13 @@ void Systembus_RxIntrHandler(void *context)
|
|||||||
* @return None.
|
* @return None.
|
||||||
*
|
*
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
void Systembus_TxIntrHandler(void *context)
|
void Mpc_TxIntrHandler(void *context)
|
||||||
{
|
{
|
||||||
int32_t Status;
|
int32_t Status;
|
||||||
Status = SystemBus_TxIntrHandler(sysbusDescPtr);
|
Status = Mpc_TxIrqHandler(mpcDescPtr);
|
||||||
if (Status != SUCCESS)
|
if (Status != SUCCESS)
|
||||||
{
|
{
|
||||||
DBG_ERROR("SystemBus_TxIntrHandler exit with error code %" PRId32 ",\n", Status);
|
DBG_ERROR("Mpc_TxIrqHandler exit with error code %" PRId32 ",\n", Status);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -361,6 +375,15 @@ void ScuTimer_IntrHandler(void *context)
|
|||||||
{
|
{
|
||||||
// Refresh log
|
// Refresh log
|
||||||
Phy_RefreshHwSate(phyInstPtr);
|
Phy_RefreshHwSate(phyInstPtr);
|
||||||
|
|
||||||
|
if (Mpc_IsEnable(mpcDescPtr))
|
||||||
|
{
|
||||||
|
if (Mpc_PendRemoteTest(mpcDescPtr) != SUCCESS)
|
||||||
|
{
|
||||||
|
DBG_ERROR("Failed to apply remote test.\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
XScuTimer_ClearInterruptStatus((XScuTimer *)xdesc->instance);
|
XScuTimer_ClearInterruptStatus((XScuTimer *)xdesc->instance);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -445,13 +468,13 @@ int main(void)
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
// /* System Bus Initialize */
|
/* System Bus Initialize */
|
||||||
// Status = SystemBus_Init(&sysbusDescPtr, &sysbusConfig);
|
Status = Mpc_Init(&mpcDescPtr, &mpcConfig);
|
||||||
// if (Status != SUCCESS)
|
if (Status != SUCCESS)
|
||||||
// {
|
{
|
||||||
// DBG_ERROR("Systembus init FAILED, with error code: %" PRId32 "\n", Status);
|
DBG_ERROR("MPC init FAILED, with error code: %" PRId32 "\n", Status);
|
||||||
// return Status;
|
return Status;
|
||||||
// }
|
}
|
||||||
|
|
||||||
/* System Monitor log timer Initialize */
|
/* System Monitor log timer Initialize */
|
||||||
Status = timer_init(&logTmPtr, &scutimer_init_param);
|
Status = timer_init(&logTmPtr, &scutimer_init_param);
|
||||||
@@ -479,30 +502,24 @@ int main(void)
|
|||||||
DBG_PRINT("Physical started...\n");
|
DBG_PRINT("Physical started...\n");
|
||||||
Phy_Start(phyInstPtr);
|
Phy_Start(phyInstPtr);
|
||||||
|
|
||||||
Linklayer_Start(linkInstPtr);
|
while (true)
|
||||||
|
{
|
||||||
while (true);
|
// System bus handler
|
||||||
|
if (Mpc_IsReqPending(mpcDescPtr))
|
||||||
// while (true)
|
{
|
||||||
// {
|
Status = Mpc_HandleCmd(mpcDescPtr);
|
||||||
// // System bus handler
|
if (Status != SUCCESS)
|
||||||
// if (SystemBus_IsReqPendding(sysbusDescPtr))
|
{
|
||||||
// {
|
DBG_ERROR("Mpc_HandleCmd exit with ErrorCode: %" PRId32 ".\n", Status);
|
||||||
// Status = SystemBus_HandleCmd(sysbusDescPtr);
|
}
|
||||||
// if (Status != SUCCESS)
|
}
|
||||||
// {
|
if (Mpc_IsRsqPending(mpcDescPtr) && (!Mpc_IsTxBusy(mpcDescPtr)))
|
||||||
// DBG_ERROR("SystemBus_HandleCmd exit with ErrorCode: %" PRId32 ".\n", Status);
|
{
|
||||||
// }
|
Status = Mpc_MakeResp(mpcDescPtr);
|
||||||
// }
|
if (Status != SUCCESS)
|
||||||
// if (SystemBus_IsRsqPendding(sysbusDescPtr) && (!SystemBus_IsTxBusy(sysbusDescPtr)))
|
{
|
||||||
// {
|
DBG_ERROR("Mpc_HandleCmd exit with ErrorCode: %" PRId32 ".\n", Status);
|
||||||
// // FIXME: Required by 12 (CASC)
|
}
|
||||||
// udelay(200);
|
}
|
||||||
// Status = SystemBus_MakeResp(sysbusDescPtr);
|
}
|
||||||
// if (Status != SUCCESS)
|
|
||||||
// {
|
|
||||||
// DBG_ERROR("SystemBus_HandleCmd exit with ErrorCode: %" PRId32 ".\n", Status);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
} // main
|
} // main
|
||||||
|
|||||||
@@ -0,0 +1,550 @@
|
|||||||
|
/*****************************************************************************/
|
||||||
|
/**
|
||||||
|
* Description: MPC protocol implementation file.
|
||||||
|
*
|
||||||
|
* Date: 2023-05-06 10:13
|
||||||
|
* Last Edit Time: [2023-05-06 21:45]
|
||||||
|
*
|
||||||
|
* Revisions: Rev 0.0
|
||||||
|
* History:
|
||||||
|
* [2023-05-06]: Initial version.
|
||||||
|
* [2023-09-13]: Update to 485 protocol-20220816
|
||||||
|
*
|
||||||
|
* Copyright(c) 2021 Beijing Institute of Technology.
|
||||||
|
* Lab of Communication and Network
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/***************************** Include Files *********************************/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "mpc.h"
|
||||||
|
#include "util.h"
|
||||||
|
#include "common.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "circ_queue.h"
|
||||||
|
#include "xbram.h"
|
||||||
|
#include "xgpio.h"
|
||||||
|
|
||||||
|
#include "../system_monitor.h"
|
||||||
|
|
||||||
|
/************************** Constant Definitions *****************************/
|
||||||
|
// Common Field
|
||||||
|
// -- Command word
|
||||||
|
#define WD_CMD 0x00
|
||||||
|
|
||||||
|
// -- Production type
|
||||||
|
#define WD_PRD 0x01
|
||||||
|
#define PRD_DL_K 0xDD
|
||||||
|
#define PRD_DL_S 0xEE
|
||||||
|
#define PRD_ALL 0xFF
|
||||||
|
|
||||||
|
// Self-Test
|
||||||
|
#define CMD_SELF_TEST 0xE1
|
||||||
|
// -- Request
|
||||||
|
// -- -- --
|
||||||
|
// -- Response
|
||||||
|
// -- -- Self-Test Result
|
||||||
|
#define ST_RSP_LEN 16
|
||||||
|
#define WD_ST_RET 0x02
|
||||||
|
#define ST_RET_OK 0xAA
|
||||||
|
#define ST_RET_ERROR 0x55
|
||||||
|
#define ST_RET_INFO_LEN 13
|
||||||
|
// -- -- Signal processor PS voltage
|
||||||
|
#define WD_SP_FPGA_VOLT 0x03
|
||||||
|
// -- -- Signal processor PS AUX voltage
|
||||||
|
#define WD_SP_CLK_STATE 0x04
|
||||||
|
// -- -- Signal processor DDR voltage
|
||||||
|
#define WD_SP_AD_LOCK_STATE 0x05
|
||||||
|
// -- -- Signal processor PL voltage
|
||||||
|
#define WD_SP_AD_TEMP_0 0x06
|
||||||
|
// -- -- Signal processor PL AUX voltage
|
||||||
|
#define WD_SP_AD_TEMP_1 0x07
|
||||||
|
// -- -- Signal processor Bram voltage
|
||||||
|
#define WD_SP_FPGA_TEMP 0x08
|
||||||
|
|
||||||
|
// Config load
|
||||||
|
#define CMD_CONFIG 0xE3
|
||||||
|
// -- Request
|
||||||
|
#define WD_EN_CMD 0x02
|
||||||
|
#define EN_CMD_ON_HIGH_POWER 0x66
|
||||||
|
#define EN_CMD_ON_LOW_POWER 0x77
|
||||||
|
#define EN_CMD_SILENT 0x88
|
||||||
|
|
||||||
|
#define WD_MODE_CMD 0x03
|
||||||
|
#define MODE_CMD_HEAD 0x11
|
||||||
|
#define MODE_CMD_MEMBER 0x00
|
||||||
|
// -- Response
|
||||||
|
// -- -- none response
|
||||||
|
|
||||||
|
// Remote Test
|
||||||
|
#define RM_TEST_RESP_LEN 158
|
||||||
|
// -- Request
|
||||||
|
// Remote Test FLJ
|
||||||
|
#define CMD_FLJ_RM_TEST 0xE6
|
||||||
|
// Remote Test LJ
|
||||||
|
#define CMD_LJ_RM_TEST 0xF6
|
||||||
|
#define WD_RM_TEST 0x02
|
||||||
|
#define RM_TEST_CODE 0x99
|
||||||
|
// -- Response
|
||||||
|
#define WD_TIME_STAMP 0x02
|
||||||
|
#define WD_TIME_STAMP_LEN 8
|
||||||
|
#define WD_SYSBUS_LOG 0x0A
|
||||||
|
#define WD_SYSBUS_LOG_LEN 14
|
||||||
|
#define WD_LINK_LOG 0x18
|
||||||
|
#define WD_LINK_LOG_LEN 64
|
||||||
|
#define WD_PHY_LOG 0x58
|
||||||
|
#define WD_PHY_LOG_LEN 57
|
||||||
|
#define WD_HARDWARE_ST 0x91
|
||||||
|
#define WD_HARDWARE_ST_LEN 13
|
||||||
|
|
||||||
|
// My Production Type
|
||||||
|
#define MY_PRD_ID PRD_DL_K
|
||||||
|
|
||||||
|
/************************** Function Prototypes ******************************/
|
||||||
|
/**************************** Type Definitions *******************************/
|
||||||
|
/************************** Variable Definitions *****************************/
|
||||||
|
// TODO: better approach?
|
||||||
|
#include "../networking/link_layer/link_layer.h"
|
||||||
|
#include "../networking/phy_layer/phy_layer.h"
|
||||||
|
extern L2_INST *linkInstPtr;
|
||||||
|
extern L2_CONFIG linkConfig;
|
||||||
|
|
||||||
|
inline bool Mpc_IsEnable(MPC *instPtr)
|
||||||
|
{
|
||||||
|
ASSERT(instPtr != NULL);
|
||||||
|
return (instPtr->isEnable);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool Mpc_IsReqPending(MPC *instPtr)
|
||||||
|
{
|
||||||
|
ASSERT(instPtr != NULL);
|
||||||
|
return (!isCircQueueEmpty(instPtr->rxQueue));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool Mpc_IsRsqPending(MPC *instPtr)
|
||||||
|
{
|
||||||
|
ASSERT(instPtr != NULL);
|
||||||
|
return (!isCircQueueEmpty(instPtr->txQueue));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool Mpc_IsTxBusy(MPC *instPtr)
|
||||||
|
{
|
||||||
|
ASSERT(instPtr != NULL);
|
||||||
|
return (!instPtr->isTxDone);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool Mpc_IsRxBusy(MPC *instPtr)
|
||||||
|
{
|
||||||
|
ASSERT(instPtr != NULL);
|
||||||
|
return (!instPtr->isRxDone);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Generate System Bus SelfTest response.
|
||||||
|
*/
|
||||||
|
static int32_t Mpc_GenSelfTestRsp(MPC *instPtr)
|
||||||
|
{
|
||||||
|
ASSERT(instPtr != NULL);
|
||||||
|
MPC_HW_FRAME *mpcRsp;
|
||||||
|
uint8_t *msg;
|
||||||
|
if (Mpc_IsEnable(instPtr) == false)
|
||||||
|
{
|
||||||
|
DBG_ERROR("System is not enabled!\n");
|
||||||
|
return EIGNORE;
|
||||||
|
}
|
||||||
|
mpcRsp = malloc(sizeof(MPC_HW_FRAME));
|
||||||
|
if (mpcRsp == NULL)
|
||||||
|
{
|
||||||
|
DBG_ERROR("Failed to allocate memory for LJ REMOTE TEST Response!\n");
|
||||||
|
return ENOMEM;
|
||||||
|
}
|
||||||
|
mpcRsp->len = ST_RSP_LEN;
|
||||||
|
msg = mpcRsp->data + FRAME_PAYLOAD_POFFSET;
|
||||||
|
|
||||||
|
HWSTATE *hwStatsPtr = &(instPtr->hwState);
|
||||||
|
|
||||||
|
msg[WD_CMD] = CMD_SELF_TEST;
|
||||||
|
msg[WD_PRD] = MY_PRD_ID;
|
||||||
|
SysMonitor_GetHardwareStatus(hwStatsPtr);
|
||||||
|
if (Mpc_IsEnable(instPtr))
|
||||||
|
{
|
||||||
|
msg[WD_ST_RET] = (hwStatsPtr->isSpOk && hwStatsPtr->isAntOk) ? ST_RET_OK : ST_RET_ERROR;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
msg[WD_ST_RET] = (hwStatsPtr->isSpOk) ? ST_RET_OK : ST_RET_ERROR;
|
||||||
|
}
|
||||||
|
// apply status and omit 2 bytes of overhead.
|
||||||
|
memcpy(msg + WD_SP_FPGA_VOLT, &(hwStatsPtr->spFpgaVolt), ST_RET_INFO_LEN);
|
||||||
|
|
||||||
|
if (CircQueuePush(instPtr->txQueue, (void *)mpcRsp) == false)
|
||||||
|
{
|
||||||
|
free(mpcRsp);
|
||||||
|
DBG_ERROR("SystemBus::TX Queue overflowed!\n");
|
||||||
|
return EQUEUE;
|
||||||
|
}
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Apply system configuration
|
||||||
|
*/
|
||||||
|
static int32_t Mpc_SystemConfig(MPC *instPtr, uint8_t *msg)
|
||||||
|
{
|
||||||
|
PHY_INST *phyRef = linkInstPtr->config.phyInstPtr;
|
||||||
|
TMC_INST *tmcRef = linkInstPtr->config.tmcInstPtr;
|
||||||
|
bool reconfig = false;
|
||||||
|
|
||||||
|
if (msg[WD_MODE_CMD] == MODE_CMD_HEAD)
|
||||||
|
{
|
||||||
|
// omit unnecessary reconfiguration
|
||||||
|
reconfig = (L2_NODE_HEAD != L2_GetNodeType(linkInstPtr));
|
||||||
|
linkConfig.myType = L2_NODE_HEAD;
|
||||||
|
linkConfig.myId = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (msg[WD_MODE_CMD] == MODE_CMD_MEMBER)
|
||||||
|
{
|
||||||
|
// omit unnecessary reconfiguration
|
||||||
|
reconfig = (L2_NODE_MEMBER != L2_GetNodeType(linkInstPtr));
|
||||||
|
linkConfig.myType = L2_NODE_MEMBER;
|
||||||
|
linkConfig.myId = 2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Ignore current command
|
||||||
|
DBG_ERROR("Unexpected config command 0x%02X:0x%02X",
|
||||||
|
WD_MODE_CMD, msg[WD_MODE_CMD]);
|
||||||
|
return EIGNORE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (msg[WD_EN_CMD] == EN_CMD_ON_HIGH_POWER)
|
||||||
|
{
|
||||||
|
// high power config
|
||||||
|
Phy_AntConfigMode(phyRef, PHY_ANT_MODE_POWER_FULL);
|
||||||
|
if (reconfig == true || !Mpc_IsEnable(instPtr))
|
||||||
|
{
|
||||||
|
Linklayer_Reconfig(linkInstPtr, &linkConfig);
|
||||||
|
}
|
||||||
|
Linklayer_Start(linkInstPtr);
|
||||||
|
instPtr->isEnable = true;
|
||||||
|
}
|
||||||
|
else if (msg[WD_EN_CMD] == EN_CMD_ON_LOW_POWER)
|
||||||
|
{
|
||||||
|
// low power config
|
||||||
|
Phy_AntConfigMode(phyRef, PHY_ANT_MODE_POWER_LOW);
|
||||||
|
if (reconfig == true || !Mpc_IsEnable(instPtr))
|
||||||
|
{
|
||||||
|
Linklayer_Reconfig(linkInstPtr, &linkConfig);
|
||||||
|
}
|
||||||
|
Linklayer_Start(linkInstPtr);
|
||||||
|
instPtr->isEnable = true;
|
||||||
|
}
|
||||||
|
else if (msg[WD_EN_CMD] == EN_CMD_SILENT)
|
||||||
|
{
|
||||||
|
// silence config
|
||||||
|
// TODO: better approach?
|
||||||
|
instPtr->isEnable = false;
|
||||||
|
Linklayer_Halt(linkInstPtr);
|
||||||
|
Phy_AntConfigMode(phyRef, PHY_ANT_MODE_STANDBY);
|
||||||
|
TIME_WORD pullTime = {0, 0};
|
||||||
|
pullTime.int_part = TimeCtrl_GetIntCnt(tmcRef) + 1;
|
||||||
|
if (Phy_SetTimeWord(phyRef, &pullTime, PHY_TIME_WORD_POLL) != SUCCESS)
|
||||||
|
{
|
||||||
|
DBG_ERROR("Physical set pull time failed.\n");
|
||||||
|
}
|
||||||
|
Phy_SetupNextSlot(phyRef, PHY_TOR_RX, L1_10KBPS_10MS_FRAME, NULL);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Ignore current command
|
||||||
|
DBG_ERROR("Unexpected config command 0x%02X:0x%02X",
|
||||||
|
WD_EN_CMD, msg[WD_EN_CMD]);
|
||||||
|
return EIGNORE;
|
||||||
|
}
|
||||||
|
instPtr->mpcLog.lastConfig[0] = msg[WD_MODE_CMD];
|
||||||
|
instPtr->mpcLog.lastConfig[1] = msg[WD_EN_CMD];
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/**
|
||||||
|
* @brief Initialize MPC instance.
|
||||||
|
*
|
||||||
|
* @param InstPtr A double pointer to MPC instance.
|
||||||
|
* @param config A pointer to MPC configurations.
|
||||||
|
*
|
||||||
|
* @return None.
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
int32_t Mpc_Init(MPC **instPtr, MPC_CONFIG *config)
|
||||||
|
{
|
||||||
|
ASSERT(instPtr != NULL);
|
||||||
|
ASSERT(config != NULL);
|
||||||
|
MPC_HW_CONFIG mpcHwConfig;
|
||||||
|
int32_t Status;
|
||||||
|
(*instPtr) = malloc(sizeof(MPC));
|
||||||
|
if ((*instPtr) == NULL)
|
||||||
|
{
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
(*instPtr)->rxQueue = NULL;
|
||||||
|
(*instPtr)->txQueue = NULL;
|
||||||
|
(*instPtr)->mpchwDesc = NULL;
|
||||||
|
memcpy(&((*instPtr)->config), config, sizeof(MPC_CONFIG));
|
||||||
|
memset(&((*instPtr)->mpcLog), 0x00, sizeof(SYSBUSLOG));
|
||||||
|
memset(&((*instPtr)->linkLog), 0x00, sizeof(LINKLOG));
|
||||||
|
memset(&((*instPtr)->phyLog), 0x00, sizeof(PHYLOG));
|
||||||
|
memset(&((*instPtr)->hwState), 0x00, sizeof(HWSTATE));
|
||||||
|
|
||||||
|
XBram_Config *bramConfigPtr;
|
||||||
|
XBram mpcBram;
|
||||||
|
|
||||||
|
bramConfigPtr = XBram_LookupConfig(config->bramId);
|
||||||
|
if (bramConfigPtr == NULL)
|
||||||
|
{
|
||||||
|
Status = EDCONF;
|
||||||
|
goto mpc_init_error;
|
||||||
|
}
|
||||||
|
Status = XBram_CfgInitialize(&mpcBram, bramConfigPtr,
|
||||||
|
bramConfigPtr->CtrlBaseAddress);
|
||||||
|
if (Status != SUCCESS)
|
||||||
|
{
|
||||||
|
goto mpc_init_error;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* Execute the BRAM driver selftest.
|
||||||
|
*/
|
||||||
|
Status = XBram_SelfTest(&mpcBram, 0);
|
||||||
|
if (Status != SUCCESS)
|
||||||
|
{
|
||||||
|
goto mpc_init_error;
|
||||||
|
}
|
||||||
|
|
||||||
|
mpcHwConfig.txBuffAddr = mpcBram.Config.MemBaseAddress;
|
||||||
|
mpcHwConfig.rxBuffAddr = mpcBram.Config.MemBaseAddress;
|
||||||
|
mpcHwConfig.gpioId = config->gpioId;
|
||||||
|
|
||||||
|
Status = MpcHw_Init(&((*instPtr)->mpchwDesc), &mpcHwConfig);
|
||||||
|
if (Status != SUCCESS)
|
||||||
|
{
|
||||||
|
Status = ENOMEM;
|
||||||
|
goto mpc_init_error;
|
||||||
|
}
|
||||||
|
if (CircQueueCreate(&((*instPtr)->txQueue), (*instPtr)->config.txQueueMax) == false)
|
||||||
|
{
|
||||||
|
Status = ENOMEM;
|
||||||
|
goto mpc_init_error;
|
||||||
|
}
|
||||||
|
if (CircQueueCreate(&((*instPtr)->rxQueue), (*instPtr)->config.rxQueueMax) == false)
|
||||||
|
{
|
||||||
|
Status = ENOMEM;
|
||||||
|
goto mpc_init_error;
|
||||||
|
}
|
||||||
|
(*instPtr)->isEnable = false; // nothing received.
|
||||||
|
(*instPtr)->isRxDone = false; // nothing received.
|
||||||
|
(*instPtr)->isTxDone = true; // nothing to be sent.
|
||||||
|
return SUCCESS;
|
||||||
|
|
||||||
|
mpc_init_error:
|
||||||
|
free((*instPtr)->mpchwDesc);
|
||||||
|
free((*instPtr)->txQueue);
|
||||||
|
free((*instPtr)->rxQueue);
|
||||||
|
free(*instPtr);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/**
|
||||||
|
* @brief Generate a remote test response message.
|
||||||
|
*
|
||||||
|
* @param instPtr A pointer to MPC instance.
|
||||||
|
*
|
||||||
|
* @return SUCCESS
|
||||||
|
* error code
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
int32_t Mpc_PendRemoteTest(MPC *instPtr)
|
||||||
|
{
|
||||||
|
MPC_HW_FRAME *mpcRsp;
|
||||||
|
uint8_t *msg;
|
||||||
|
if (!Mpc_IsEnable(instPtr))
|
||||||
|
{
|
||||||
|
DBG_ERROR("System is not enabled!\n");
|
||||||
|
return EIGNORE;
|
||||||
|
}
|
||||||
|
mpcRsp = malloc(sizeof(MPC_HW_FRAME));
|
||||||
|
if (mpcRsp == NULL)
|
||||||
|
{
|
||||||
|
DBG_ERROR("Failed to allocate memory for LJ REMOTE TEST Response!\n");
|
||||||
|
return ENOMEM;
|
||||||
|
}
|
||||||
|
msg = mpcRsp->data + FRAME_PAYLOAD_POFFSET;
|
||||||
|
mpcRsp->len = RM_TEST_RESP_LEN;
|
||||||
|
if (L2_GetNodeType(linkInstPtr) == L2_NODE_HEAD)
|
||||||
|
{
|
||||||
|
// head node config
|
||||||
|
msg[WD_CMD] = CMD_FLJ_RM_TEST;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
msg[WD_CMD] = CMD_LJ_RM_TEST;
|
||||||
|
}
|
||||||
|
msg[WD_PRD] = MY_PRD_ID;
|
||||||
|
|
||||||
|
TIME_WORD tmWord;
|
||||||
|
uint64_t time;
|
||||||
|
TimeCtrl_GetCurrentTime(linkInstPtr->config.tmcInstPtr, &tmWord);
|
||||||
|
time = (uint64_t)tmWord.int_part * TIME_FRAC_MAX + tmWord.frac_part;
|
||||||
|
memcpy(msg + WD_TIME_STAMP, &time, WD_TIME_STAMP_LEN);
|
||||||
|
SysMonitor_GetLinklayerLog(&(instPtr->linkLog));
|
||||||
|
SysMonitor_GetPhysicalLayerLog(&(instPtr->phyLog));
|
||||||
|
SysMonitor_GetHardwareStatus(&(instPtr->hwState));
|
||||||
|
memcpy(msg + WD_SYSBUS_LOG, &(instPtr->mpcLog), WD_SYSBUS_LOG_LEN);
|
||||||
|
memcpy(msg + WD_LINK_LOG, &(instPtr->linkLog), WD_LINK_LOG_LEN);
|
||||||
|
memcpy(msg + WD_PHY_LOG, &(instPtr->phyLog), WD_PHY_LOG_LEN);
|
||||||
|
memcpy(msg + WD_HARDWARE_ST, &(instPtr->hwState.spFpgaVolt), WD_HARDWARE_ST_LEN);
|
||||||
|
|
||||||
|
if (CircQueuePush(instPtr->txQueue, (void *)mpcRsp) == false)
|
||||||
|
{
|
||||||
|
free(mpcRsp);
|
||||||
|
DBG_WARNING("SystemBus::TX Queue overflowed!\n");
|
||||||
|
return EQUEUE;
|
||||||
|
}
|
||||||
|
instPtr->mpcLog.remoteCnt++;
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/**
|
||||||
|
* @brief A handler function. This handler evaluate the message from system
|
||||||
|
* bus receive queue, and make appropriate response.
|
||||||
|
*
|
||||||
|
* @param instPtr A pointer to MPC instance.
|
||||||
|
*
|
||||||
|
* @return None
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
int32_t Mpc_HandleCmd(MPC *instPtr)
|
||||||
|
{
|
||||||
|
ASSERT(instPtr != NULL);
|
||||||
|
int32_t Status;
|
||||||
|
MPC_HW_FRAME *mpcReq;
|
||||||
|
uint8_t *reqMsg;
|
||||||
|
if (CircQueuePop(instPtr->rxQueue, (void **)(&mpcReq)) == false)
|
||||||
|
{
|
||||||
|
DBG_WARNING("SystemBus::Nothing to be handled.\n");
|
||||||
|
return EIGNORE;
|
||||||
|
}
|
||||||
|
reqMsg = mpcReq->data + FRAME_PAYLOAD_POFFSET;
|
||||||
|
if (reqMsg[WD_PRD] != MY_PRD_ID && reqMsg[WD_PRD] != PRD_ALL)
|
||||||
|
{
|
||||||
|
DBG_WARNING("SystemBus::Production code mismatch!\n");
|
||||||
|
return EIGNORE;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (reqMsg[WD_CMD])
|
||||||
|
{
|
||||||
|
case CMD_CONFIG:
|
||||||
|
{
|
||||||
|
Status = Mpc_SystemConfig(instPtr, reqMsg);
|
||||||
|
if (Status == SUCCESS)
|
||||||
|
{
|
||||||
|
Status = Mpc_GenSelfTestRsp(instPtr);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
DBG_ERROR("SystemBus::Unknown command code!\n");
|
||||||
|
Status = FAILURE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(mpcReq);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/**
|
||||||
|
* @brief This function send a repose frame from MPC tx queue.
|
||||||
|
*
|
||||||
|
* @param instPtr A pointer to MPC instance.
|
||||||
|
*
|
||||||
|
* @return None
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
int32_t Mpc_MakeResp(MPC *instPtr)
|
||||||
|
{
|
||||||
|
ASSERT(instPtr != NULL);
|
||||||
|
int32_t Status;
|
||||||
|
MPC_HW_FRAME *mpcRsp;
|
||||||
|
if (CircQueuePop(instPtr->txQueue, (void **)(&mpcRsp)) == false)
|
||||||
|
{
|
||||||
|
DBG_WARNING("SystemBus::Nothing to be sent.\n");
|
||||||
|
return EIGNORE;
|
||||||
|
}
|
||||||
|
instPtr->isTxDone = false; // A transmission procedure is started.
|
||||||
|
Status = MpcHw_Send(instPtr->mpchwDesc, mpcRsp);
|
||||||
|
free(mpcRsp);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/**
|
||||||
|
* @brief This function handles the mpc tx irq events.
|
||||||
|
*
|
||||||
|
* @param instPtr A pointer to MPC instance.
|
||||||
|
*
|
||||||
|
* @return None
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
int32_t Mpc_TxIrqHandler(MPC *instPtr)
|
||||||
|
{
|
||||||
|
ASSERT(instPtr != NULL);
|
||||||
|
// nothing special...
|
||||||
|
instPtr->isTxDone = true; // A transmission procedure finished.
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/**
|
||||||
|
* @brief This function handles the mpc rx irq events.
|
||||||
|
*
|
||||||
|
* @param instPtr A pointer to MPC instance.
|
||||||
|
*
|
||||||
|
* @return None
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
int32_t Mpc_RxIrqHandler(MPC *instPtr)
|
||||||
|
{
|
||||||
|
ASSERT(instPtr != NULL);
|
||||||
|
int32_t Status;
|
||||||
|
MPC_HW_FRAME *mpcReq;
|
||||||
|
instPtr->isRxDone = true; // whether reception successes or not, receiving procedure ended.
|
||||||
|
mpcReq = malloc(sizeof(MPC_HW_FRAME));
|
||||||
|
if (mpcReq == NULL)
|
||||||
|
{
|
||||||
|
return ENOMEM;
|
||||||
|
}
|
||||||
|
Status = MpcHw_Recv(instPtr->mpchwDesc, mpcReq);
|
||||||
|
if (Status != SUCCESS)
|
||||||
|
{
|
||||||
|
goto recv_error;
|
||||||
|
}
|
||||||
|
if (CircQueuePush(instPtr->rxQueue, (void *)mpcReq) == false)
|
||||||
|
{
|
||||||
|
DBG_ERROR("SystemBus::RX Queue overflowed!\n");
|
||||||
|
Status = EQUEUE;
|
||||||
|
goto recv_error;
|
||||||
|
}
|
||||||
|
instPtr->isRxDone = false; // another reception is undergoing.
|
||||||
|
return SUCCESS;
|
||||||
|
recv_error:
|
||||||
|
free(mpcReq);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
@@ -0,0 +1,71 @@
|
|||||||
|
/*****************************************************************************/
|
||||||
|
/**
|
||||||
|
* Description: MPC protocol head file.
|
||||||
|
*
|
||||||
|
* Date: 2023-05-06 10:12
|
||||||
|
* Last Edit Time: [2023-05-06 10:13]
|
||||||
|
*
|
||||||
|
* Revisions: Rev 0.0
|
||||||
|
* History:
|
||||||
|
* [2023-05-06]: Initial version.
|
||||||
|
*
|
||||||
|
* Copyright(c) 2021 Beijing Institute of Technology.
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#ifndef __MPC_H_
|
||||||
|
#define __MPC_H_
|
||||||
|
|
||||||
|
/***************************** Include Files *********************************/
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "mpc_hw.h" // MPC driver
|
||||||
|
#include "circ_queue.h"
|
||||||
|
#include "../system_monitor.h"
|
||||||
|
|
||||||
|
/************************** Constant Definitions *****************************/
|
||||||
|
/************************** Data Type Definitions ****************************/
|
||||||
|
// Definition of MPC instance.
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32_t bramId;
|
||||||
|
uint32_t gpioId;
|
||||||
|
uint32_t txQueueMax;
|
||||||
|
uint32_t rxQueueMax;
|
||||||
|
} MPC_CONFIG;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
MPC_CONFIG config;
|
||||||
|
SYSBUSLOG mpcLog; // mpc log
|
||||||
|
LINKLOG linkLog; // Link layer log
|
||||||
|
PHYLOG phyLog; // Physical layer log
|
||||||
|
HWSTATE hwState; // Hardware status
|
||||||
|
MPC_HW *mpchwDesc;
|
||||||
|
CIRC_QUEUE *txQueue;
|
||||||
|
CIRC_QUEUE *rxQueue;
|
||||||
|
bool isEnable;
|
||||||
|
bool isRxDone;
|
||||||
|
bool isTxDone;
|
||||||
|
} MPC;
|
||||||
|
|
||||||
|
/************************** Function Prototypes ******************************/
|
||||||
|
|
||||||
|
int32_t Mpc_Init(MPC **instPtr, MPC_CONFIG *config);
|
||||||
|
|
||||||
|
int32_t Mpc_HandleCmd(MPC *instPtr);
|
||||||
|
int32_t Mpc_PendRemoteTest(MPC *instPtr);
|
||||||
|
int32_t Mpc_MakeResp(MPC *instPtr);
|
||||||
|
|
||||||
|
int32_t Mpc_TxIrqHandler(MPC *instPtr);
|
||||||
|
int32_t Mpc_RxIrqHandler(MPC *instPtr);
|
||||||
|
|
||||||
|
bool Mpc_IsEnable(MPC *instPtr);
|
||||||
|
|
||||||
|
bool Mpc_IsReqPending(MPC *instPtr);
|
||||||
|
bool Mpc_IsRsqPending(MPC *instPtr);
|
||||||
|
|
||||||
|
bool Mpc_IsTxBusy(MPC *instPtr);
|
||||||
|
bool Mpc_IsRxBusy(MPC *instPtr);
|
||||||
|
|
||||||
|
#endif //__MPC_H_
|
||||||
@@ -0,0 +1,139 @@
|
|||||||
|
/*****************************************************************************/
|
||||||
|
/**
|
||||||
|
* Description: MPC uart driver implementation file.
|
||||||
|
*
|
||||||
|
* Date: 2023-05-06 10:59
|
||||||
|
* LastEditTime: 2023-05-06 21:56
|
||||||
|
* Revisions: Rev 0.0
|
||||||
|
* History:
|
||||||
|
* [2023-05-06]: Initial version.
|
||||||
|
*
|
||||||
|
* Copyright(c) 2022 Beijing Institute of Technology.
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/***************************** Include Files *******************************/
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "mpc_hw.h"
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
|
// Control and status register
|
||||||
|
#define MODULE_VERSION 0
|
||||||
|
#define MPC_STATUS 4
|
||||||
|
#define MPC_SEND_CMD 8
|
||||||
|
#define MPC_RECV_CNT 12
|
||||||
|
|
||||||
|
// Status code
|
||||||
|
#define MPC_STATUS_TX_BUSY 0x00010000
|
||||||
|
#define MPC_STATUS_RX_BUSY 0x01000000
|
||||||
|
// Data buffer register
|
||||||
|
#define MPC_TXBUFF_MAX 512
|
||||||
|
#define MPC_RXBUFF_MAX 512
|
||||||
|
|
||||||
|
// Frame Data offsets
|
||||||
|
#define FRAME_HEAD_LOW 0x02
|
||||||
|
#define FRAME_HEAD_HIGH 0x53
|
||||||
|
#define FRAME_TAIL_LOW 0x32
|
||||||
|
#define FRAME_TAIL_HIGH 0x20
|
||||||
|
|
||||||
|
#define FRAME_HEAD_LEN 2
|
||||||
|
#define FRAME_TAIL_LEN 2
|
||||||
|
#define FRAME_DUMMY_LEN 1 // Dummy
|
||||||
|
#define FRAME_OVERHEAD_LEN 2 // CheckSum, Dummy and
|
||||||
|
|
||||||
|
#define MPC_STATUS_CH 1
|
||||||
|
#define MPC_CONFIG_CH 2
|
||||||
|
|
||||||
|
#define MPC_CONFIG_SEND_TRIG 0x00000002
|
||||||
|
/*************************** Function Definitions ****************************/
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/**
|
||||||
|
* @brief Instance initial
|
||||||
|
*
|
||||||
|
* @param instPtr A pointer to frame uart instance structure.
|
||||||
|
* @param config Base address of frame uart, refer to "xparameters.h"
|
||||||
|
*
|
||||||
|
* @return None.
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
int MpcHw_Init(MPC_HW **instPtr, MPC_HW_CONFIG *config)
|
||||||
|
{
|
||||||
|
ASSERT(instPtr != NULL);
|
||||||
|
ASSERT(config != NULL);
|
||||||
|
uint32_t Status;
|
||||||
|
(*instPtr) = malloc(sizeof(MPC_HW));
|
||||||
|
if ((*instPtr) == NULL)
|
||||||
|
{
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
(*instPtr)->config.txBuffAddr = config->txBuffAddr;
|
||||||
|
(*instPtr)->config.rxBuffAddr = config->rxBuffAddr;
|
||||||
|
Status = XGpio_Initialize(&((*instPtr)->gpioDesc), config->gpioId);
|
||||||
|
if (Status != SUCCESS) {
|
||||||
|
DBG_ERROR("MPC gpio Initialization Failed.\n");
|
||||||
|
free(*instPtr);
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
XGpio_SetDataDirection(&((*instPtr)->gpioDesc), MPC_CONFIG_CH, 0x00000000);
|
||||||
|
XGpio_SetDataDirection(&((*instPtr)->gpioDesc), MPC_STATUS_CH, 0xFFFFFFFF);
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/**
|
||||||
|
* @brief Send a MPC frame.
|
||||||
|
*
|
||||||
|
* @param instPtr A pointer to MPC_HW instance structure.
|
||||||
|
* @param buff A pointer to send data buffer
|
||||||
|
* @param dLen A integer indicate the send data buffer length in byte.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
int MpcHw_Send(MPC_HW *instPtr, MPC_HW_FRAME *frame)
|
||||||
|
{
|
||||||
|
ASSERT(instPtr != NULL);
|
||||||
|
ASSERT(frame != NULL);
|
||||||
|
uint8_t sendLen;
|
||||||
|
uint8_t *sendBuff = (uint8_t*) instPtr->config.txBuffAddr;
|
||||||
|
sendLen = frame->len + FRAME_OVERHEAD_LEN;
|
||||||
|
if (sendLen > MPC_TXBUFF_MAX || frame->len == 0)
|
||||||
|
{
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
frame->data[0] = FRAME_HEAD_LOW;
|
||||||
|
frame->data[1] = FRAME_HEAD_HIGH;
|
||||||
|
memcpy(sendBuff, frame->data, sendLen);
|
||||||
|
|
||||||
|
// Start Sending
|
||||||
|
uint32_t gpioVal = XGpio_DiscreteRead(&(instPtr->gpioDesc), MPC_CONFIG_CH);
|
||||||
|
gpioVal ^= MPC_CONFIG_SEND_TRIG;
|
||||||
|
XGpio_DiscreteWrite(&(instPtr->gpioDesc), MPC_CONFIG_CH, gpioVal);
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/**
|
||||||
|
* @brief Get last MPC frame.
|
||||||
|
*
|
||||||
|
* @param instPtr A pointer to MPC_HW instance structure.
|
||||||
|
* @param buff A pointer to receive data buffer.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
int MpcHw_Recv(MPC_HW *instPtr, MPC_HW_FRAME *frame)
|
||||||
|
{
|
||||||
|
ASSERT(instPtr != NULL);
|
||||||
|
ASSERT(frame != NULL);
|
||||||
|
uint8_t *recvBuff = (uint8_t *)(instPtr->config.rxBuffAddr);
|
||||||
|
memcpy(frame->data, recvBuff, MPC_FRAME_MAX);
|
||||||
|
frame->len = MPC_FRAME_MAX;
|
||||||
|
frame->isValid = true;
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,98 @@
|
|||||||
|
/*****************************************************************************/
|
||||||
|
/**
|
||||||
|
* Description: MPC uart driver implementation file.
|
||||||
|
*
|
||||||
|
* Date: 2023-05-06 10:59
|
||||||
|
* LastEditTime: 2023-05-06 21:48
|
||||||
|
* Revisions: Rev 0.0
|
||||||
|
* History:
|
||||||
|
* [2023-05-06]: Initial version.
|
||||||
|
*
|
||||||
|
* Copyright(c) 2022 Beijing Institute of Technology.
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#ifndef __MPC_HW_H
|
||||||
|
#define __MPC_HW_H
|
||||||
|
|
||||||
|
/**************************** Include Files *****************************/
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "util.h"
|
||||||
|
#include "xgpio.h"
|
||||||
|
|
||||||
|
#define MPC_FRAME_MAX 256
|
||||||
|
#define FRAME_PAYLOAD_POFFSET 2 // CheckSum, Dummy and DataLen
|
||||||
|
/**************************** Type Definitions *****************************/
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Write a value to a SYSTEMBUS_UART register. A 32 bit write is performed.
|
||||||
|
* If the component is implemented in a smaller width, only the least
|
||||||
|
* significant data is written.
|
||||||
|
*
|
||||||
|
* @param baseAddr is the base address of the SYSTEMBUS_UARTdevice.
|
||||||
|
* @param offset is the register offset from the base to write to.
|
||||||
|
* @param data is the data written to the register.
|
||||||
|
*
|
||||||
|
* @return None.
|
||||||
|
*
|
||||||
|
* @note
|
||||||
|
* C-style signature:
|
||||||
|
* void MPC_HW_mWriteReg(uint32_t BaseAddress, unsigned RegOffset, uint32_t Data)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#define MPC_HW_mWriteReg(baseAddr, offset, data) \
|
||||||
|
IO_Out32((baseAddr) + (offset), (uint32_t)(data))
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Read a value from a SYSTEMBUS_UART register. A 32 bit read is performed.
|
||||||
|
* If the component is implemented in a smaller width, only the least
|
||||||
|
* significant data is read from the register. The most significant data
|
||||||
|
* will be read as 0.
|
||||||
|
*
|
||||||
|
* @param baseAddr is the base address of the SYSTEMBUS_UART device.
|
||||||
|
* @param offset is the register offset from the base to write to.
|
||||||
|
*
|
||||||
|
* @return Data is the data from the register.
|
||||||
|
*
|
||||||
|
* @note
|
||||||
|
* C-style signature:
|
||||||
|
* uint32_t MPC_HW_mReadReg(uint32_t BaseAddress, unsigned RegOffset)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#define MPC_HW_mReadReg(baseAddr, offset) \
|
||||||
|
IO_In32((baseAddr) + (offset))
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uintptr_t txBuffAddr;
|
||||||
|
uintptr_t rxBuffAddr;
|
||||||
|
uint32_t gpioId;
|
||||||
|
} MPC_HW_CONFIG;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
MPC_HW_CONFIG config;
|
||||||
|
XGpio gpioDesc;
|
||||||
|
} MPC_HW;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint16_t len;
|
||||||
|
uint8_t checkSum;
|
||||||
|
uint8_t isValid;
|
||||||
|
uint8_t data[MPC_FRAME_MAX];
|
||||||
|
} MPC_HW_FRAME;
|
||||||
|
|
||||||
|
/************************** Function Prototypes ******************************/
|
||||||
|
// Instance initial
|
||||||
|
int MpcHw_Init(MPC_HW **instPtr, MPC_HW_CONFIG *config);
|
||||||
|
|
||||||
|
// Send a MPC frame.
|
||||||
|
int MpcHw_Send(MPC_HW *instPtr, MPC_HW_FRAME *frame);
|
||||||
|
|
||||||
|
// Get last MPC frame.
|
||||||
|
int MpcHw_Recv(MPC_HW *instPtr, MPC_HW_FRAME *frame);
|
||||||
|
|
||||||
|
#endif // __MPC_HW_H
|
||||||
@@ -1 +0,0 @@
|
|||||||
../../df_datalink_sp/src/systembus
|
|
||||||
@@ -42,10 +42,28 @@
|
|||||||
|
|
||||||
/******************************************************************/
|
/******************************************************************/
|
||||||
/* Definitions for driver BRAM */
|
/* Definitions for driver BRAM */
|
||||||
#define XPAR_XBRAM_NUM_INSTANCES 3U
|
#define XPAR_XBRAM_NUM_INSTANCES 4U
|
||||||
|
|
||||||
|
/* Definitions for peripheral PHY_DATA_INTERFACE_ANT_BEAM_BRAM_CTRL */
|
||||||
|
#define XPAR_PHY_DATA_INTERFACE_ANT_BEAM_BRAM_CTRL_DEVICE_ID 0U
|
||||||
|
#define XPAR_PHY_DATA_INTERFACE_ANT_BEAM_BRAM_CTRL_DATA_WIDTH 32U
|
||||||
|
#define XPAR_PHY_DATA_INTERFACE_ANT_BEAM_BRAM_CTRL_ECC 0U
|
||||||
|
#define XPAR_PHY_DATA_INTERFACE_ANT_BEAM_BRAM_CTRL_FAULT_INJECT 0U
|
||||||
|
#define XPAR_PHY_DATA_INTERFACE_ANT_BEAM_BRAM_CTRL_CE_FAILING_REGISTERS 0U
|
||||||
|
#define XPAR_PHY_DATA_INTERFACE_ANT_BEAM_BRAM_CTRL_UE_FAILING_REGISTERS 0U
|
||||||
|
#define XPAR_PHY_DATA_INTERFACE_ANT_BEAM_BRAM_CTRL_ECC_STATUS_REGISTERS 0U
|
||||||
|
#define XPAR_PHY_DATA_INTERFACE_ANT_BEAM_BRAM_CTRL_CE_COUNTER_WIDTH 0U
|
||||||
|
#define XPAR_PHY_DATA_INTERFACE_ANT_BEAM_BRAM_CTRL_ECC_ONOFF_REGISTER 0U
|
||||||
|
#define XPAR_PHY_DATA_INTERFACE_ANT_BEAM_BRAM_CTRL_ECC_ONOFF_RESET_VALUE 0U
|
||||||
|
#define XPAR_PHY_DATA_INTERFACE_ANT_BEAM_BRAM_CTRL_WRITE_ACCESS 0U
|
||||||
|
#define XPAR_PHY_DATA_INTERFACE_ANT_BEAM_BRAM_CTRL_S_AXI_BASEADDR 0x42000000U
|
||||||
|
#define XPAR_PHY_DATA_INTERFACE_ANT_BEAM_BRAM_CTRL_S_AXI_HIGHADDR 0x42000FFFU
|
||||||
|
#define XPAR_PHY_DATA_INTERFACE_ANT_BEAM_BRAM_CTRL_S_AXI_CTRL_BASEADDR 0xFFFFFFFFU
|
||||||
|
#define XPAR_PHY_DATA_INTERFACE_ANT_BEAM_BRAM_CTRL_S_AXI_CTRL_HIGHADDR 0xFFFFFFFFU
|
||||||
|
|
||||||
|
|
||||||
/* Definitions for peripheral PHY_DATA_INTERFACE_ANT_INFO_BRAM_CTRL */
|
/* Definitions for peripheral PHY_DATA_INTERFACE_ANT_INFO_BRAM_CTRL */
|
||||||
#define XPAR_PHY_DATA_INTERFACE_ANT_INFO_BRAM_CTRL_DEVICE_ID 0U
|
#define XPAR_PHY_DATA_INTERFACE_ANT_INFO_BRAM_CTRL_DEVICE_ID 1U
|
||||||
#define XPAR_PHY_DATA_INTERFACE_ANT_INFO_BRAM_CTRL_DATA_WIDTH 32U
|
#define XPAR_PHY_DATA_INTERFACE_ANT_INFO_BRAM_CTRL_DATA_WIDTH 32U
|
||||||
#define XPAR_PHY_DATA_INTERFACE_ANT_INFO_BRAM_CTRL_ECC 0U
|
#define XPAR_PHY_DATA_INTERFACE_ANT_INFO_BRAM_CTRL_ECC 0U
|
||||||
#define XPAR_PHY_DATA_INTERFACE_ANT_INFO_BRAM_CTRL_FAULT_INJECT 0U
|
#define XPAR_PHY_DATA_INTERFACE_ANT_INFO_BRAM_CTRL_FAULT_INJECT 0U
|
||||||
@@ -63,7 +81,7 @@
|
|||||||
|
|
||||||
|
|
||||||
/* Definitions for peripheral PHY_DATA_INTERFACE_RX_FRAME_BRAM_CTRL */
|
/* Definitions for peripheral PHY_DATA_INTERFACE_RX_FRAME_BRAM_CTRL */
|
||||||
#define XPAR_PHY_DATA_INTERFACE_RX_FRAME_BRAM_CTRL_DEVICE_ID 1U
|
#define XPAR_PHY_DATA_INTERFACE_RX_FRAME_BRAM_CTRL_DEVICE_ID 2U
|
||||||
#define XPAR_PHY_DATA_INTERFACE_RX_FRAME_BRAM_CTRL_DATA_WIDTH 32U
|
#define XPAR_PHY_DATA_INTERFACE_RX_FRAME_BRAM_CTRL_DATA_WIDTH 32U
|
||||||
#define XPAR_PHY_DATA_INTERFACE_RX_FRAME_BRAM_CTRL_ECC 0U
|
#define XPAR_PHY_DATA_INTERFACE_RX_FRAME_BRAM_CTRL_ECC 0U
|
||||||
#define XPAR_PHY_DATA_INTERFACE_RX_FRAME_BRAM_CTRL_FAULT_INJECT 0U
|
#define XPAR_PHY_DATA_INTERFACE_RX_FRAME_BRAM_CTRL_FAULT_INJECT 0U
|
||||||
@@ -81,7 +99,7 @@
|
|||||||
|
|
||||||
|
|
||||||
/* Definitions for peripheral PHY_DATA_INTERFACE_TX_FRAME_BRAM_CTRL */
|
/* Definitions for peripheral PHY_DATA_INTERFACE_TX_FRAME_BRAM_CTRL */
|
||||||
#define XPAR_PHY_DATA_INTERFACE_TX_FRAME_BRAM_CTRL_DEVICE_ID 2U
|
#define XPAR_PHY_DATA_INTERFACE_TX_FRAME_BRAM_CTRL_DEVICE_ID 3U
|
||||||
#define XPAR_PHY_DATA_INTERFACE_TX_FRAME_BRAM_CTRL_DATA_WIDTH 32U
|
#define XPAR_PHY_DATA_INTERFACE_TX_FRAME_BRAM_CTRL_DATA_WIDTH 32U
|
||||||
#define XPAR_PHY_DATA_INTERFACE_TX_FRAME_BRAM_CTRL_ECC 0U
|
#define XPAR_PHY_DATA_INTERFACE_TX_FRAME_BRAM_CTRL_ECC 0U
|
||||||
#define XPAR_PHY_DATA_INTERFACE_TX_FRAME_BRAM_CTRL_FAULT_INJECT 0U
|
#define XPAR_PHY_DATA_INTERFACE_TX_FRAME_BRAM_CTRL_FAULT_INJECT 0U
|
||||||
@@ -100,8 +118,8 @@
|
|||||||
|
|
||||||
/******************************************************************/
|
/******************************************************************/
|
||||||
|
|
||||||
/* Canonical definitions for peripheral PHY_DATA_INTERFACE_ANT_INFO_BRAM_CTRL */
|
/* Canonical definitions for peripheral PHY_DATA_INTERFACE_ANT_BEAM_BRAM_CTRL */
|
||||||
#define XPAR_BRAM_0_DEVICE_ID XPAR_PHY_DATA_INTERFACE_ANT_INFO_BRAM_CTRL_DEVICE_ID
|
#define XPAR_BRAM_0_DEVICE_ID XPAR_PHY_DATA_INTERFACE_ANT_BEAM_BRAM_CTRL_DEVICE_ID
|
||||||
#define XPAR_BRAM_0_DATA_WIDTH 32U
|
#define XPAR_BRAM_0_DATA_WIDTH 32U
|
||||||
#define XPAR_BRAM_0_ECC 0U
|
#define XPAR_BRAM_0_ECC 0U
|
||||||
#define XPAR_BRAM_0_FAULT_INJECT 0U
|
#define XPAR_BRAM_0_FAULT_INJECT 0U
|
||||||
@@ -112,13 +130,13 @@
|
|||||||
#define XPAR_BRAM_0_ECC_ONOFF_REGISTER 0U
|
#define XPAR_BRAM_0_ECC_ONOFF_REGISTER 0U
|
||||||
#define XPAR_BRAM_0_ECC_ONOFF_RESET_VALUE 0U
|
#define XPAR_BRAM_0_ECC_ONOFF_RESET_VALUE 0U
|
||||||
#define XPAR_BRAM_0_WRITE_ACCESS 0U
|
#define XPAR_BRAM_0_WRITE_ACCESS 0U
|
||||||
#define XPAR_BRAM_0_BASEADDR 0x40004000U
|
#define XPAR_BRAM_0_BASEADDR 0x42000000U
|
||||||
#define XPAR_BRAM_0_HIGHADDR 0x40005FFFU
|
#define XPAR_BRAM_0_HIGHADDR 0x42000FFFU
|
||||||
#define XPAR_BRAM_0_CTRL_BASEADDR 0xFFFFFFFFU
|
#define XPAR_BRAM_0_CTRL_BASEADDR 0xFFFFFFFFU
|
||||||
#define XPAR_BRAM_0_CTRL_HIGHADDR 0xFFFFFFFEU
|
#define XPAR_BRAM_0_CTRL_HIGHADDR 0xFFFFFFFEU
|
||||||
|
|
||||||
/* Canonical definitions for peripheral PHY_DATA_INTERFACE_RX_FRAME_BRAM_CTRL */
|
/* Canonical definitions for peripheral PHY_DATA_INTERFACE_ANT_INFO_BRAM_CTRL */
|
||||||
#define XPAR_BRAM_1_DEVICE_ID XPAR_PHY_DATA_INTERFACE_RX_FRAME_BRAM_CTRL_DEVICE_ID
|
#define XPAR_BRAM_1_DEVICE_ID XPAR_PHY_DATA_INTERFACE_ANT_INFO_BRAM_CTRL_DEVICE_ID
|
||||||
#define XPAR_BRAM_1_DATA_WIDTH 32U
|
#define XPAR_BRAM_1_DATA_WIDTH 32U
|
||||||
#define XPAR_BRAM_1_ECC 0U
|
#define XPAR_BRAM_1_ECC 0U
|
||||||
#define XPAR_BRAM_1_FAULT_INJECT 0U
|
#define XPAR_BRAM_1_FAULT_INJECT 0U
|
||||||
@@ -129,13 +147,13 @@
|
|||||||
#define XPAR_BRAM_1_ECC_ONOFF_REGISTER 0U
|
#define XPAR_BRAM_1_ECC_ONOFF_REGISTER 0U
|
||||||
#define XPAR_BRAM_1_ECC_ONOFF_RESET_VALUE 0U
|
#define XPAR_BRAM_1_ECC_ONOFF_RESET_VALUE 0U
|
||||||
#define XPAR_BRAM_1_WRITE_ACCESS 0U
|
#define XPAR_BRAM_1_WRITE_ACCESS 0U
|
||||||
#define XPAR_BRAM_1_BASEADDR 0x40000000U
|
#define XPAR_BRAM_1_BASEADDR 0x40004000U
|
||||||
#define XPAR_BRAM_1_HIGHADDR 0x40001FFFU
|
#define XPAR_BRAM_1_HIGHADDR 0x40005FFFU
|
||||||
#define XPAR_BRAM_1_CTRL_BASEADDR 0xFFFFFFFFU
|
#define XPAR_BRAM_1_CTRL_BASEADDR 0xFFFFFFFFU
|
||||||
#define XPAR_BRAM_1_CTRL_HIGHADDR 0xFFFFFFFEU
|
#define XPAR_BRAM_1_CTRL_HIGHADDR 0xFFFFFFFEU
|
||||||
|
|
||||||
/* Canonical definitions for peripheral PHY_DATA_INTERFACE_TX_FRAME_BRAM_CTRL */
|
/* Canonical definitions for peripheral PHY_DATA_INTERFACE_RX_FRAME_BRAM_CTRL */
|
||||||
#define XPAR_BRAM_2_DEVICE_ID XPAR_PHY_DATA_INTERFACE_TX_FRAME_BRAM_CTRL_DEVICE_ID
|
#define XPAR_BRAM_2_DEVICE_ID XPAR_PHY_DATA_INTERFACE_RX_FRAME_BRAM_CTRL_DEVICE_ID
|
||||||
#define XPAR_BRAM_2_DATA_WIDTH 32U
|
#define XPAR_BRAM_2_DATA_WIDTH 32U
|
||||||
#define XPAR_BRAM_2_ECC 0U
|
#define XPAR_BRAM_2_ECC 0U
|
||||||
#define XPAR_BRAM_2_FAULT_INJECT 0U
|
#define XPAR_BRAM_2_FAULT_INJECT 0U
|
||||||
@@ -146,11 +164,28 @@
|
|||||||
#define XPAR_BRAM_2_ECC_ONOFF_REGISTER 0U
|
#define XPAR_BRAM_2_ECC_ONOFF_REGISTER 0U
|
||||||
#define XPAR_BRAM_2_ECC_ONOFF_RESET_VALUE 0U
|
#define XPAR_BRAM_2_ECC_ONOFF_RESET_VALUE 0U
|
||||||
#define XPAR_BRAM_2_WRITE_ACCESS 0U
|
#define XPAR_BRAM_2_WRITE_ACCESS 0U
|
||||||
#define XPAR_BRAM_2_BASEADDR 0x40002000U
|
#define XPAR_BRAM_2_BASEADDR 0x40000000U
|
||||||
#define XPAR_BRAM_2_HIGHADDR 0x40003FFFU
|
#define XPAR_BRAM_2_HIGHADDR 0x40001FFFU
|
||||||
#define XPAR_BRAM_2_CTRL_BASEADDR 0xFFFFFFFFU
|
#define XPAR_BRAM_2_CTRL_BASEADDR 0xFFFFFFFFU
|
||||||
#define XPAR_BRAM_2_CTRL_HIGHADDR 0xFFFFFFFEU
|
#define XPAR_BRAM_2_CTRL_HIGHADDR 0xFFFFFFFEU
|
||||||
|
|
||||||
|
/* Canonical definitions for peripheral PHY_DATA_INTERFACE_TX_FRAME_BRAM_CTRL */
|
||||||
|
#define XPAR_BRAM_3_DEVICE_ID XPAR_PHY_DATA_INTERFACE_TX_FRAME_BRAM_CTRL_DEVICE_ID
|
||||||
|
#define XPAR_BRAM_3_DATA_WIDTH 32U
|
||||||
|
#define XPAR_BRAM_3_ECC 0U
|
||||||
|
#define XPAR_BRAM_3_FAULT_INJECT 0U
|
||||||
|
#define XPAR_BRAM_3_CE_FAILING_REGISTERS 0U
|
||||||
|
#define XPAR_BRAM_3_UE_FAILING_REGISTERS 0U
|
||||||
|
#define XPAR_BRAM_3_ECC_STATUS_REGISTERS 0U
|
||||||
|
#define XPAR_BRAM_3_CE_COUNTER_WIDTH 0U
|
||||||
|
#define XPAR_BRAM_3_ECC_ONOFF_REGISTER 0U
|
||||||
|
#define XPAR_BRAM_3_ECC_ONOFF_RESET_VALUE 0U
|
||||||
|
#define XPAR_BRAM_3_WRITE_ACCESS 0U
|
||||||
|
#define XPAR_BRAM_3_BASEADDR 0x40002000U
|
||||||
|
#define XPAR_BRAM_3_HIGHADDR 0x40003FFFU
|
||||||
|
#define XPAR_BRAM_3_CTRL_BASEADDR 0xFFFFFFFFU
|
||||||
|
#define XPAR_BRAM_3_CTRL_HIGHADDR 0xFFFFFFFEU
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************/
|
/******************************************************************/
|
||||||
|
|
||||||
|
|||||||
@@ -42,6 +42,25 @@
|
|||||||
|
|
||||||
XBram_Config XBram_ConfigTable[] =
|
XBram_Config XBram_ConfigTable[] =
|
||||||
{
|
{
|
||||||
|
{
|
||||||
|
XPAR_PHY_DATA_INTERFACE_ANT_BEAM_BRAM_CTRL_DEVICE_ID,
|
||||||
|
XPAR_PHY_DATA_INTERFACE_ANT_BEAM_BRAM_CTRL_DATA_WIDTH,
|
||||||
|
XPAR_PHY_DATA_INTERFACE_ANT_BEAM_BRAM_CTRL_ECC,
|
||||||
|
XPAR_PHY_DATA_INTERFACE_ANT_BEAM_BRAM_CTRL_FAULT_INJECT,
|
||||||
|
XPAR_PHY_DATA_INTERFACE_ANT_BEAM_BRAM_CTRL_CE_FAILING_REGISTERS,
|
||||||
|
0,
|
||||||
|
XPAR_PHY_DATA_INTERFACE_ANT_BEAM_BRAM_CTRL_UE_FAILING_REGISTERS,
|
||||||
|
0,
|
||||||
|
XPAR_PHY_DATA_INTERFACE_ANT_BEAM_BRAM_CTRL_ECC_STATUS_REGISTERS,
|
||||||
|
XPAR_PHY_DATA_INTERFACE_ANT_BEAM_BRAM_CTRL_CE_COUNTER_WIDTH,
|
||||||
|
XPAR_PHY_DATA_INTERFACE_ANT_BEAM_BRAM_CTRL_ECC_ONOFF_REGISTER,
|
||||||
|
XPAR_PHY_DATA_INTERFACE_ANT_BEAM_BRAM_CTRL_ECC_ONOFF_RESET_VALUE,
|
||||||
|
XPAR_PHY_DATA_INTERFACE_ANT_BEAM_BRAM_CTRL_WRITE_ACCESS,
|
||||||
|
XPAR_PHY_DATA_INTERFACE_ANT_BEAM_BRAM_CTRL_S_AXI_BASEADDR,
|
||||||
|
XPAR_PHY_DATA_INTERFACE_ANT_BEAM_BRAM_CTRL_S_AXI_HIGHADDR,
|
||||||
|
XPAR_PHY_DATA_INTERFACE_ANT_BEAM_BRAM_CTRL_S_AXI_CTRL_BASEADDR,
|
||||||
|
XPAR_PHY_DATA_INTERFACE_ANT_BEAM_BRAM_CTRL_S_AXI_CTRL_HIGHADDR
|
||||||
|
},
|
||||||
{
|
{
|
||||||
XPAR_PHY_DATA_INTERFACE_ANT_INFO_BRAM_CTRL_DEVICE_ID,
|
XPAR_PHY_DATA_INTERFACE_ANT_INFO_BRAM_CTRL_DEVICE_ID,
|
||||||
XPAR_PHY_DATA_INTERFACE_ANT_INFO_BRAM_CTRL_DATA_WIDTH,
|
XPAR_PHY_DATA_INTERFACE_ANT_INFO_BRAM_CTRL_DATA_WIDTH,
|
||||||
|
|||||||
@@ -24,6 +24,12 @@ BEGIN DRIVER
|
|||||||
PARAMETER HW_INSTANCE = axi_spi_engine_axi_spi_engine
|
PARAMETER HW_INSTANCE = axi_spi_engine_axi_spi_engine
|
||||||
END
|
END
|
||||||
|
|
||||||
|
BEGIN DRIVER
|
||||||
|
PARAMETER DRIVER_NAME = bram
|
||||||
|
PARAMETER DRIVER_VER = 4.3
|
||||||
|
PARAMETER HW_INSTANCE = phy_data_interface_ant_beam_bram_ctrl
|
||||||
|
END
|
||||||
|
|
||||||
BEGIN DRIVER
|
BEGIN DRIVER
|
||||||
PARAMETER DRIVER_NAME = bram
|
PARAMETER DRIVER_NAME = bram
|
||||||
PARAMETER DRIVER_VER = 4.3
|
PARAMETER DRIVER_VER = 4.3
|
||||||
|
|||||||
@@ -8,15 +8,18 @@ LD_SRCS += \
|
|||||||
|
|
||||||
C_SRCS += \
|
C_SRCS += \
|
||||||
../src/main.c \
|
../src/main.c \
|
||||||
../src/system_monitor.c
|
../src/system_monitor.c \
|
||||||
|
../src/hwconfig.c
|
||||||
|
|
||||||
OBJS += \
|
OBJS += \
|
||||||
./src/main.o \
|
./src/main.o \
|
||||||
./src/system_monitor.o
|
./src/system_monitor.o \
|
||||||
|
./src/hwconfig.o
|
||||||
|
|
||||||
C_DEPS += \
|
C_DEPS += \
|
||||||
./src/main.d \
|
./src/main.d \
|
||||||
./src/system_monitor.d
|
./src/system_monitor.d \
|
||||||
|
./src/hwconfig.d
|
||||||
|
|
||||||
|
|
||||||
# Each subdirectory must supply rules for building sources it contributes
|
# Each subdirectory must supply rules for building sources it contributes
|
||||||
|
|||||||
@@ -54,10 +54,10 @@
|
|||||||
// Physical Layer Configs
|
// Physical Layer Configs
|
||||||
#define PHY_DEVICE_ID 0
|
#define PHY_DEVICE_ID 0
|
||||||
#define PHY_BASEADDR XPAR_PHYC_BASEADDR
|
#define PHY_BASEADDR XPAR_PHYC_BASEADDR
|
||||||
#define PHY_BEAM_SET_PRESET
|
|
||||||
#define PHY_BEAM_FORMING_ENABLE
|
#define PHY_BEAM_FORMING_ENABLE
|
||||||
// -- Antenna Bram Configs
|
// -- Antenna Bram Configs
|
||||||
#define PHY_ANTCONFIG_BRAM_DEVICE_ID XPAR_PHY_DATA_INTERFACE_ANT_INFO_BRAM_CTRL_DEVICE_ID
|
#define PHY_ANTCONFIG_BRAM_DEVICE_ID XPAR_PHY_DATA_INTERFACE_ANT_INFO_BRAM_CTRL_DEVICE_ID
|
||||||
|
#define PHY_ANTINFO_BRAM_DEVICE_ID XPAR_PHY_DATA_INTERFACE_ANT_BEAM_BRAM_CTRL_DEVICE_ID
|
||||||
// -- Buffers
|
// -- Buffers
|
||||||
#define PHY_TXBUFF_BRAM_DEVICE_ID XPAR_PHY_DATA_INTERFACE_TX_FRAME_BRAM_CTRL_DEVICE_ID
|
#define PHY_TXBUFF_BRAM_DEVICE_ID XPAR_PHY_DATA_INTERFACE_TX_FRAME_BRAM_CTRL_DEVICE_ID
|
||||||
#define PHY_RXBUFF_BRAM_DEVICE_ID XPAR_PHY_DATA_INTERFACE_RX_FRAME_BRAM_CTRL_DEVICE_ID
|
#define PHY_RXBUFF_BRAM_DEVICE_ID XPAR_PHY_DATA_INTERFACE_RX_FRAME_BRAM_CTRL_DEVICE_ID
|
||||||
|
|||||||
@@ -697,7 +697,6 @@ int32_t spi_engine_write_and_read(struct spi_desc *desc,
|
|||||||
uint8_t *data,
|
uint8_t *data,
|
||||||
uint16_t bytes_number)
|
uint16_t bytes_number)
|
||||||
{
|
{
|
||||||
uint8_t i;
|
|
||||||
uint8_t word_len;
|
uint8_t word_len;
|
||||||
uint8_t words_number;
|
uint8_t words_number;
|
||||||
int32_t ret;
|
int32_t ret;
|
||||||
|
|||||||
@@ -0,0 +1,464 @@
|
|||||||
|
/*****************************************************************************/
|
||||||
|
/**
|
||||||
|
* Description: hwconfig.h
|
||||||
|
*
|
||||||
|
|
||||||
|
* Date: 2024-02-20 13:19
|
||||||
|
* Last Edit Time: [2024-02-20 13:19]
|
||||||
|
*
|
||||||
|
* Revisions: Rev 0.0
|
||||||
|
* History:
|
||||||
|
* [2023-05-07]: Initial edition.
|
||||||
|
*
|
||||||
|
* Copyright(c) 2024 Beijing Institute of Technology.
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/***************************** Include Files *********************************/
|
||||||
|
// Standard
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
// Xilinx
|
||||||
|
#include "xgpiops.h"
|
||||||
|
#include "drivers/rf-transceiver/ad9361_reg/ad9361_reg.h"
|
||||||
|
#include "drivers/rf-transceiver/ad9361/ad9361_api.h"
|
||||||
|
#include "drivers/axi_core/spi_engine/spi_engine.h"
|
||||||
|
// App
|
||||||
|
#include "common.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "delay.h"
|
||||||
|
#include "system_monitor.h"
|
||||||
|
#include "hwconfig.h"
|
||||||
|
#include "config/app_config.h"
|
||||||
|
#include "dev_profile/dev_profile.h"
|
||||||
|
|
||||||
|
/************************** Function Prototypes ******************************/
|
||||||
|
/*********************** Driver Instance Definitions **************************/
|
||||||
|
static struct hmc7044_dev *hmc7044_inst;
|
||||||
|
static struct ad9361_reg_dev *ad9361_1_reg_inst;
|
||||||
|
static struct ad9361_reg_dev *ad9361_2_reg_inst;
|
||||||
|
// static struct ad9361_rf_phy *ad9361_phy;
|
||||||
|
// static struct ad9361_rf_phy *ad9361_2_phy;
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/**
|
||||||
|
* @brief Hardware_Init
|
||||||
|
*
|
||||||
|
* @param none.
|
||||||
|
*
|
||||||
|
* @return None.
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
int32_t Hardware_Init(void)
|
||||||
|
{
|
||||||
|
int32_t Status;
|
||||||
|
XGpioPs Gpio;
|
||||||
|
XGpioPs_Config *ConfigPtr;
|
||||||
|
ConfigPtr = XGpioPs_LookupConfig(AD9361_GPIO_DEVICE_ID);
|
||||||
|
Status = XGpioPs_CfgInitialize(&Gpio, ConfigPtr, ConfigPtr->BaseAddr);
|
||||||
|
if (Status != SUCCESS)
|
||||||
|
{
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**********************************************************/
|
||||||
|
/****************** HMC7044 Configuration *****************/
|
||||||
|
/**********************************************************/
|
||||||
|
Status = hmc7044_init(&hmc7044_inst, &hmc7044_default_init_param);
|
||||||
|
if (Status != SUCCESS)
|
||||||
|
{
|
||||||
|
DBG_ERROR("hmc7044_init() error: %" PRId32 "\n", Status);
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**********************************************************/
|
||||||
|
/***************** AD9361-1 Configuration *****************/
|
||||||
|
/**********************************************************/
|
||||||
|
XGpioPs_SetDirectionPin(&Gpio, AD9361_1_TXNRX, AD9361_GPIO_OUTPUT);
|
||||||
|
XGpioPs_SetDirectionPin(&Gpio, AD9361_1_ENABLE, AD9361_GPIO_OUTPUT);
|
||||||
|
XGpioPs_SetDirectionPin(&Gpio, AD9361_1_EN_AGC, AD9361_GPIO_OUTPUT);
|
||||||
|
XGpioPs_SetDirectionPin(&Gpio, AD9361_1_RESET_B, AD9361_GPIO_OUTPUT);
|
||||||
|
|
||||||
|
ad9361_reg_init(&ad9361_1_reg_inst, &ad9361_1_reg_default_init_param);
|
||||||
|
XGpioPs_WritePin(&Gpio, AD9361_1_ENABLE, 0);
|
||||||
|
ad9361_reg_config(ad9361_1_reg_inst);
|
||||||
|
XGpioPs_WritePin(&Gpio, AD9361_1_ENABLE, 1);
|
||||||
|
|
||||||
|
// Status = ad9361_init(&ad9361_phy, &ad9361_default_init_param);
|
||||||
|
// if (Status != XST_SUCCESS){
|
||||||
|
// return XST_FAILURE;
|
||||||
|
// }else{
|
||||||
|
// printf("Configurate AD9361 Completely!\n");
|
||||||
|
// }
|
||||||
|
// ad9361_set_tx_fir_config(ad9361_phy, tx_fir_config);
|
||||||
|
// ad9361_set_rx_fir_config(ad9361_phy, rx_fir_config);
|
||||||
|
|
||||||
|
/**********************************************************/
|
||||||
|
/***************** AD9361-2 Configuration *****************/
|
||||||
|
/**********************************************************/
|
||||||
|
XGpioPs_SetDirectionPin(&Gpio, AD9361_2_TXNRX, AD9361_GPIO_OUTPUT);
|
||||||
|
XGpioPs_SetDirectionPin(&Gpio, AD9361_2_ENABLE, AD9361_GPIO_OUTPUT);
|
||||||
|
XGpioPs_SetDirectionPin(&Gpio, AD9361_2_EN_AGC, AD9361_GPIO_OUTPUT);
|
||||||
|
XGpioPs_SetDirectionPin(&Gpio, AD9361_2_RESET_B, AD9361_GPIO_OUTPUT);
|
||||||
|
|
||||||
|
ad9361_reg_init(&ad9361_2_reg_inst, &ad9361_2_reg_default_init_param);
|
||||||
|
XGpioPs_WritePin(&Gpio, AD9361_2_ENABLE, 0);
|
||||||
|
ad9361_reg_config(ad9361_2_reg_inst);
|
||||||
|
XGpioPs_WritePin(&Gpio, AD9361_2_ENABLE, 1);
|
||||||
|
|
||||||
|
// uint8_t rd_back;
|
||||||
|
// Status = ad9361_reg_read(ad9361_1_reg_inst, 0x0002, &rd_back);
|
||||||
|
// Status = ad9361_reg_read(ad9361_2_reg_inst, 0x0002, &rd_back);
|
||||||
|
|
||||||
|
/**********************************************************/
|
||||||
|
/******* AD9361 Baseband Multichip Synchronization ********/
|
||||||
|
/**********************************************************/
|
||||||
|
XGpioPs_SetDirectionPin(&Gpio, AD9361_SYNC, AD9361_GPIO_OUTPUT);
|
||||||
|
XGpioPs_SetDirectionPin(&Gpio, AD9361_RX_FIFO_RST, AD9361_GPIO_OUTPUT);
|
||||||
|
|
||||||
|
// SYNC BBPLL and DIGITAL SAMPLING CLOCKS
|
||||||
|
ad9361_reg_write(ad9361_1_reg_inst, 0x0001, 0x0D); // MCS RF Enable; MCS BBPLL Enable; MCS BB Enable
|
||||||
|
ad9361_reg_write(ad9361_2_reg_inst, 0x0001, 0x0D);
|
||||||
|
ad9361_reg_write(ad9361_1_reg_inst, 0x0047, 0x80); // MCS refclk Scale Enable
|
||||||
|
ad9361_reg_write(ad9361_2_reg_inst, 0x0047, 0x80);
|
||||||
|
XGpioPs_WritePin(&Gpio, AD9361_SYNC, 0);
|
||||||
|
mdelay(20);
|
||||||
|
XGpioPs_WritePin(&Gpio, AD9361_SYNC, 1); // Input a rising-edge pulse to the SYNC_IN pin
|
||||||
|
mdelay(500);
|
||||||
|
XGpioPs_WritePin(&Gpio, AD9361_SYNC, 0);
|
||||||
|
mdelay(2000);
|
||||||
|
ad9361_reg_write(ad9361_1_reg_inst, 0x0001, 0x0B); // MCS RF Enable; MCS Digital CLK Enable ; MCS BB Enable
|
||||||
|
ad9361_reg_write(ad9361_2_reg_inst, 0x0001, 0x0B);
|
||||||
|
XGpioPs_WritePin(&Gpio, AD9361_SYNC, 1); // Input another rising-edge pulse to the SYNC_IN pin
|
||||||
|
mdelay(500);
|
||||||
|
XGpioPs_WritePin(&Gpio, AD9361_SYNC, 0);
|
||||||
|
ad9361_reg_write(ad9361_1_reg_inst, 0x0001, 0x08); // clear MCS bits
|
||||||
|
ad9361_reg_write(ad9361_2_reg_inst, 0x0001, 0x08);
|
||||||
|
|
||||||
|
XGpioPs_WritePin(&Gpio, AD9361_RX_FIFO_RST, 0);
|
||||||
|
mdelay(20);
|
||||||
|
XGpioPs_WritePin(&Gpio, AD9361_RX_FIFO_RST, 1);
|
||||||
|
mdelay(20);
|
||||||
|
XGpioPs_WritePin(&Gpio, AD9361_RX_FIFO_RST, 0);
|
||||||
|
|
||||||
|
/**********************************************************/
|
||||||
|
/********* AD9361 Multichip Rx Phase Calibration **********/
|
||||||
|
/**********************************************************/
|
||||||
|
XGpioPs_SetDirectionPin(&Gpio, AD9361_TX_SWITCH, AD9361_GPIO_OUTPUT);
|
||||||
|
XGpioPs_SetDirectionPin(&Gpio, AD9361_1_CAL_START, AD9361_GPIO_OUTPUT);
|
||||||
|
XGpioPs_SetDirectionPin(&Gpio, AD9361_1_CAL_DONE, AD9361_GPIO_INPUT);
|
||||||
|
XGpioPs_SetDirectionPin(&Gpio, AD9361_2_CAL_START, AD9361_GPIO_OUTPUT);
|
||||||
|
XGpioPs_SetDirectionPin(&Gpio, AD9361_2_CAL_DONE, AD9361_GPIO_INPUT);
|
||||||
|
|
||||||
|
// switch to lower frequency
|
||||||
|
Status = Hardware_SwitchFreq(ad9361_1_reg_inst, TX_FREQ_126);
|
||||||
|
XGpioPs_WritePin(&Gpio, AD9361_TX_SWITCH, 1);
|
||||||
|
mdelay(20);
|
||||||
|
|
||||||
|
// switch rx channel
|
||||||
|
Status = ad9361_reg_write(ad9361_1_reg_inst, 0x0004, 0x30);
|
||||||
|
Status = ad9361_reg_write(ad9361_2_reg_inst, 0x0004, 0x30);
|
||||||
|
|
||||||
|
// enable dual ad9361 tx channels
|
||||||
|
Status = ad9361_reg_write(ad9361_1_reg_inst, 0x0002, 0xE4); // Setup Tx Digital Filters/ Channels
|
||||||
|
|
||||||
|
// switch ad9361 tx channel
|
||||||
|
Status = ad9361_reg_write(ad9361_1_reg_inst, 0x0004, 0x70); // Select Rx input pin(A,B,C)/ Tx out pin (A,B)
|
||||||
|
mdelay(20);
|
||||||
|
|
||||||
|
// begin to calibrate the 1st ad9361
|
||||||
|
XGpioPs_WritePin(&Gpio, AD9361_1_CAL_START, 0);
|
||||||
|
XGpioPs_WritePin(&Gpio, AD9361_1_CAL_START, 1);
|
||||||
|
mdelay(1);
|
||||||
|
XGpioPs_WritePin(&Gpio, AD9361_1_CAL_START, 0);
|
||||||
|
|
||||||
|
// read calibration status
|
||||||
|
int32_t time_out_cnt = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
mdelay(1); // Wait 1ms
|
||||||
|
time_out_cnt++;
|
||||||
|
} while (((XGpioPs_ReadPin(&Gpio, AD9361_1_CAL_DONE) == 0) && time_out_cnt <= AD9361_TIMEOUT_TH));
|
||||||
|
|
||||||
|
if (time_out_cnt == AD9361_TIMEOUT_TH)
|
||||||
|
{
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// begin to calibrate the 2nd ad9361
|
||||||
|
XGpioPs_WritePin(&Gpio, AD9361_2_CAL_START, 1);
|
||||||
|
mdelay(1);
|
||||||
|
XGpioPs_WritePin(&Gpio, AD9361_2_CAL_START, 0);
|
||||||
|
|
||||||
|
// read calibration status
|
||||||
|
time_out_cnt = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
mdelay(1); // Wait 1ms
|
||||||
|
time_out_cnt++;
|
||||||
|
} while (((XGpioPs_ReadPin(&Gpio, AD9361_2_CAL_DONE) == 0) && time_out_cnt <= AD9361_TIMEOUT_TH));
|
||||||
|
|
||||||
|
if (time_out_cnt == AD9361_TIMEOUT_TH)
|
||||||
|
{
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// enable single ad9361 tx channels
|
||||||
|
Status = ad9361_reg_write(ad9361_1_reg_inst, 0x0002, 0xA4); // Setup Tx Digital Filters/ Channels
|
||||||
|
|
||||||
|
// switch ad9361 tx & rx channel
|
||||||
|
Status = ad9361_reg_write(ad9361_1_reg_inst, 0x0004, 0x03);
|
||||||
|
Status = ad9361_reg_write(ad9361_2_reg_inst, 0x0004, 0x03);
|
||||||
|
|
||||||
|
// switch to higher frequency
|
||||||
|
Status = Hardware_SwitchFreq(ad9361_1_reg_inst, TX_FREQ_4125);
|
||||||
|
XGpioPs_WritePin(&Gpio, AD9361_TX_SWITCH, 0);
|
||||||
|
|
||||||
|
DBG_PRINT("Done.\n");
|
||||||
|
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/**
|
||||||
|
* @brief Hardware_SwitchFreq
|
||||||
|
*
|
||||||
|
* @param devSysMonitor_UpdateHardwareStatus(newHwState);
|
||||||
|
* @param freq
|
||||||
|
*
|
||||||
|
* @return None.
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
int32_t Hardware_SwitchFreq(struct ad9361_reg_dev *dev, ad9361TxFreq freq)
|
||||||
|
{
|
||||||
|
int32_t status = 0;
|
||||||
|
uint8_t value = 0;
|
||||||
|
int32_t time_out_cnt = 0;
|
||||||
|
|
||||||
|
switch (freq)
|
||||||
|
{
|
||||||
|
case TX_FREQ_125:
|
||||||
|
{
|
||||||
|
//************************************************************
|
||||||
|
// Setup Tx Frequency-Dependent Syntheisizer Registers
|
||||||
|
//************************************************************
|
||||||
|
status = ad9361_reg_write(dev, 0x027A, 0x4A); // Set VCO Output level[3:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x0279, 0xC1); // Set Init ALC Value[3:0] and VCO Varactor[3:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x0282, 0x0E); // Set VCO Bias Tcf[1:0] and VCO Bias Ref[2:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x0278, 0x78); // Set VCO Cal Offset[3:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x0285, 0x00); // Set VCO Cal Ref Tcf[2:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x0291, 0x0B); // Set VCO Varactor Reference[3:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x0290, 0x70); // Set VCO Varactor Ref Tcf[2:0] and VCO Varactor Offset[3:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x027B, 0x94); // Set Synth Loop Filter charge pump current (Icp)
|
||||||
|
status = ad9361_reg_write(dev, 0x027E, 0xF4); // Set Synth Loop Filter C2 and C1
|
||||||
|
status = ad9361_reg_write(dev, 0x027F, 0xDF); // Set Synth Loop Filter R1 and C3
|
||||||
|
status = ad9361_reg_write(dev, 0x0280, 0x0A); // Set Synth Loop Filter R3
|
||||||
|
|
||||||
|
//************************************************************
|
||||||
|
// Write Tx Frequency Words
|
||||||
|
//************************************************************
|
||||||
|
status = ad9361_reg_write(dev, 0x0273, 0x00); // Write Tx Synth Fractional Freq Word[7:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x0274, 0x00); // Write Tx Synth Fractional Freq Word[15:8]
|
||||||
|
status = ad9361_reg_write(dev, 0x0275, 0x00); // Write Tx Synth Fractional Freq Word[22:16]
|
||||||
|
status = ad9361_reg_write(dev, 0x0272, 0x00); // Write Tx Synth Integer Freq Word[10:8]
|
||||||
|
status = ad9361_reg_write(dev, 0x0271, 0xA0); // Write Tx Synth Integer Freq Word[7:0] (starts VCO cal)
|
||||||
|
status = ad9361_reg_write(dev, 0x0005, 0x57); // Set LO divider setting
|
||||||
|
|
||||||
|
//************************************************************
|
||||||
|
// Tx Quadrature Calibration Settings
|
||||||
|
//************************************************************
|
||||||
|
status = ad9361_reg_write(dev, 0x00A0, 0x75); // Set TxQuadcal NCO frequency
|
||||||
|
status = ad9361_reg_write(dev, 0x00A3, 0xC0); // Set TxQuadcal NCO frequency (Only update bits [7:6])
|
||||||
|
status = ad9361_reg_write(dev, 0x00A1, 0x7B); // Tx Quad Cal Configuration, Phase and Gain Cal Enable
|
||||||
|
status = ad9361_reg_write(dev, 0x00A9, 0xFF); // Set Tx Quad Cal Count
|
||||||
|
status = ad9361_reg_write(dev, 0x00A2, 0x7F); // Set Tx Quad Cal Kexp
|
||||||
|
status = ad9361_reg_write(dev, 0x00A5, 0x01); // Set Tx Quad Cal Magnitude Threshhold
|
||||||
|
status = ad9361_reg_write(dev, 0x00A6, 0x01); // Set Tx Quad Cal Magnitude Threshhold
|
||||||
|
status = ad9361_reg_write(dev, 0x00AA, 0x22); // Set Tx Quad Cal Gain Table index
|
||||||
|
status = ad9361_reg_write(dev, 0x00A4, 0xF0); // Set Tx Quad Cal Settle Count
|
||||||
|
status = ad9361_reg_write(dev, 0x00AE, 0x00); // Set Tx Quad Cal LPF Gain index incase Split table mode used
|
||||||
|
|
||||||
|
status = ad9361_reg_write(dev, 0x0169, 0xC0); // Disable Rx Quadrature Calibration before Running Tx Quadrature Calibration
|
||||||
|
status = ad9361_reg_write(dev, 0x0016, 0x10); // Start Tx Quad cal
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TX_FREQ_126:
|
||||||
|
{
|
||||||
|
//************************************************************
|
||||||
|
// Setup Tx Frequency-Dependent Syntheisizer Registers
|
||||||
|
//************************************************************
|
||||||
|
status = ad9361_reg_write(dev, 0x027A, 0x4A); // Set VCO Output level[3:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x0279, 0xC1); // Set Init ALC Value[3:0] and VCO Varactor[3:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x0282, 0x0E); // Set VCO Bias Tcf[1:0] and VCO Bias Ref[2:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x0278, 0x78); // Set VCO Cal Offset[3:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x0285, 0x00); // Set VCO Cal Ref Tcf[2:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x0291, 0x0B); // Set VCO Varactor Reference[3:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x0290, 0x70); // Set VCO Varactor Ref Tcf[2:0] and VCO Varactor Offset[3:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x027B, 0x93); // Set Synth Loop Filter charge pump current (Icp)
|
||||||
|
status = ad9361_reg_write(dev, 0x027E, 0xF4); // Set Synth Loop Filter C2 and C1
|
||||||
|
status = ad9361_reg_write(dev, 0x027F, 0xDF); // Set Synth Loop Filter R1 and C3
|
||||||
|
status = ad9361_reg_write(dev, 0x0280, 0x0A); // Set Synth Loop Filter R3
|
||||||
|
|
||||||
|
//************************************************************
|
||||||
|
// Write Tx Frequency Words
|
||||||
|
//************************************************************
|
||||||
|
status = ad9361_reg_write(dev, 0x0273, 0x06); // Write Tx Synth Fractional Freq Word[7:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x0274, 0xD7); // Write Tx Synth Fractional Freq Word[15:8]
|
||||||
|
status = ad9361_reg_write(dev, 0x0275, 0x23); // Write Tx Synth Fractional Freq Word[22:16]
|
||||||
|
status = ad9361_reg_write(dev, 0x0272, 0x00); // Write Tx Synth Integer Freq Word[10:8]
|
||||||
|
status = ad9361_reg_write(dev, 0x0271, 0xA1); // Write Tx Synth Integer Freq Word[7:0] (starts VCO cal)
|
||||||
|
status = ad9361_reg_write(dev, 0x0005, 0x57); // Set LO divider setting
|
||||||
|
|
||||||
|
//************************************************************
|
||||||
|
// Tx Quadrature Calibration Settings
|
||||||
|
//************************************************************
|
||||||
|
status = ad9361_reg_write(dev, 0x00A0, 0x75); // Set TxQuadcal NCO frequency
|
||||||
|
status = ad9361_reg_write(dev, 0x00A3, 0xC0); // Set TxQuadcal NCO frequency (Only update bits [7:6])
|
||||||
|
status = ad9361_reg_write(dev, 0x00A1, 0x7B); // Tx Quad Cal Configuration, Phase and Gain Cal Enable
|
||||||
|
status = ad9361_reg_write(dev, 0x00A9, 0xFF); // Set Tx Quad Cal Count
|
||||||
|
status = ad9361_reg_write(dev, 0x00A2, 0x7F); // Set Tx Quad Cal Kexp
|
||||||
|
status = ad9361_reg_write(dev, 0x00A5, 0x01); // Set Tx Quad Cal Magnitude Threshhold
|
||||||
|
status = ad9361_reg_write(dev, 0x00A6, 0x01); // Set Tx Quad Cal Magnitude Threshhold
|
||||||
|
status = ad9361_reg_write(dev, 0x00AA, 0x22); // Set Tx Quad Cal Gain Table index
|
||||||
|
status = ad9361_reg_write(dev, 0x00A4, 0xF0); // Set Tx Quad Cal Settle Count
|
||||||
|
status = ad9361_reg_write(dev, 0x00AE, 0x00); // Set Tx Quad Cal LPF Gain index incase Split table mode used
|
||||||
|
|
||||||
|
status = ad9361_reg_write(dev, 0x0169, 0xC0); // Disable Rx Quadrature Calibration before Running Tx Quadrature Calibration
|
||||||
|
status = ad9361_reg_write(dev, 0x0016, 0x10); // Start Tx Quad cal
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TX_FREQ_4125:
|
||||||
|
{
|
||||||
|
//************************************************************
|
||||||
|
// Setup Tx Frequency-Dependent Syntheisizer Registers
|
||||||
|
//************************************************************
|
||||||
|
status = ad9361_reg_write(dev, 0x027A, 0x4A); // Set VCO Output level[3:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x0279, 0xC1); // Set Init ALC Value[3:0] and VCO Varactor[3:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x0282, 0x0E); // Set VCO Bias Tcf[1:0] and VCO Bias Ref[2:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x0278, 0x78); // Set VCO Cal Offset[3:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x0285, 0x00); // Set VCO Cal Ref Tcf[2:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x0291, 0x0B); // Set VCO Varactor Reference[3:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x0290, 0x70); // Set VCO Varactor Ref Tcf[2:0] and VCO Varactor Offset[3:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x027B, 0x93); // Set Synth Loop Filter charge pump current (Icp)
|
||||||
|
status = ad9361_reg_write(dev, 0x027E, 0xF4); // Set Synth Loop Filter C2 and C1
|
||||||
|
status = ad9361_reg_write(dev, 0x027F, 0xDF); // Set Synth Loop Filter R1 and C3
|
||||||
|
status = ad9361_reg_write(dev, 0x0280, 0x0A); // Set Synth Loop Filter R3
|
||||||
|
|
||||||
|
//************************************************************
|
||||||
|
// Write Rx Frequency Words
|
||||||
|
//************************************************************
|
||||||
|
status = ad9361_reg_write(dev, 0x0273, 0x00); // Write Tx Synth Fractional Freq Word[7:0]
|
||||||
|
status = ad9361_reg_write(dev, 0x0274, 0x00); // Write Tx Synth Fractional Freq Word[15:8]
|
||||||
|
status = ad9361_reg_write(dev, 0x0275, 0x00); // Write Tx Synth Fractional Freq Word[22:16]
|
||||||
|
status = ad9361_reg_write(dev, 0x0272, 0x00); // Write Tx Synth Integer Freq Word[10:8]
|
||||||
|
status = ad9361_reg_write(dev, 0x0271, 0xA5); // Write Tx Synth Integer Freq Word[7:0] (starts VCO cal)
|
||||||
|
status = ad9361_reg_write(dev, 0x0005, 0x07); // Set LO divider setting
|
||||||
|
|
||||||
|
//************************************************************
|
||||||
|
// Tx Quadrature Calibration Settings
|
||||||
|
//************************************************************
|
||||||
|
status = ad9361_reg_write(dev, 0x00A0, 0x75); // Set TxQuadcal NCO frequency
|
||||||
|
status = ad9361_reg_write(dev, 0x00A3, 0xC0); // Set TxQuadcal NCO frequency (Only update bits [7:6])
|
||||||
|
status = ad9361_reg_write(dev, 0x00A1, 0x7B); // Tx Quad Cal Configuration, Phase and Gain Cal Enable
|
||||||
|
status = ad9361_reg_write(dev, 0x00A9, 0xFF); // Set Tx Quad Cal Count
|
||||||
|
status = ad9361_reg_write(dev, 0x00A2, 0x7F); // Set Tx Quad Cal Kexp
|
||||||
|
status = ad9361_reg_write(dev, 0x00A5, 0x01); // Set Tx Quad Cal Magnitude Threshhold
|
||||||
|
status = ad9361_reg_write(dev, 0x00A6, 0x01); // Set Tx Quad Cal Magnitude Threshhold
|
||||||
|
status = ad9361_reg_write(dev, 0x00AA, 0x28); // Set Tx Quad Cal Gain Table index
|
||||||
|
status = ad9361_reg_write(dev, 0x00A4, 0xF0); // Set Tx Quad Cal Settle Count
|
||||||
|
status = ad9361_reg_write(dev, 0x00AE, 0x04); // Set Tx Quad Cal LPF Gain index incase Split table mode used
|
||||||
|
|
||||||
|
status = ad9361_reg_write(dev, 0x0169, 0xC0); // Disable Rx Quadrature Calibration before Running Tx Quadrature Calibration
|
||||||
|
status = ad9361_reg_write(dev, 0x0016, 0x10); // Start Tx Quad cal
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait for cal to complete (Done when 0x016[4]==0)
|
||||||
|
time_out_cnt = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
status |= ad9361_reg_read(dev, 0x0016, &value);
|
||||||
|
mdelay(1); // Wait 1ms
|
||||||
|
time_out_cnt++;
|
||||||
|
} while ((value & 0x10) != 0x00 && time_out_cnt <= AD9361_TIMEOUT_TH);
|
||||||
|
}
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
// @ Get AD9361 - 1 temperature (Celsius Degree)
|
||||||
|
/**
|
||||||
|
* Read corresponding register to get AD9361 - 1 current temperature.
|
||||||
|
*/
|
||||||
|
int8_t Hardware_GetAD9361Temp_1(void)
|
||||||
|
{
|
||||||
|
int8_t scaleTemp;
|
||||||
|
|
||||||
|
ad9361_reg_write(ad9361_1_reg_inst, 0x001D, 0x01); // disable aux adc
|
||||||
|
ad9361_reg_read(ad9361_1_reg_inst, 0x000E, (uint8_t*)&scaleTemp);
|
||||||
|
ad9361_reg_write(ad9361_1_reg_inst, 0x001D, 0x00); // enable aux adc
|
||||||
|
|
||||||
|
return (int8_t) scaleTemp/1.16;
|
||||||
|
}
|
||||||
|
|
||||||
|
// @ Get AD9361 - 2 temperature (Celsius Degree)
|
||||||
|
/**
|
||||||
|
* Read corresponding register to get AD9361 - 2 current temperature.
|
||||||
|
*/
|
||||||
|
int8_t Hardware_GetAD9361Temp_2(void)
|
||||||
|
{
|
||||||
|
int8_t scaleTemp;
|
||||||
|
|
||||||
|
ad9361_reg_write(ad9361_2_reg_inst, 0x001D, 0x01); // disable aux adc
|
||||||
|
ad9361_reg_read(ad9361_2_reg_inst, 0x000E, (uint8_t*)&scaleTemp);
|
||||||
|
ad9361_reg_write(ad9361_2_reg_inst, 0x001D, 0x00); // enable aux adc
|
||||||
|
|
||||||
|
return (int8_t) scaleTemp/1.16;
|
||||||
|
}
|
||||||
|
|
||||||
|
// @ Determine AD9361 lock state
|
||||||
|
/**
|
||||||
|
* Read corresponding register to determine AD9361(both) lock state.
|
||||||
|
*/
|
||||||
|
uint8_t Hardware_GetAD9361LockStatus(void)
|
||||||
|
{
|
||||||
|
uint8_t ret = 0;
|
||||||
|
uint8_t regVal;
|
||||||
|
|
||||||
|
// bbpll
|
||||||
|
ad9361_reg_read(ad9361_1_reg_inst, 0x005E, ®Val); // [D7] is lock indicator
|
||||||
|
ret |= ((regVal & 0x80) == 0x80) ? CLK_AD0_BBPLL_LOCK : 0;
|
||||||
|
ad9361_reg_read(ad9361_2_reg_inst, 0x005E, ®Val); // [D7] is lock indicator
|
||||||
|
ret |= ((regVal & 0x80) == 0x80) ? CLK_AD1_BBPLL_LOCK : 0;
|
||||||
|
|
||||||
|
// rfpll
|
||||||
|
ad9361_reg_read(ad9361_1_reg_inst, 0x0287, ®Val); // [D1] is lock indicator
|
||||||
|
ret |= ((regVal & 0x02) == 0x02) ? CLK_AD0_RFPLL_LOCK : 0;
|
||||||
|
ad9361_reg_read(ad9361_2_reg_inst, 0x0287, ®Val); // [D1] is lock indicator
|
||||||
|
ret |= ((regVal & 0x02) == 0x02) ? CLK_AD1_RFPLL_LOCK : 0;
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// @ Determine HMC7044 lock state
|
||||||
|
/**
|
||||||
|
* Read corresponding register to determine clock lock state.
|
||||||
|
*/
|
||||||
|
uint8_t Hardware_GetHMC7044LockStatus(void)
|
||||||
|
{
|
||||||
|
uint8_t ret = 0;
|
||||||
|
uint8_t regVal;
|
||||||
|
|
||||||
|
// pll1
|
||||||
|
hmc7044_read(hmc7044_inst, 0x007C, ®Val); // [D5] is lock indicator
|
||||||
|
ret |= ((regVal & 0xE0) != 0x00) ? CLK_SP_PLL0_LOCK : 0;
|
||||||
|
|
||||||
|
// pll2
|
||||||
|
hmc7044_read(hmc7044_inst, 0x007D, ®Val); // [D0] is lock indicator
|
||||||
|
ret |= ((regVal & 0x01) == 0x01) ? CLK_SP_PLL1_LOCK : 0;
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
/*****************************************************************************/
|
||||||
|
/**
|
||||||
|
* Description: hwconfig.h
|
||||||
|
*
|
||||||
|
|
||||||
|
* Date: 2024-02-20 13:19
|
||||||
|
* Last Edit Time: [2024-02-20 13:19]
|
||||||
|
*
|
||||||
|
* Revisions: Rev 0.0
|
||||||
|
* History:
|
||||||
|
* [2023-05-07]: Initial edition.
|
||||||
|
*
|
||||||
|
* Copyright(c) 2024 Beijing Institute of Technology.
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/***************************** Include Files *********************************/
|
||||||
|
// Standard
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "config/app_config.h"
|
||||||
|
#include "drivers/rf-transceiver/ad9361_reg/ad9361_reg.h"
|
||||||
|
#include "drivers/rf-transceiver/ad9361/ad9361_api.h"
|
||||||
|
|
||||||
|
/************************** Function Prototypes ******************************/
|
||||||
|
int32_t Hardware_Init(void);
|
||||||
|
int32_t Hardware_SwitchFreq(struct ad9361_reg_dev *dev, ad9361TxFreq freq);
|
||||||
|
int8_t Hardware_GetAD9361Temp_1(void);
|
||||||
|
int8_t Hardware_GetAD9361Temp_2(void);
|
||||||
|
uint8_t Hardware_GetAD9361LockStatus(void);
|
||||||
|
uint8_t Hardware_GetHMC7044LockStatus(void);
|
||||||
|
|
||||||
|
|
||||||
@@ -26,6 +26,7 @@ MEMORY
|
|||||||
phy_data_interface_rx_frame_bram_ctrl_Mem0 : ORIGIN = 0x40000000, LENGTH = 0x2000
|
phy_data_interface_rx_frame_bram_ctrl_Mem0 : ORIGIN = 0x40000000, LENGTH = 0x2000
|
||||||
phy_data_interface_tx_frame_bram_ctrl_Mem0 : ORIGIN = 0x40002000, LENGTH = 0x2000
|
phy_data_interface_tx_frame_bram_ctrl_Mem0 : ORIGIN = 0x40002000, LENGTH = 0x2000
|
||||||
phy_data_interface_ant_info_bram_ctrl_Mem0 : ORIGIN = 0x40004000, LENGTH = 0x2000
|
phy_data_interface_ant_info_bram_ctrl_Mem0 : ORIGIN = 0x40004000, LENGTH = 0x2000
|
||||||
|
phy_data_interface_ant_beam_bram_ctrl_Mem0 : ORIGIN = 0x42000000, LENGTH = 0x1000
|
||||||
ps7_ddr_0 : ORIGIN = 0x100000, LENGTH = 0x1FF00000
|
ps7_ddr_0 : ORIGIN = 0x100000, LENGTH = 0x1FF00000
|
||||||
ps7_qspi_linear_0 : ORIGIN = 0xFC000000, LENGTH = 0x1000000
|
ps7_qspi_linear_0 : ORIGIN = 0xFC000000, LENGTH = 0x1000000
|
||||||
ps7_ram_0 : ORIGIN = 0x0, LENGTH = 0x30000
|
ps7_ram_0 : ORIGIN = 0x0, LENGTH = 0x30000
|
||||||
|
|||||||
+12
-363
@@ -20,19 +20,15 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
// Xilinx
|
// Xilinx
|
||||||
#include "sleep.h"
|
|
||||||
#include "xil_cache.h"
|
|
||||||
#include "xscugic.h"
|
#include "xscugic.h"
|
||||||
#include "xscutimer.h"
|
|
||||||
#include "xgpiops.h"
|
|
||||||
#include "drivers/platform/xilinx_irq.h"
|
#include "drivers/platform/xilinx_irq.h"
|
||||||
#include "drivers/platform/xilinx_timer.h"
|
#include "drivers/platform/xilinx_timer.h"
|
||||||
#include "drivers/rf-transceiver/ad9361/ad9361_api.h"
|
|
||||||
#include "drivers/axi_core/spi_engine/spi_engine.h"
|
|
||||||
// App
|
// App
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "error.h"
|
#include "error.h"
|
||||||
#include "timer.h"
|
#include "timer.h"
|
||||||
|
#include "hwconfig.h"
|
||||||
|
#include "system_monitor.h"
|
||||||
#include "config/app_config.h"
|
#include "config/app_config.h"
|
||||||
#include "dev_profile/dev_profile.h"
|
#include "dev_profile/dev_profile.h"
|
||||||
#include "systembus/systembus.h"
|
#include "systembus/systembus.h"
|
||||||
@@ -46,6 +42,7 @@ void PeriodicPull_Handler(void *callBackRef);
|
|||||||
void ScuTimer_IntrHandler(void *context);
|
void ScuTimer_IntrHandler(void *context);
|
||||||
void Systembus_RxIntrHandler(void *context);
|
void Systembus_RxIntrHandler(void *context);
|
||||||
void Systembus_TxIntrHandler(void *context);
|
void Systembus_TxIntrHandler(void *context);
|
||||||
|
|
||||||
/************************** Constant Definitions *****************************/
|
/************************** Constant Definitions *****************************/
|
||||||
struct callback_desc phy_callback_desc = {
|
struct callback_desc phy_callback_desc = {
|
||||||
.callback = Phy_IntrHandler,
|
.callback = Phy_IntrHandler,
|
||||||
@@ -99,9 +96,14 @@ static PHY_CONFIG phyConfig = {
|
|||||||
.devId = 0,
|
.devId = 0,
|
||||||
.baseAddr = PHY_BASEADDR,
|
.baseAddr = PHY_BASEADDR,
|
||||||
.antBramId = PHY_ANTCONFIG_BRAM_DEVICE_ID,
|
.antBramId = PHY_ANTCONFIG_BRAM_DEVICE_ID,
|
||||||
|
.antInfoBramId = PHY_ANTINFO_BRAM_DEVICE_ID,
|
||||||
.txBramId = PHY_TXBUFF_BRAM_DEVICE_ID,
|
.txBramId = PHY_TXBUFF_BRAM_DEVICE_ID,
|
||||||
.rxBramId = PHY_RXBUFF_BRAM_DEVICE_ID,
|
.rxBramId = PHY_RXBUFF_BRAM_DEVICE_ID,
|
||||||
.hwXadcId = PHY_HW_XADC_DEVICE_ID
|
.hwXadcId = PHY_HW_XADC_DEVICE_ID,
|
||||||
|
.get_clk_state = Hardware_GetHMC7044LockStatus,
|
||||||
|
.get_ad_lock_state = Hardware_GetAD9361LockStatus,
|
||||||
|
.get_ad0_temp = Hardware_GetAD9361Temp_1,
|
||||||
|
.get_ad1_temp = Hardware_GetAD9361Temp_2
|
||||||
};
|
};
|
||||||
|
|
||||||
TMC_CONFIG tmcConfig = {
|
TMC_CONFIG tmcConfig = {
|
||||||
@@ -122,11 +124,7 @@ static PHY_INST *phyInstPtr;
|
|||||||
static TMC_INST *tmcInstPtr = NULL;
|
static TMC_INST *tmcInstPtr = NULL;
|
||||||
L2_INST *linkInstPtr;
|
L2_INST *linkInstPtr;
|
||||||
|
|
||||||
static struct hmc7044_dev *hmc7044_inst;
|
|
||||||
static struct ad9361_reg_dev *ad9361_1_reg_inst;
|
|
||||||
static struct ad9361_reg_dev *ad9361_2_reg_inst;
|
|
||||||
// static struct ad9361_rf_phy *ad9361_phy;
|
|
||||||
// static struct ad9361_rf_phy *ad9361_2_phy;
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
/**
|
/**
|
||||||
* This function is responsible for initializing the SCUGIC instance, looking
|
* This function is responsible for initializing the SCUGIC instance, looking
|
||||||
@@ -370,355 +368,6 @@ void ScuTimer_IntrHandler(void *context)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/**
|
|
||||||
* @brief Hardware_SwitchFreq
|
|
||||||
*
|
|
||||||
* @param devSysMonitor_UpdateHardwareStatus(newHwState);
|
|
||||||
* @param freq
|
|
||||||
*
|
|
||||||
* @return None.
|
|
||||||
*
|
|
||||||
******************************************************************************/
|
|
||||||
int Hardware_SwitchFreq(struct ad9361_reg_dev *dev, ad9361TxFreq freq)
|
|
||||||
{
|
|
||||||
int32_t status = 0;
|
|
||||||
uint8_t value = 0;
|
|
||||||
int32_t time_out_cnt = 0;
|
|
||||||
|
|
||||||
switch (freq)
|
|
||||||
{
|
|
||||||
case TX_FREQ_125:
|
|
||||||
{
|
|
||||||
//************************************************************
|
|
||||||
// Setup Tx Frequency-Dependent Syntheisizer Registers
|
|
||||||
//************************************************************
|
|
||||||
status = ad9361_reg_write(dev, 0x027A, 0x4A); // Set VCO Output level[3:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x0279, 0xC1); // Set Init ALC Value[3:0] and VCO Varactor[3:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x0282, 0x0E); // Set VCO Bias Tcf[1:0] and VCO Bias Ref[2:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x0278, 0x78); // Set VCO Cal Offset[3:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x0285, 0x00); // Set VCO Cal Ref Tcf[2:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x0291, 0x0B); // Set VCO Varactor Reference[3:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x0290, 0x70); // Set VCO Varactor Ref Tcf[2:0] and VCO Varactor Offset[3:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x027B, 0x94); // Set Synth Loop Filter charge pump current (Icp)
|
|
||||||
status = ad9361_reg_write(dev, 0x027E, 0xF4); // Set Synth Loop Filter C2 and C1
|
|
||||||
status = ad9361_reg_write(dev, 0x027F, 0xDF); // Set Synth Loop Filter R1 and C3
|
|
||||||
status = ad9361_reg_write(dev, 0x0280, 0x0A); // Set Synth Loop Filter R3
|
|
||||||
|
|
||||||
//************************************************************
|
|
||||||
// Write Tx Frequency Words
|
|
||||||
//************************************************************
|
|
||||||
status = ad9361_reg_write(dev, 0x0273, 0x00); // Write Tx Synth Fractional Freq Word[7:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x0274, 0x00); // Write Tx Synth Fractional Freq Word[15:8]
|
|
||||||
status = ad9361_reg_write(dev, 0x0275, 0x00); // Write Tx Synth Fractional Freq Word[22:16]
|
|
||||||
status = ad9361_reg_write(dev, 0x0272, 0x00); // Write Tx Synth Integer Freq Word[10:8]
|
|
||||||
status = ad9361_reg_write(dev, 0x0271, 0xA0); // Write Tx Synth Integer Freq Word[7:0] (starts VCO cal)
|
|
||||||
status = ad9361_reg_write(dev, 0x0005, 0x57); // Set LO divider setting
|
|
||||||
|
|
||||||
//************************************************************
|
|
||||||
// Tx Quadrature Calibration Settings
|
|
||||||
//************************************************************
|
|
||||||
status = ad9361_reg_write(dev, 0x00A0, 0x75); // Set TxQuadcal NCO frequency
|
|
||||||
status = ad9361_reg_write(dev, 0x00A3, 0xC0); // Set TxQuadcal NCO frequency (Only update bits [7:6])
|
|
||||||
status = ad9361_reg_write(dev, 0x00A1, 0x7B); // Tx Quad Cal Configuration, Phase and Gain Cal Enable
|
|
||||||
status = ad9361_reg_write(dev, 0x00A9, 0xFF); // Set Tx Quad Cal Count
|
|
||||||
status = ad9361_reg_write(dev, 0x00A2, 0x7F); // Set Tx Quad Cal Kexp
|
|
||||||
status = ad9361_reg_write(dev, 0x00A5, 0x01); // Set Tx Quad Cal Magnitude Threshhold
|
|
||||||
status = ad9361_reg_write(dev, 0x00A6, 0x01); // Set Tx Quad Cal Magnitude Threshhold
|
|
||||||
status = ad9361_reg_write(dev, 0x00AA, 0x22); // Set Tx Quad Cal Gain Table index
|
|
||||||
status = ad9361_reg_write(dev, 0x00A4, 0xF0); // Set Tx Quad Cal Settle Count
|
|
||||||
status = ad9361_reg_write(dev, 0x00AE, 0x00); // Set Tx Quad Cal LPF Gain index incase Split table mode used
|
|
||||||
|
|
||||||
status = ad9361_reg_write(dev, 0x0169, 0xC0); // Disable Rx Quadrature Calibration before Running Tx Quadrature Calibration
|
|
||||||
status = ad9361_reg_write(dev, 0x0016, 0x10); // Start Tx Quad cal
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case TX_FREQ_126:
|
|
||||||
{
|
|
||||||
//************************************************************
|
|
||||||
// Setup Tx Frequency-Dependent Syntheisizer Registers
|
|
||||||
//************************************************************
|
|
||||||
status = ad9361_reg_write(dev, 0x027A, 0x4A); // Set VCO Output level[3:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x0279, 0xC1); // Set Init ALC Value[3:0] and VCO Varactor[3:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x0282, 0x0E); // Set VCO Bias Tcf[1:0] and VCO Bias Ref[2:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x0278, 0x78); // Set VCO Cal Offset[3:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x0285, 0x00); // Set VCO Cal Ref Tcf[2:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x0291, 0x0B); // Set VCO Varactor Reference[3:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x0290, 0x70); // Set VCO Varactor Ref Tcf[2:0] and VCO Varactor Offset[3:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x027B, 0x93); // Set Synth Loop Filter charge pump current (Icp)
|
|
||||||
status = ad9361_reg_write(dev, 0x027E, 0xF4); // Set Synth Loop Filter C2 and C1
|
|
||||||
status = ad9361_reg_write(dev, 0x027F, 0xDF); // Set Synth Loop Filter R1 and C3
|
|
||||||
status = ad9361_reg_write(dev, 0x0280, 0x0A); // Set Synth Loop Filter R3
|
|
||||||
|
|
||||||
//************************************************************
|
|
||||||
// Write Tx Frequency Words
|
|
||||||
//************************************************************
|
|
||||||
status = ad9361_reg_write(dev, 0x0273, 0x06); // Write Tx Synth Fractional Freq Word[7:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x0274, 0xD7); // Write Tx Synth Fractional Freq Word[15:8]
|
|
||||||
status = ad9361_reg_write(dev, 0x0275, 0x23); // Write Tx Synth Fractional Freq Word[22:16]
|
|
||||||
status = ad9361_reg_write(dev, 0x0272, 0x00); // Write Tx Synth Integer Freq Word[10:8]
|
|
||||||
status = ad9361_reg_write(dev, 0x0271, 0xA1); // Write Tx Synth Integer Freq Word[7:0] (starts VCO cal)
|
|
||||||
status = ad9361_reg_write(dev, 0x0005, 0x57); // Set LO divider setting
|
|
||||||
|
|
||||||
//************************************************************
|
|
||||||
// Tx Quadrature Calibration Settings
|
|
||||||
//************************************************************
|
|
||||||
status = ad9361_reg_write(dev, 0x00A0, 0x75); // Set TxQuadcal NCO frequency
|
|
||||||
status = ad9361_reg_write(dev, 0x00A3, 0xC0); // Set TxQuadcal NCO frequency (Only update bits [7:6])
|
|
||||||
status = ad9361_reg_write(dev, 0x00A1, 0x7B); // Tx Quad Cal Configuration, Phase and Gain Cal Enable
|
|
||||||
status = ad9361_reg_write(dev, 0x00A9, 0xFF); // Set Tx Quad Cal Count
|
|
||||||
status = ad9361_reg_write(dev, 0x00A2, 0x7F); // Set Tx Quad Cal Kexp
|
|
||||||
status = ad9361_reg_write(dev, 0x00A5, 0x01); // Set Tx Quad Cal Magnitude Threshhold
|
|
||||||
status = ad9361_reg_write(dev, 0x00A6, 0x01); // Set Tx Quad Cal Magnitude Threshhold
|
|
||||||
status = ad9361_reg_write(dev, 0x00AA, 0x22); // Set Tx Quad Cal Gain Table index
|
|
||||||
status = ad9361_reg_write(dev, 0x00A4, 0xF0); // Set Tx Quad Cal Settle Count
|
|
||||||
status = ad9361_reg_write(dev, 0x00AE, 0x00); // Set Tx Quad Cal LPF Gain index incase Split table mode used
|
|
||||||
|
|
||||||
status = ad9361_reg_write(dev, 0x0169, 0xC0); // Disable Rx Quadrature Calibration before Running Tx Quadrature Calibration
|
|
||||||
status = ad9361_reg_write(dev, 0x0016, 0x10); // Start Tx Quad cal
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case TX_FREQ_4125:
|
|
||||||
{
|
|
||||||
//************************************************************
|
|
||||||
// Setup Tx Frequency-Dependent Syntheisizer Registers
|
|
||||||
//************************************************************
|
|
||||||
status = ad9361_reg_write(dev, 0x027A, 0x4A); // Set VCO Output level[3:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x0279, 0xC1); // Set Init ALC Value[3:0] and VCO Varactor[3:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x0282, 0x0E); // Set VCO Bias Tcf[1:0] and VCO Bias Ref[2:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x0278, 0x78); // Set VCO Cal Offset[3:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x0285, 0x00); // Set VCO Cal Ref Tcf[2:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x0291, 0x0B); // Set VCO Varactor Reference[3:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x0290, 0x70); // Set VCO Varactor Ref Tcf[2:0] and VCO Varactor Offset[3:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x027B, 0x93); // Set Synth Loop Filter charge pump current (Icp)
|
|
||||||
status = ad9361_reg_write(dev, 0x027E, 0xF4); // Set Synth Loop Filter C2 and C1
|
|
||||||
status = ad9361_reg_write(dev, 0x027F, 0xDF); // Set Synth Loop Filter R1 and C3
|
|
||||||
status = ad9361_reg_write(dev, 0x0280, 0x0A); // Set Synth Loop Filter R3
|
|
||||||
|
|
||||||
//************************************************************
|
|
||||||
// Write Rx Frequency Words
|
|
||||||
//************************************************************
|
|
||||||
status = ad9361_reg_write(dev, 0x0273, 0x00); // Write Tx Synth Fractional Freq Word[7:0]
|
|
||||||
status = ad9361_reg_write(dev, 0x0274, 0x00); // Write Tx Synth Fractional Freq Word[15:8]
|
|
||||||
status = ad9361_reg_write(dev, 0x0275, 0x00); // Write Tx Synth Fractional Freq Word[22:16]
|
|
||||||
status = ad9361_reg_write(dev, 0x0272, 0x00); // Write Tx Synth Integer Freq Word[10:8]
|
|
||||||
status = ad9361_reg_write(dev, 0x0271, 0xA5); // Write Tx Synth Integer Freq Word[7:0] (starts VCO cal)
|
|
||||||
status = ad9361_reg_write(dev, 0x0005, 0x07); // Set LO divider setting
|
|
||||||
|
|
||||||
//************************************************************
|
|
||||||
// Tx Quadrature Calibration Settings
|
|
||||||
//************************************************************
|
|
||||||
status = ad9361_reg_write(dev, 0x00A0, 0x75); // Set TxQuadcal NCO frequency
|
|
||||||
status = ad9361_reg_write(dev, 0x00A3, 0xC0); // Set TxQuadcal NCO frequency (Only update bits [7:6])
|
|
||||||
status = ad9361_reg_write(dev, 0x00A1, 0x7B); // Tx Quad Cal Configuration, Phase and Gain Cal Enable
|
|
||||||
status = ad9361_reg_write(dev, 0x00A9, 0xFF); // Set Tx Quad Cal Count
|
|
||||||
status = ad9361_reg_write(dev, 0x00A2, 0x7F); // Set Tx Quad Cal Kexp
|
|
||||||
status = ad9361_reg_write(dev, 0x00A5, 0x01); // Set Tx Quad Cal Magnitude Threshhold
|
|
||||||
status = ad9361_reg_write(dev, 0x00A6, 0x01); // Set Tx Quad Cal Magnitude Threshhold
|
|
||||||
status = ad9361_reg_write(dev, 0x00AA, 0x28); // Set Tx Quad Cal Gain Table index
|
|
||||||
status = ad9361_reg_write(dev, 0x00A4, 0xF0); // Set Tx Quad Cal Settle Count
|
|
||||||
status = ad9361_reg_write(dev, 0x00AE, 0x04); // Set Tx Quad Cal LPF Gain index incase Split table mode used
|
|
||||||
|
|
||||||
status = ad9361_reg_write(dev, 0x0169, 0xC0); // Disable Rx Quadrature Calibration before Running Tx Quadrature Calibration
|
|
||||||
status = ad9361_reg_write(dev, 0x0016, 0x10); // Start Tx Quad cal
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Wait for cal to complete (Done when 0x016[4]==0)
|
|
||||||
time_out_cnt = 0;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
status |= ad9361_reg_read(dev, 0x0016, &value);
|
|
||||||
mdelay(1); // Wait 1ms
|
|
||||||
time_out_cnt++;
|
|
||||||
} while ((value & 0x10) != 0x00 && time_out_cnt <= AD9361_TIMEOUT_TH);
|
|
||||||
}
|
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/**
|
|
||||||
* @brief Hardware_Init
|
|
||||||
*
|
|
||||||
* @param none.
|
|
||||||
*
|
|
||||||
* @return None.
|
|
||||||
*
|
|
||||||
******************************************************************************/
|
|
||||||
int Hardware_Init(void)
|
|
||||||
{
|
|
||||||
int32_t Status;
|
|
||||||
XGpioPs Gpio;
|
|
||||||
XGpioPs_Config *ConfigPtr;
|
|
||||||
ConfigPtr = XGpioPs_LookupConfig(AD9361_GPIO_DEVICE_ID);
|
|
||||||
Status = XGpioPs_CfgInitialize(&Gpio, ConfigPtr, ConfigPtr->BaseAddr);
|
|
||||||
if (Status != SUCCESS)
|
|
||||||
{
|
|
||||||
return FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**********************************************************/
|
|
||||||
/****************** HMC7044 Configuration *****************/
|
|
||||||
/**********************************************************/
|
|
||||||
Status = hmc7044_init(&hmc7044_inst, &hmc7044_default_init_param);
|
|
||||||
if (Status != SUCCESS)
|
|
||||||
{
|
|
||||||
DBG_ERROR("hmc7044_init() error: %" PRId32 "\n", Status);
|
|
||||||
return FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**********************************************************/
|
|
||||||
/***************** AD9361-1 Configuration *****************/
|
|
||||||
/**********************************************************/
|
|
||||||
XGpioPs_SetDirectionPin(&Gpio, AD9361_1_TXNRX, AD9361_GPIO_OUTPUT);
|
|
||||||
XGpioPs_SetDirectionPin(&Gpio, AD9361_1_ENABLE, AD9361_GPIO_OUTPUT);
|
|
||||||
XGpioPs_SetDirectionPin(&Gpio, AD9361_1_EN_AGC, AD9361_GPIO_OUTPUT);
|
|
||||||
XGpioPs_SetDirectionPin(&Gpio, AD9361_1_RESET_B, AD9361_GPIO_OUTPUT);
|
|
||||||
|
|
||||||
ad9361_reg_init(&ad9361_1_reg_inst, &ad9361_1_reg_default_init_param);
|
|
||||||
XGpioPs_WritePin(&Gpio, AD9361_1_ENABLE, 0);
|
|
||||||
ad9361_reg_config(ad9361_1_reg_inst);
|
|
||||||
XGpioPs_WritePin(&Gpio, AD9361_1_ENABLE, 1);
|
|
||||||
|
|
||||||
// Status = ad9361_init(&ad9361_phy, &ad9361_default_init_param);
|
|
||||||
// if (Status != XST_SUCCESS){
|
|
||||||
// return XST_FAILURE;
|
|
||||||
// }else{
|
|
||||||
// printf("Configurate AD9361 Completely!\n");
|
|
||||||
// }
|
|
||||||
// ad9361_set_tx_fir_config(ad9361_phy, tx_fir_config);
|
|
||||||
// ad9361_set_rx_fir_config(ad9361_phy, rx_fir_config);
|
|
||||||
|
|
||||||
/**********************************************************/
|
|
||||||
/***************** AD9361-2 Configuration *****************/
|
|
||||||
/**********************************************************/
|
|
||||||
XGpioPs_SetDirectionPin(&Gpio, AD9361_2_TXNRX, AD9361_GPIO_OUTPUT);
|
|
||||||
XGpioPs_SetDirectionPin(&Gpio, AD9361_2_ENABLE, AD9361_GPIO_OUTPUT);
|
|
||||||
XGpioPs_SetDirectionPin(&Gpio, AD9361_2_EN_AGC, AD9361_GPIO_OUTPUT);
|
|
||||||
XGpioPs_SetDirectionPin(&Gpio, AD9361_2_RESET_B, AD9361_GPIO_OUTPUT);
|
|
||||||
|
|
||||||
ad9361_reg_init(&ad9361_2_reg_inst, &ad9361_2_reg_default_init_param);
|
|
||||||
XGpioPs_WritePin(&Gpio, AD9361_2_ENABLE, 0);
|
|
||||||
ad9361_reg_config(ad9361_2_reg_inst);
|
|
||||||
XGpioPs_WritePin(&Gpio, AD9361_2_ENABLE, 1);
|
|
||||||
|
|
||||||
// uint8_t rd_back;
|
|
||||||
// Status = ad9361_reg_read(ad9361_1_reg_inst, 0x0002, &rd_back);
|
|
||||||
// Status = ad9361_reg_read(ad9361_2_reg_inst, 0x0002, &rd_back);
|
|
||||||
|
|
||||||
/**********************************************************/
|
|
||||||
/******* AD9361 Baseband Multichip Synchronization ********/
|
|
||||||
/**********************************************************/
|
|
||||||
XGpioPs_SetDirectionPin(&Gpio, AD9361_SYNC, AD9361_GPIO_OUTPUT);
|
|
||||||
XGpioPs_SetDirectionPin(&Gpio, AD9361_RX_FIFO_RST, AD9361_GPIO_OUTPUT);
|
|
||||||
|
|
||||||
// SYNC BBPLL and DIGITAL SAMPLING CLOCKS
|
|
||||||
ad9361_reg_write(ad9361_1_reg_inst, 0x0001, 0x0D); // MCS RF Enable; MCS BBPLL Enable; MCS BB Enable
|
|
||||||
ad9361_reg_write(ad9361_2_reg_inst, 0x0001, 0x0D);
|
|
||||||
ad9361_reg_write(ad9361_1_reg_inst, 0x0047, 0x80); // MCS refclk Scale Enable
|
|
||||||
ad9361_reg_write(ad9361_2_reg_inst, 0x0047, 0x80);
|
|
||||||
XGpioPs_WritePin(&Gpio, AD9361_SYNC, 0);
|
|
||||||
mdelay(20);
|
|
||||||
XGpioPs_WritePin(&Gpio, AD9361_SYNC, 1); // Input a rising-edge pulse to the SYNC_IN pin
|
|
||||||
mdelay(500);
|
|
||||||
XGpioPs_WritePin(&Gpio, AD9361_SYNC, 0);
|
|
||||||
mdelay(2000);
|
|
||||||
ad9361_reg_write(ad9361_1_reg_inst, 0x0001, 0x0B); // MCS RF Enable; MCS Digital CLK Enable ; MCS BB Enable
|
|
||||||
ad9361_reg_write(ad9361_2_reg_inst, 0x0001, 0x0B);
|
|
||||||
XGpioPs_WritePin(&Gpio, AD9361_SYNC, 1); // Input another rising-edge pulse to the SYNC_IN pin
|
|
||||||
mdelay(500);
|
|
||||||
XGpioPs_WritePin(&Gpio, AD9361_SYNC, 0);
|
|
||||||
ad9361_reg_write(ad9361_1_reg_inst, 0x0001, 0x08); // clear MCS bits
|
|
||||||
ad9361_reg_write(ad9361_2_reg_inst, 0x0001, 0x08);
|
|
||||||
|
|
||||||
XGpioPs_WritePin(&Gpio, AD9361_RX_FIFO_RST, 0);
|
|
||||||
mdelay(20);
|
|
||||||
XGpioPs_WritePin(&Gpio, AD9361_RX_FIFO_RST, 1);
|
|
||||||
mdelay(20);
|
|
||||||
XGpioPs_WritePin(&Gpio, AD9361_RX_FIFO_RST, 0);
|
|
||||||
|
|
||||||
/**********************************************************/
|
|
||||||
/********* AD9361 Multichip Rx Phase Calibration **********/
|
|
||||||
/**********************************************************/
|
|
||||||
XGpioPs_SetDirectionPin(&Gpio, AD9361_TX_SWITCH, AD9361_GPIO_OUTPUT);
|
|
||||||
XGpioPs_SetDirectionPin(&Gpio, AD9361_1_CAL_START, AD9361_GPIO_OUTPUT);
|
|
||||||
XGpioPs_SetDirectionPin(&Gpio, AD9361_1_CAL_DONE, AD9361_GPIO_INPUT);
|
|
||||||
XGpioPs_SetDirectionPin(&Gpio, AD9361_2_CAL_START, AD9361_GPIO_OUTPUT);
|
|
||||||
XGpioPs_SetDirectionPin(&Gpio, AD9361_2_CAL_DONE, AD9361_GPIO_INPUT);
|
|
||||||
|
|
||||||
// switch to lower frequency
|
|
||||||
Status = Hardware_SwitchFreq(ad9361_1_reg_inst, TX_FREQ_126);
|
|
||||||
XGpioPs_WritePin(&Gpio, AD9361_TX_SWITCH, 1);
|
|
||||||
mdelay(20);
|
|
||||||
|
|
||||||
// switch rx channel
|
|
||||||
Status = ad9361_reg_write(ad9361_1_reg_inst, 0x0004, 0x30);
|
|
||||||
Status = ad9361_reg_write(ad9361_2_reg_inst, 0x0004, 0x30);
|
|
||||||
|
|
||||||
// enable dual ad9361 tx channels
|
|
||||||
Status = ad9361_reg_write(ad9361_1_reg_inst, 0x0002, 0xE4); // Setup Tx Digital Filters/ Channels
|
|
||||||
|
|
||||||
// switch ad9361 tx channel
|
|
||||||
Status = ad9361_reg_write(ad9361_1_reg_inst, 0x0004, 0x70); // Select Rx input pin(A,B,C)/ Tx out pin (A,B)
|
|
||||||
mdelay(20);
|
|
||||||
|
|
||||||
// begin to calibrate the 1st ad9361
|
|
||||||
XGpioPs_WritePin(&Gpio, AD9361_1_CAL_START, 0);
|
|
||||||
XGpioPs_WritePin(&Gpio, AD9361_1_CAL_START, 1);
|
|
||||||
mdelay(1);
|
|
||||||
XGpioPs_WritePin(&Gpio, AD9361_1_CAL_START, 0);
|
|
||||||
|
|
||||||
// read calibration status
|
|
||||||
int32_t time_out_cnt = 0;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
mdelay(1); // Wait 1ms
|
|
||||||
time_out_cnt++;
|
|
||||||
} while (((XGpioPs_ReadPin(&Gpio, AD9361_1_CAL_DONE) == 0) && time_out_cnt <= AD9361_TIMEOUT_TH));
|
|
||||||
|
|
||||||
if (time_out_cnt == AD9361_TIMEOUT_TH)
|
|
||||||
{
|
|
||||||
return FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// begin to calibrate the 2nd ad9361
|
|
||||||
XGpioPs_WritePin(&Gpio, AD9361_2_CAL_START, 1);
|
|
||||||
mdelay(1);
|
|
||||||
XGpioPs_WritePin(&Gpio, AD9361_2_CAL_START, 0);
|
|
||||||
|
|
||||||
// read calibration status
|
|
||||||
time_out_cnt = 0;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
mdelay(1); // Wait 1ms
|
|
||||||
time_out_cnt++;
|
|
||||||
} while (((XGpioPs_ReadPin(&Gpio, AD9361_2_CAL_DONE) == 0) && time_out_cnt <= AD9361_TIMEOUT_TH));
|
|
||||||
|
|
||||||
if (time_out_cnt == AD9361_TIMEOUT_TH)
|
|
||||||
{
|
|
||||||
return FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// enable single ad9361 tx channels
|
|
||||||
Status = ad9361_reg_write(ad9361_1_reg_inst, 0x0002, 0xA4); // Setup Tx Digital Filters/ Channels
|
|
||||||
|
|
||||||
// switch ad9361 tx & rx channel
|
|
||||||
Status = ad9361_reg_write(ad9361_1_reg_inst, 0x0004, 0x03);
|
|
||||||
Status = ad9361_reg_write(ad9361_2_reg_inst, 0x0004, 0x03);
|
|
||||||
|
|
||||||
// switch to higher frequency
|
|
||||||
Status = Hardware_SwitchFreq(ad9361_1_reg_inst, TX_FREQ_4125);
|
|
||||||
XGpioPs_WritePin(&Gpio, AD9361_TX_SWITCH, 0);
|
|
||||||
|
|
||||||
DBG_PRINT("Done.\n");
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/**
|
/**
|
||||||
* @brief Main function, initialize all the device needed, initialize
|
* @brief Main function, initialize all the device needed, initialize
|
||||||
@@ -835,7 +484,7 @@ int main(void)
|
|||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
// System bus handler
|
// System bus handler
|
||||||
if (SystemBus_IsReqPendding(sysbusDescPtr))
|
if (SystemBus_IsReqPending(sysbusDescPtr))
|
||||||
{
|
{
|
||||||
Status = SystemBus_HandleCmd(sysbusDescPtr);
|
Status = SystemBus_HandleCmd(sysbusDescPtr);
|
||||||
if (Status != SUCCESS)
|
if (Status != SUCCESS)
|
||||||
@@ -843,7 +492,7 @@ int main(void)
|
|||||||
DBG_ERROR("SystemBus_HandleCmd exit with ErrorCode: %" PRId32 ".\n", Status);
|
DBG_ERROR("SystemBus_HandleCmd exit with ErrorCode: %" PRId32 ".\n", Status);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (SystemBus_IsRsqPendding(sysbusDescPtr) && (!SystemBus_IsTxBusy(sysbusDescPtr)))
|
if (SystemBus_IsRsqPending(sysbusDescPtr) && (!SystemBus_IsTxBusy(sysbusDescPtr)))
|
||||||
{
|
{
|
||||||
// FIXME: Required by 12 (CASC)
|
// FIXME: Required by 12 (CASC)
|
||||||
udelay(4000);
|
udelay(4000);
|
||||||
|
|||||||
@@ -31,7 +31,8 @@
|
|||||||
#endif
|
#endif
|
||||||
/************************** Constant Definitions *****************************/
|
/************************** Constant Definitions *****************************/
|
||||||
#define NET_START_TIME_INFTY UINT32_MAX
|
#define NET_START_TIME_INFTY UINT32_MAX
|
||||||
#define LINK_BROCK_THRESHOLD (3 * 200) // 3 secods
|
#define LINK_BROCK_THRESHOLD L2_SLOTS_PER_FRAME // 0.5 secods
|
||||||
|
|
||||||
/************************** Variable Definitions *****************************/
|
/************************** Variable Definitions *****************************/
|
||||||
/***************** Macros (Inline Functions) Definitions *********************/
|
/***************** Macros (Inline Functions) Definitions *********************/
|
||||||
/**************************** Type Definitions *******************************/
|
/**************************** Type Definitions *******************************/
|
||||||
@@ -146,6 +147,15 @@ inline L2_NODE_STATE L2_GetMainState(L2_INST *instPtr)
|
|||||||
return instPtr->mainState;
|
return instPtr->mainState;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Check if there is a valid l2 frame.
|
||||||
|
*/
|
||||||
|
inline bool L2_isStarted(L2_INST *instPtr)
|
||||||
|
{
|
||||||
|
ASSERT(instPtr != NULL);
|
||||||
|
return instPtr->isEnable;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Check if there is a valid l2 frame.
|
* @brief Check if there is a valid l2 frame.
|
||||||
*/
|
*/
|
||||||
@@ -400,7 +410,6 @@ void L2_FrameStateUpdate(L2_INST *instPtr)
|
|||||||
int32_t L2_SteerBeam2Node(L2_INST *instPtr, uint8_t nodeId)
|
int32_t L2_SteerBeam2Node(L2_INST *instPtr, uint8_t nodeId)
|
||||||
{
|
{
|
||||||
ASSERT(instPtr != NULL);
|
ASSERT(instPtr != NULL);
|
||||||
ASSERT(instPtr->config.phyInstPtr != NULL);
|
|
||||||
int32_t Status;
|
int32_t Status;
|
||||||
|
|
||||||
COORD myPos, dstPos, beamDir;
|
COORD myPos, dstPos, beamDir;
|
||||||
@@ -660,6 +669,8 @@ int32_t Linklayer_Init(L2_INST **instPtr, const L2_CONFIG *config)
|
|||||||
DBG_ERROR("Allocate memory for L2_InstPtr failed.\n");
|
DBG_ERROR("Allocate memory for L2_InstPtr failed.\n");
|
||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Clear random content
|
||||||
memset(*instPtr, 0x00, sizeof(L2_INST));
|
memset(*instPtr, 0x00, sizeof(L2_INST));
|
||||||
memcpy(&((*instPtr)->config), config, sizeof(L2_CONFIG));
|
memcpy(&((*instPtr)->config), config, sizeof(L2_CONFIG));
|
||||||
|
|
||||||
@@ -684,7 +695,7 @@ int32_t Linklayer_Init(L2_INST **instPtr, const L2_CONFIG *config)
|
|||||||
(*instPtr)->rtneConfig.curr = NULL;
|
(*instPtr)->rtneConfig.curr = NULL;
|
||||||
(*instPtr)->rtneConfig.next = NULL;
|
(*instPtr)->rtneConfig.next = NULL;
|
||||||
(*instPtr)->isEnable = false;
|
(*instPtr)->isEnable = false;
|
||||||
(*instPtr)->cxn2Net = (config->myType == L2_NODE_HEAD) ? true : false;;
|
(*instPtr)->cxn2Net = (config->myType == L2_NODE_HEAD) ? true : false;
|
||||||
(*instPtr)->dataAvail = false;
|
(*instPtr)->dataAvail = false;
|
||||||
(*instPtr)->frameNum.last = 0;
|
(*instPtr)->frameNum.last = 0;
|
||||||
(*instPtr)->frameNum.curr = 0;
|
(*instPtr)->frameNum.curr = 0;
|
||||||
@@ -852,7 +863,8 @@ int32_t Linklayer_Start(L2_INST *instPtr)
|
|||||||
{
|
{
|
||||||
ASSERT(instPtr != NULL);
|
ASSERT(instPtr != NULL);
|
||||||
// Set netStartTime at first call.
|
// Set netStartTime at first call.
|
||||||
if (instPtr->netStartTime == NET_START_TIME_INFTY) {
|
if (instPtr->netStartTime == NET_START_TIME_INFTY)
|
||||||
|
{
|
||||||
instPtr->netStartTime = TimeCtrl_GetIntCnt(instPtr->config.tmcInstPtr) / L2_SLOTS_PER_FRAME + 1;
|
instPtr->netStartTime = TimeCtrl_GetIntCnt(instPtr->config.tmcInstPtr) / L2_SLOTS_PER_FRAME + 1;
|
||||||
}
|
}
|
||||||
instPtr->isEnable = true;
|
instPtr->isEnable = true;
|
||||||
@@ -944,7 +956,7 @@ int32_t Linklayer_EventHandler(L2_INST *instPtr, const L2_EVENT *l2Event)
|
|||||||
case L2_EV_LOST_CXN:
|
case L2_EV_LOST_CXN:
|
||||||
{
|
{
|
||||||
DBG_INFO("Event L2_EV_LOST_CXN asserted....\n");
|
DBG_INFO("Event L2_EV_LOST_CXN asserted....\n");
|
||||||
if (instPtr->config.myType == L2_NODE_HEAD)
|
if (L2_GetNodeType(instPtr) == L2_NODE_HEAD)
|
||||||
{
|
{
|
||||||
DBG_ERROR("Illegal event, only None_Head node can assert L2_EV_LOST_CXN.\n");
|
DBG_ERROR("Illegal event, only None_Head node can assert L2_EV_LOST_CXN.\n");
|
||||||
break;
|
break;
|
||||||
@@ -954,6 +966,7 @@ int32_t Linklayer_EventHandler(L2_INST *instPtr, const L2_EVENT *l2Event)
|
|||||||
L2_Service_Reset(instPtr->serviceFSM);
|
L2_Service_Reset(instPtr->serviceFSM);
|
||||||
instPtr->cxn2Net = false;
|
instPtr->cxn2Net = false;
|
||||||
UpdateMainSate(instPtr, L2_INIT_STATE);
|
UpdateMainSate(instPtr, L2_INIT_STATE);
|
||||||
|
instPtr->log.reconnectCnt++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case L2_EV_LOST_NODE:
|
case L2_EV_LOST_NODE:
|
||||||
@@ -962,6 +975,8 @@ int32_t Linklayer_EventHandler(L2_INST *instPtr, const L2_EVENT *l2Event)
|
|||||||
L2_Scan_Reset(instPtr->scanFSM);
|
L2_Scan_Reset(instPtr->scanFSM);
|
||||||
L2_Service_Reset(instPtr->serviceFSM);
|
L2_Service_Reset(instPtr->serviceFSM);
|
||||||
UpdateMainSate(instPtr, L2_INIT_STATE);
|
UpdateMainSate(instPtr, L2_INIT_STATE);
|
||||||
|
// Log reconnect
|
||||||
|
instPtr->log.reconnectCnt++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case L2_ROUTINE_FINISH:
|
case L2_ROUTINE_FINISH:
|
||||||
@@ -983,7 +998,8 @@ int32_t Linklayer_EventHandler(L2_INST *instPtr, const L2_EVENT *l2Event)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DBG_WARNING("Unsupported routine state [%" PRId8 "], Continue withe previous routine table.\n", instPtr->nextState);
|
DBG_WARNING("Unsupported routine state [%" PRId8 "], "
|
||||||
|
"Continue with previous routine table.\n", instPtr->nextState);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1132,6 +1148,8 @@ static int32_t Linklayer_Routine(L2_INST *instPtr)
|
|||||||
L2_IterEditNode(instPtr->nodeList, &increment, IntcNodeTTL);
|
L2_IterEditNode(instPtr->nodeList, &increment, IntcNodeTTL);
|
||||||
|
|
||||||
#ifdef DATALINK_ENABLE_AUTORECONNECT
|
#ifdef DATALINK_ENABLE_AUTORECONNECT
|
||||||
|
if (L2_GetMainState(instPtr) != L2_INIT_STATE)
|
||||||
|
{
|
||||||
L2_IterDeleteNode(instPtr->nodeList, IsNodeConnected);
|
L2_IterDeleteNode(instPtr->nodeList, IsNodeConnected);
|
||||||
if (L2_GetNodeListLen(instPtr->nodeList) < instPtr->config.netScale - 1)
|
if (L2_GetNodeListLen(instPtr->nodeList) < instPtr->config.netScale - 1)
|
||||||
{
|
{
|
||||||
@@ -1142,6 +1160,7 @@ static int32_t Linklayer_Routine(L2_INST *instPtr)
|
|||||||
l2Event.msg = NULL;
|
l2Event.msg = NULL;
|
||||||
AssertL2Event(instPtr, &l2Event);
|
AssertL2Event(instPtr, &l2Event);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
@@ -1160,6 +1179,8 @@ int32_t Linklayer_Proc(L2_INST *instPtr)
|
|||||||
{
|
{
|
||||||
ASSERT(instPtr != NULL);
|
ASSERT(instPtr != NULL);
|
||||||
int32_t Status;
|
int32_t Status;
|
||||||
|
PHY_INST *phyRef = instPtr->config.phyInstPtr;
|
||||||
|
TMC_INST *tmcRef = instPtr->config.tmcInstPtr;
|
||||||
|
|
||||||
if (instPtr->isEnable == false)
|
if (instPtr->isEnable == false)
|
||||||
{
|
{
|
||||||
@@ -1168,7 +1189,7 @@ int32_t Linklayer_Proc(L2_INST *instPtr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: Consider time wrapping.
|
// FIXME: Consider time wrapping.
|
||||||
uint32_t nextTimeUnit = (TimeCtrl_GetIntCnt(instPtr->config.tmcInstPtr) + 1) / L2_SLOTS_PER_FRAME;
|
uint32_t nextTimeUnit = (TimeCtrl_GetIntCnt(tmcRef) + 1) / L2_SLOTS_PER_FRAME;
|
||||||
if (nextTimeUnit < instPtr->netStartTime)
|
if (nextTimeUnit < instPtr->netStartTime)
|
||||||
{
|
{
|
||||||
DBG_WARNING("Linklayer not start yet, next time unit: %" PRIu32 ", start time unit: %" PRIu32 ".\n",
|
DBG_WARNING("Linklayer not start yet, next time unit: %" PRIu32 ", start time unit: %" PRIu32 ".\n",
|
||||||
@@ -1200,19 +1221,19 @@ int32_t Linklayer_Proc(L2_INST *instPtr)
|
|||||||
// Run Link layer routine, setup next slot procedure.
|
// Run Link layer routine, setup next slot procedure.
|
||||||
if (L2_GetNodeType(instPtr) == L2_NODE_HEAD)
|
if (L2_GetNodeType(instPtr) == L2_NODE_HEAD)
|
||||||
{
|
{
|
||||||
Phy_SetMode(instPtr->config.phyInstPtr, PHY_MODE_PULL);
|
Phy_SetMode(phyRef, PHY_MODE_PULL);
|
||||||
Status = Linklayer_Routine(instPtr);
|
Status = Linklayer_Routine(instPtr);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ // L2_NODE_MEMBER
|
{ // L2_NODE_MEMBER
|
||||||
if (L2_isCxn2Net(instPtr))
|
if (L2_isCxn2Net(instPtr))
|
||||||
{
|
{
|
||||||
Phy_SetMode(instPtr->config.phyInstPtr, PHY_MODE_PULL);
|
Phy_SetMode(phyRef, PHY_MODE_PULL);
|
||||||
Status = Linklayer_Routine(instPtr);
|
Status = Linklayer_Routine(instPtr);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Phy_SetMode(instPtr->config.phyInstPtr, PHY_MODE_LISTEN);
|
Phy_SetMode(phyRef, PHY_MODE_LISTEN);
|
||||||
Status = L2_Scan_Proc(instPtr);
|
Status = L2_Scan_Proc(instPtr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1228,18 +1249,16 @@ int32_t Linklayer_Proc(L2_INST *instPtr)
|
|||||||
|
|
||||||
// Update link layer state.
|
// Update link layer state.
|
||||||
instPtr->mainState = instPtr->nextState;
|
instPtr->mainState = instPtr->nextState;
|
||||||
|
|
||||||
instPtr->linkLog.tuNum = instPtr->frameNum.curr;
|
instPtr->linkLog.tuNum = instPtr->frameNum.curr;
|
||||||
instPtr->linkLog.slotNum = (uint8_t)instPtr->slotNum.curr;
|
instPtr->linkLog.slotNum = (uint8_t)instPtr->slotNum.curr;
|
||||||
instPtr->linkLog.nodeType = (instPtr->config.myType == L2_NODE_HEAD) ? 0xAA : 0xCC;
|
instPtr->linkLog.nodeType = (L2_GetNodeType(instPtr) == L2_NODE_HEAD) ? 0xAA : 0xCC;
|
||||||
instPtr->linkLog.cxnStatus = (instPtr->cxn2Net) ? 0x11 : 0x00;
|
instPtr->linkLog.cxnStatus = (instPtr->cxn2Net) ? 0x11 : 0x00;
|
||||||
instPtr->linkLog.linkStage = (instPtr->mainState == L2_INIT_STATE) ? 0x00 : 0x11;
|
instPtr->linkLog.linkStage = (instPtr->mainState == L2_INIT_STATE) ? 0x11 : 0x22;
|
||||||
// TODO:
|
instPtr->linkLog.recxnCnt = instPtr->log.reconnectCnt;
|
||||||
// instPtr->linkLog.recxnCnt =
|
instPtr->linkLog.beamNo = instPtr->scanFSM->beamNo;
|
||||||
// instPtr->linkLog.beamNo =
|
instPtr->linkLog.beamWidth = instPtr->log.lastBeamWidth;
|
||||||
// instPtr->linkLog.beamWidth =
|
instPtr->linkLog.beamAz = phyRef->antNrrwPattern[instPtr->scanFSM->beamNo].oaxis;
|
||||||
// instPtr->linkLog.beamAz =
|
instPtr->linkLog.beamEl = phyRef->antNrrwPattern[instPtr->scanFSM->beamNo].raxis;
|
||||||
// instPtr->linkLog.beamEl =
|
|
||||||
instPtr->linkLog.advTxCnt = (uint16_t)instPtr->log.advTxCnt;
|
instPtr->linkLog.advTxCnt = (uint16_t)instPtr->log.advTxCnt;
|
||||||
instPtr->linkLog.advRecvCnt = (uint16_t)instPtr->log.advRecvCnt;
|
instPtr->linkLog.advRecvCnt = (uint16_t)instPtr->log.advRecvCnt;
|
||||||
instPtr->linkLog.advCorrectCnt = (uint16_t)instPtr->log.advCorrectCnt;
|
instPtr->linkLog.advCorrectCnt = (uint16_t)instPtr->log.advCorrectCnt;
|
||||||
@@ -1249,9 +1268,10 @@ int32_t Linklayer_Proc(L2_INST *instPtr)
|
|||||||
instPtr->linkLog.svcTxCnt = instPtr->log.svcTxCnt;
|
instPtr->linkLog.svcTxCnt = instPtr->log.svcTxCnt;
|
||||||
instPtr->linkLog.svcRecvCnt = instPtr->log.svcRecvCnt;
|
instPtr->linkLog.svcRecvCnt = instPtr->log.svcRecvCnt;
|
||||||
instPtr->linkLog.svcCorrectCnt = instPtr->log.svcCorrectCnt;
|
instPtr->linkLog.svcCorrectCnt = instPtr->log.svcCorrectCnt;
|
||||||
instPtr->linkLog.timeDev = instPtr->log.timeDev;
|
instPtr->linkLog.timeDev = (instPtr->log.timeDev > INT32_MAX)
|
||||||
instPtr->linkLog.sendId = instPtr->serviceFSM->txLog.dataId;
|
? INT32_MAX : ((instPtr->log.timeDev < INT32_MIN) ? INT32_MIN : (int32_t)instPtr->log.timeDev);
|
||||||
instPtr->linkLog.recvId = instPtr->serviceFSM->rxLog.dataId;
|
instPtr->linkLog.sendId = instPtr->log.txLog.dataId;
|
||||||
|
instPtr->linkLog.recvId = instPtr->log.rxLog.dataId;
|
||||||
|
|
||||||
SysMonitor_UpdateLinklayerLog(&(instPtr->linkLog));
|
SysMonitor_UpdateLinklayerLog(&(instPtr->linkLog));
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
|
|||||||
@@ -66,6 +66,11 @@ typedef struct
|
|||||||
uint32_t svcCorrectCnt;
|
uint32_t svcCorrectCnt;
|
||||||
|
|
||||||
int64_t timeDev;
|
int64_t timeDev;
|
||||||
|
uint8_t lastBeamWidth;
|
||||||
|
uint32_t reconnectCnt;
|
||||||
|
|
||||||
|
PAYLOAD rxLog;
|
||||||
|
PAYLOAD txLog;
|
||||||
} L2_LOG;
|
} L2_LOG;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
@@ -129,6 +134,7 @@ bool L2_CrcCheck(uint8_t *dataBuff, uint32_t dataLen, L2_CRC_TYPE crcType);
|
|||||||
|
|
||||||
// Scanning
|
// Scanning
|
||||||
int32_t L2_Scan_Init(L2_SCAN_FSM **scanFSMPtr);
|
int32_t L2_Scan_Init(L2_SCAN_FSM **scanFSMPtr);
|
||||||
|
void L2_Scan_RefreashScanTable(L2_INST *instPtr);
|
||||||
void L2_Scan_Reset(L2_SCAN_FSM *scanFSMPtr);
|
void L2_Scan_Reset(L2_SCAN_FSM *scanFSMPtr);
|
||||||
void L2_Scan_Destroy(L2_SCAN_FSM *scanFSMPtr);
|
void L2_Scan_Destroy(L2_SCAN_FSM *scanFSMPtr);
|
||||||
int32_t L2_Scan_Proc(L2_INST *instPtr);
|
int32_t L2_Scan_Proc(L2_INST *instPtr);
|
||||||
@@ -149,6 +155,7 @@ uint8_t L2_GetClusterId(L2_INST *instPtr);
|
|||||||
uint8_t L2_GetHeadId(L2_INST *instPtr);
|
uint8_t L2_GetHeadId(L2_INST *instPtr);
|
||||||
L2_NODE_TYPE L2_GetNodeType(L2_INST *instPtr);
|
L2_NODE_TYPE L2_GetNodeType(L2_INST *instPtr);
|
||||||
L2_NODE_STATE L2_GetMainState(L2_INST *instPtr);
|
L2_NODE_STATE L2_GetMainState(L2_INST *instPtr);
|
||||||
|
bool L2_isStarted(L2_INST *instPtr);
|
||||||
bool L2_isDataAvail(L2_INST *instPtr);
|
bool L2_isDataAvail(L2_INST *instPtr);
|
||||||
bool L2_isCxn2Net(L2_INST *instPtr);
|
bool L2_isCxn2Net(L2_INST *instPtr);
|
||||||
uint32_t L2_GetFrameLen(L2_FRAME_TYPE l2FrameType);
|
uint32_t L2_GetFrameLen(L2_FRAME_TYPE l2FrameType);
|
||||||
|
|||||||
@@ -39,7 +39,7 @@
|
|||||||
#define L2_FRAMENO_NONE 0
|
#define L2_FRAMENO_NONE 0
|
||||||
|
|
||||||
// Common number of slots definition
|
// Common number of slots definition
|
||||||
#define L2_SLOTS_PER_FRAME 200
|
#define L2_SLOTS_PER_FRAME 100
|
||||||
#define L2_SLOTS_PER_SUBFRAME 20
|
#define L2_SLOTS_PER_SUBFRAME 20
|
||||||
|
|
||||||
#define L2_NUM_SLOTS_NONE UINT32_MAX
|
#define L2_NUM_SLOTS_NONE UINT32_MAX
|
||||||
@@ -195,10 +195,11 @@ typedef struct
|
|||||||
bool isAdvRecvd; // bm received.
|
bool isAdvRecvd; // bm received.
|
||||||
bool isAckPending; // 2way acq done.
|
bool isAckPending; // 2way acq done.
|
||||||
uint8_t scanCnt;
|
uint8_t scanCnt;
|
||||||
uint8_t beamNo;
|
|
||||||
uint8_t advTimeout;
|
uint8_t advTimeout;
|
||||||
uint8_t cfmTimeout;
|
uint8_t cfmTimeout;
|
||||||
SCAN_STAGE scanStage; // only for member node
|
SCAN_STAGE scanStage; // only for member node
|
||||||
|
uint8_t beamNo;
|
||||||
|
uint8_t tableNo;
|
||||||
} L2_SCAN_FSM;
|
} L2_SCAN_FSM;
|
||||||
|
|
||||||
|
|
||||||
@@ -206,10 +207,9 @@ typedef struct
|
|||||||
*/
|
*/
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
PAYLOAD rxLog;
|
uint32_t txCnt;
|
||||||
PAYLOAD txLog;
|
uint32_t rxCnt;
|
||||||
uint32_t pktRecv;
|
uint32_t rxdCnt;
|
||||||
uint32_t pktCorrect;
|
|
||||||
#ifdef DATALINK_ENABLE_BERTEST
|
#ifdef DATALINK_ENABLE_BERTEST
|
||||||
uint32_t bitTotal;
|
uint32_t bitTotal;
|
||||||
uint32_t bitError;
|
uint32_t bitError;
|
||||||
|
|||||||
@@ -79,6 +79,10 @@
|
|||||||
#define L2_MSG_CFM_SRC_SPEEDY_LEN 4
|
#define L2_MSG_CFM_SRC_SPEEDY_LEN 4
|
||||||
#define L2_MSG_CFM_SRC_SPEEDZ 28
|
#define L2_MSG_CFM_SRC_SPEEDZ 28
|
||||||
#define L2_MSG_CFM_SRC_SPEEDZ_LEN 4
|
#define L2_MSG_CFM_SRC_SPEEDZ_LEN 4
|
||||||
|
#define L2_MSG_CFM_PAYLOAD_ID 32
|
||||||
|
#define L2_MSG_CFM_PAYLOAD_ID_LEN 4
|
||||||
|
#define L2_MSG_CFM_PAYLOAD 36
|
||||||
|
#define L2_MSG_CFM_PAYLOAD_LEN 230
|
||||||
#define L2_MSG_CFM_CRC 266
|
#define L2_MSG_CFM_CRC 266
|
||||||
#define L2_MSG_CFM_CRC_LEN 2
|
#define L2_MSG_CFM_CRC_LEN 2
|
||||||
|
|
||||||
|
|||||||
@@ -130,6 +130,10 @@ void L2_NodeList_Destroy(NODE_LIST *list)
|
|||||||
NODE_ENTRY *L2_GetNodeById(NODE_LIST *list, uint8_t nodeId)
|
NODE_ENTRY *L2_GetNodeById(NODE_LIST *list, uint8_t nodeId)
|
||||||
{
|
{
|
||||||
ASSERT(list != NULL);
|
ASSERT(list != NULL);
|
||||||
|
if (nodeId == L2_BROADCAST_ID || nodeId == L2_NONE_ID)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
util_entry.nodeInfo.nodeId = nodeId;
|
util_entry.nodeInfo.nodeId = nodeId;
|
||||||
clist_node_t *node = clist_find(list, &util_entry);
|
clist_node_t *node = clist_find(list, &util_entry);
|
||||||
if (node == NULL)
|
if (node == NULL)
|
||||||
|
|||||||
@@ -16,452 +16,6 @@
|
|||||||
#include "link_layer.h"
|
#include "link_layer.h"
|
||||||
#include "link_layer_types.h"
|
#include "link_layer_types.h"
|
||||||
|
|
||||||
#define LINKLAYER_INSERT_EXTRGAP
|
|
||||||
|
|
||||||
#ifndef LINKLAYER_INSERT_EXTRGAP
|
|
||||||
L2_RTNE_TABLE_ENTRY intraScanSubT[L2_SLOTS_PER_FRAME] = {
|
|
||||||
// SubFrame 0
|
|
||||||
{L2_SLOT_SCAN, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x01, 0x01, 0xFF},
|
|
||||||
|
|
||||||
// SubFrame 1
|
|
||||||
{L2_SLOT_SCAN, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x01, 0x01, 0xFF},
|
|
||||||
|
|
||||||
// SubFrame 2
|
|
||||||
{L2_SLOT_SCAN, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x01, 0x01, 0xFF},
|
|
||||||
|
|
||||||
// SubFrame 3
|
|
||||||
{L2_SLOT_SCAN, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_SCAN, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_ADVERTISE, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_ADVERTISE, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_ADVERTISE, 0x02, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_ADVERTISE, 0x03, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
|
||||||
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
|
||||||
// SubFrame 4
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0x01, 0xFF},
|
|
||||||
|
|
||||||
// SubFrame 5
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0x01, 0xFF},
|
|
||||||
|
|
||||||
// SubFrame 6
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0xFF, 0x01},
|
|
||||||
|
|
||||||
// SubFrame 7
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0xFF, 0x01},
|
|
||||||
|
|
||||||
// SubFrame 8
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0x01, 0xFF},
|
|
||||||
|
|
||||||
// SubFrame 9
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0x01, 0xFF},
|
|
||||||
};
|
|
||||||
|
|
||||||
L2_RTNE_TABLE_ENTRY normalSub[L2_SLOTS_PER_FRAME] = {
|
|
||||||
// SubFrame 0
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x01, 0x02},
|
|
||||||
|
|
||||||
// SubFrame 1
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x02, 0x01},
|
|
||||||
|
|
||||||
// SubFrame 2
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x01, 0x02},
|
|
||||||
|
|
||||||
// SubFrame 3
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x02, 0x01},
|
|
||||||
|
|
||||||
// SubFrame 4
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x01, 0x02},
|
|
||||||
|
|
||||||
// SubFrame 5
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x02, 0x01},
|
|
||||||
|
|
||||||
// SubFrame 6
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x01, 0x02},
|
|
||||||
|
|
||||||
// SubFrame 7
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x02, 0x01},
|
|
||||||
|
|
||||||
// SubFrame 8
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x01, 0x02},
|
|
||||||
|
|
||||||
// SubFrame 9
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x02, 0x01},
|
|
||||||
};
|
|
||||||
#else
|
|
||||||
L2_RTNE_TABLE_ENTRY intraScanSubT[L2_SLOTS_PER_FRAME] = {
|
L2_RTNE_TABLE_ENTRY intraScanSubT[L2_SLOTS_PER_FRAME] = {
|
||||||
// SubFrame 0
|
// SubFrame 0
|
||||||
{L2_SLOT_SCAN, 0x00, 0x01, 0xFF},
|
{L2_SLOT_SCAN, 0x00, 0x01, 0xFF},
|
||||||
@@ -572,116 +126,6 @@ L2_RTNE_TABLE_ENTRY intraScanSubT[L2_SLOTS_PER_FRAME] = {
|
|||||||
{L2_SLOT_CONFIRM, 0x02, 0xFF, 0x01},
|
{L2_SLOT_CONFIRM, 0x02, 0xFF, 0x01},
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0xFF, 0x01},
|
{L2_SLOT_CONFIRM, 0x03, 0xFF, 0x01},
|
||||||
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
||||||
|
|
||||||
// SubFrame 5
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
|
||||||
|
|
||||||
// SubFrame 6
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
|
||||||
|
|
||||||
// SubFrame 7
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
|
||||||
|
|
||||||
// SubFrame 8
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
|
||||||
|
|
||||||
// SubFrame 9
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0x01, 0xFF},
|
|
||||||
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
|
||||||
{L2_SLOT_CONFIRM, 0x00, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x01, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x02, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_CONFIRM, 0x03, 0xFF, 0x01},
|
|
||||||
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
L2_RTNE_TABLE_ENTRY normalSub[L2_SLOTS_PER_FRAME] = {
|
L2_RTNE_TABLE_ENTRY normalSub[L2_SLOTS_PER_FRAME] = {
|
||||||
@@ -794,118 +238,7 @@ L2_RTNE_TABLE_ENTRY normalSub[L2_SLOTS_PER_FRAME] = {
|
|||||||
{L2_SLOT_SERVICE, 0x02, 0x02, 0x01},
|
{L2_SLOT_SERVICE, 0x02, 0x02, 0x01},
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x02, 0x01},
|
{L2_SLOT_SERVICE, 0x03, 0x02, 0x01},
|
||||||
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
||||||
|
|
||||||
// SubFrame 5
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x01, 0x02},
|
|
||||||
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x02, 0x01},
|
|
||||||
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x01, 0x02},
|
|
||||||
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x02, 0x01},
|
|
||||||
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
|
||||||
|
|
||||||
// SubFrame 6
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x01, 0x02},
|
|
||||||
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x02, 0x01},
|
|
||||||
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x01, 0x02},
|
|
||||||
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x02, 0x01},
|
|
||||||
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
|
||||||
|
|
||||||
// SubFrame 7
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x01, 0x02},
|
|
||||||
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x02, 0x01},
|
|
||||||
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x01, 0x02},
|
|
||||||
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x02, 0x01},
|
|
||||||
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
|
||||||
|
|
||||||
// SubFrame 8
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x01, 0x02},
|
|
||||||
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x02, 0x01},
|
|
||||||
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x01, 0x02},
|
|
||||||
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x02, 0x01},
|
|
||||||
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
|
||||||
|
|
||||||
// SubFrame 9
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x01, 0x02},
|
|
||||||
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x02, 0x01},
|
|
||||||
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x01, 0x02},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x01, 0x02},
|
|
||||||
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
|
||||||
{L2_SLOT_SERVICE, 0x00, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x01, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x02, 0x02, 0x01},
|
|
||||||
{L2_SLOT_SERVICE, 0x03, 0x02, 0x01},
|
|
||||||
{L2_SLOT_IDLE, 0x00, 0x00, 0x00},
|
|
||||||
};
|
};
|
||||||
#endif
|
|
||||||
|
|
||||||
L2_RTNE_TABLE_ENTRY *initTable[L2_INIT_RTNE_PERIOD] =
|
L2_RTNE_TABLE_ENTRY *initTable[L2_INIT_RTNE_PERIOD] =
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -26,15 +26,97 @@
|
|||||||
|
|
||||||
/************************** Constant Definitions *****************************/
|
/************************** Constant Definitions *****************************/
|
||||||
#define ADV_LISTEN_TIMEOUT 40
|
#define ADV_LISTEN_TIMEOUT 40
|
||||||
#define CFM_LISTEN_TIMEOUT 25
|
#define CFM_LISTEN_TIMEOUT 5
|
||||||
#define ADV_FRAME_SLOTS 4
|
#define ADV_FRAME_SLOTS 4
|
||||||
#define CFM_FRAME_SLOTS 4
|
#define CFM_FRAME_SLOTS 5
|
||||||
/***************** Macros (In-line Functions) Definitions *********************/
|
/***************** Macros (In-line Functions) Definitions *********************/
|
||||||
|
|
||||||
/**************************** Type Definitions *******************************/
|
/**************************** Type Definitions *******************************/
|
||||||
|
|
||||||
/************************** Variable Definitions *****************************/
|
/************************** Variable Definitions *****************************/
|
||||||
|
// Pair by regex
|
||||||
|
// Regex: ((\{\.oaxis = [0-9]+[ ,]+\.raxis = [0-9]+[ ]*\}, ){2})
|
||||||
|
PHY_ANT_ANGLE antNrrwPattern_0[L1_NUM_ANT_NRRW_PATTERN] =
|
||||||
|
{
|
||||||
|
{.oaxis = 0 , .raxis = 0 },
|
||||||
|
{.oaxis = 139, .raxis = 2225},
|
||||||
|
{.oaxis = 152, .raxis = 850 },
|
||||||
|
{.oaxis = 138, .raxis = 3155},
|
||||||
|
{.oaxis = 159, .raxis = 1680},
|
||||||
|
{.oaxis = 168, .raxis = 285 },
|
||||||
|
{.oaxis = 195, .raxis = 2630},
|
||||||
|
{.oaxis = 211, .raxis = 1204},
|
||||||
|
{.oaxis = 225, .raxis = 3429},
|
||||||
|
{.oaxis = 249, .raxis = 2022},
|
||||||
|
{.oaxis = 272, .raxis = 629 },
|
||||||
|
{.oaxis = 265, .raxis = 2934},
|
||||||
|
{.oaxis = 277, .raxis = 1499},
|
||||||
|
{.oaxis = 289, .raxis = 124 },
|
||||||
|
{.oaxis = 300, .raxis = 2349},
|
||||||
|
{.oaxis = 311, .raxis = 959 },
|
||||||
|
{.oaxis = 321, .raxis = 3199},
|
||||||
|
{.oaxis = 331, .raxis = 1824},
|
||||||
|
{.oaxis = 341, .raxis = 389 },
|
||||||
|
{.oaxis = 351, .raxis = 2674},
|
||||||
|
{.oaxis = 360, .raxis = 1268},
|
||||||
|
{.oaxis = 364, .raxis = 3483},
|
||||||
|
{.oaxis = 378, .raxis = 2118},
|
||||||
|
{.oaxis = 387, .raxis = 733 },
|
||||||
|
{.oaxis = 416, .raxis = 3028},
|
||||||
|
{.oaxis = 404, .raxis = 1623},
|
||||||
|
{.oaxis = 433, .raxis = 248 },
|
||||||
|
{.oaxis = 421, .raxis = 2473},
|
||||||
|
{.oaxis = 429, .raxis = 1098},
|
||||||
|
{.oaxis = 437, .raxis = 3303},
|
||||||
|
{.oaxis = 445, .raxis = 1948},
|
||||||
|
{.oaxis = 443, .raxis = 543 },
|
||||||
|
{.oaxis = 450, .raxis = 2828},
|
||||||
|
{.oaxis = 448, .raxis = 1422},
|
||||||
|
{.oaxis = 455, .raxis = 47 },
|
||||||
|
{.oaxis = 453, .raxis = 2272},
|
||||||
|
{.oaxis = 450, .raxis = 897 }
|
||||||
|
};
|
||||||
|
|
||||||
|
PHY_ANT_ANGLE antNrrwPattern_1[L1_NUM_ANT_NRRW_PATTERN] =
|
||||||
|
{
|
||||||
|
{.oaxis = 0 , .raxis = 0 },
|
||||||
|
{.oaxis = 139, .raxis = 1155},
|
||||||
|
{.oaxis = 152, .raxis = 3380},
|
||||||
|
{.oaxis = 138, .raxis = 2085},
|
||||||
|
{.oaxis = 159, .raxis = 610 },
|
||||||
|
{.oaxis = 168, .raxis = 2815},
|
||||||
|
{.oaxis = 195, .raxis = 1560},
|
||||||
|
{.oaxis = 211, .raxis = 134 },
|
||||||
|
{.oaxis = 225, .raxis = 2359},
|
||||||
|
{.oaxis = 249, .raxis = 952 },
|
||||||
|
{.oaxis = 272, .raxis = 3159},
|
||||||
|
{.oaxis = 265, .raxis = 1864},
|
||||||
|
{.oaxis = 277, .raxis = 429 },
|
||||||
|
{.oaxis = 289, .raxis = 2654},
|
||||||
|
{.oaxis = 300, .raxis = 1279},
|
||||||
|
{.oaxis = 311, .raxis = 3489},
|
||||||
|
{.oaxis = 321, .raxis = 2129},
|
||||||
|
{.oaxis = 331, .raxis = 754 },
|
||||||
|
{.oaxis = 341, .raxis = 2919},
|
||||||
|
{.oaxis = 351, .raxis = 1604},
|
||||||
|
{.oaxis = 360, .raxis = 198 },
|
||||||
|
{.oaxis = 364, .raxis = 2413},
|
||||||
|
{.oaxis = 378, .raxis = 1048},
|
||||||
|
{.oaxis = 387, .raxis = 3263},
|
||||||
|
{.oaxis = 416, .raxis = 1958},
|
||||||
|
{.oaxis = 404, .raxis = 553 },
|
||||||
|
{.oaxis = 433, .raxis = 2778},
|
||||||
|
{.oaxis = 421, .raxis = 1403},
|
||||||
|
{.oaxis = 429, .raxis = 28 },
|
||||||
|
{.oaxis = 437, .raxis = 2233},
|
||||||
|
{.oaxis = 445, .raxis = 878 },
|
||||||
|
{.oaxis = 443, .raxis = 3073},
|
||||||
|
{.oaxis = 450, .raxis = 1758},
|
||||||
|
{.oaxis = 448, .raxis = 352 },
|
||||||
|
{.oaxis = 455, .raxis = 2577},
|
||||||
|
{.oaxis = 453, .raxis = 1202},
|
||||||
|
{.oaxis = 450, .raxis = 3427},
|
||||||
|
};
|
||||||
/************************** Function Prototypes ******************************/
|
/************************** Function Prototypes ******************************/
|
||||||
static void LockStateUpdate(L2_SCAN_FSM *scanFsmPtr, bool state);
|
static void LockStateUpdate(L2_SCAN_FSM *scanFsmPtr, bool state);
|
||||||
static void AdvRecvStateUpdate(L2_SCAN_FSM *scanFsmPtr, bool state);
|
static void AdvRecvStateUpdate(L2_SCAN_FSM *scanFsmPtr, bool state);
|
||||||
@@ -112,20 +194,38 @@ static void StageUpdate(L2_SCAN_FSM *scanFsmPtr, SCAN_STAGE newStage)
|
|||||||
static int32_t Scan_InitScanHandler(L2_INST *instPtr)
|
static int32_t Scan_InitScanHandler(L2_INST *instPtr)
|
||||||
{
|
{
|
||||||
ASSERT(instPtr != NULL);
|
ASSERT(instPtr != NULL);
|
||||||
|
PHY_INST *phyRef = instPtr->config.phyInstPtr;
|
||||||
L2_SCAN_FSM *scanFsmPtr = instPtr->scanFSM;
|
L2_SCAN_FSM *scanFsmPtr = instPtr->scanFSM;
|
||||||
DBG_INFO("** Net-Setup - InitScan Procedure (Attempts: %" PRIu8 ")**\n", scanFsmPtr->scanCnt);
|
DBG_INFO("** Net-Setup - InitScan Procedure (Attempts: %" PRIu8 ")**\n", scanFsmPtr->scanCnt);
|
||||||
|
|
||||||
|
if (scanFsmPtr->scanCnt == 0)
|
||||||
|
{
|
||||||
|
// Update scan beam table
|
||||||
|
L2_Scan_RefreashScanTable(instPtr);
|
||||||
|
}
|
||||||
|
else if (Phy_IsFrameDetected(phyRef))
|
||||||
|
{
|
||||||
|
// last scan beam number
|
||||||
|
scanFsmPtr->beamNo = Phy_LastScanBeamNo(phyRef);
|
||||||
|
// Update scan beam table
|
||||||
|
L2_Scan_RefreashScanTable(instPtr);
|
||||||
|
}
|
||||||
|
|
||||||
if (scanFsmPtr->isLocked == true)
|
if (scanFsmPtr->isLocked == true)
|
||||||
{
|
{
|
||||||
StageUpdate(scanFsmPtr, L2_SCAN_ADV_STAGE);
|
scanFsmPtr->beamNo = Phy_LastScanBeamNo(phyRef);
|
||||||
/* Antenna setting (reserved.) */
|
Phy_SetBeamNo(phyRef, scanFsmPtr->beamNo, PHY_ANT_BEAM_16);
|
||||||
L2_SetupNextSlot(instPtr, L2_TOR_RX, L2_ADV_FRAME);
|
L2_SetupNextSlot(instPtr, L2_TOR_RX, L2_ADV_FRAME);
|
||||||
|
StageUpdate(scanFsmPtr, L2_SCAN_ADV_STAGE);
|
||||||
|
instPtr->log.lastBeamWidth = PHY_ANT_BEAM_16;
|
||||||
} /* Otherwise remain L2_SCAN_INIT_STAGE */
|
} /* Otherwise remain L2_SCAN_INIT_STAGE */
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Antenna setting (reserved.) */
|
/* Antenna steering (reserved, automatically accomplished by physical layer) */
|
||||||
|
Phy_SetBeamNo(phyRef, scanFsmPtr->beamNo, PHY_ANT_BEAM_16);
|
||||||
L2_SetupNextSlot(instPtr, L2_TOR_RX, L2_SCAN_FRAME);
|
L2_SetupNextSlot(instPtr, L2_TOR_RX, L2_SCAN_FRAME);
|
||||||
scanFsmPtr->scanCnt++;
|
scanFsmPtr->scanCnt++;
|
||||||
|
instPtr->log.lastBeamWidth = PHY_ANT_BEAM_16;
|
||||||
}
|
}
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
@@ -143,16 +243,22 @@ static int32_t Scan_InitScanHandler(L2_INST *instPtr)
|
|||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
static int32_t Scan_AdvHandler(L2_INST *instPtr)
|
static int32_t Scan_AdvHandler(L2_INST *instPtr)
|
||||||
{
|
{
|
||||||
|
ASSERT(instPtr != NULL);
|
||||||
L2_SCAN_FSM *scanFsmPtr = instPtr->scanFSM;
|
L2_SCAN_FSM *scanFsmPtr = instPtr->scanFSM;
|
||||||
|
PHY_INST *phyRef = instPtr->config.phyInstPtr;
|
||||||
DBG_INFO("** Net-Setup - Advertisement Procedure (Timeout: %" PRIu8 ") **\n", scanFsmPtr->advTimeout);
|
DBG_INFO("** Net-Setup - Advertisement Procedure (Timeout: %" PRIu8 ") **\n", scanFsmPtr->advTimeout);
|
||||||
|
|
||||||
// if received a valid bm frame.
|
// if received a valid bm frame.
|
||||||
if (scanFsmPtr->isAdvRecvd == true)
|
if (scanFsmPtr->isAdvRecvd == true)
|
||||||
{
|
{
|
||||||
scanFsmPtr->advTimeout = 0; /* reset listen counter. */
|
// last scan beam number
|
||||||
DBG_INFO("Received Adv frame, skipping 10ms for turn around...\n");
|
scanFsmPtr->beamNo = Phy_LastScanBeamNo(phyRef);
|
||||||
// TODO: check functionality.
|
// reset listen counter.
|
||||||
|
scanFsmPtr->advTimeout = 0;
|
||||||
|
|
||||||
|
// Update scan stage
|
||||||
StageUpdate(scanFsmPtr, L2_SCAN_CFM_STAGE);
|
StageUpdate(scanFsmPtr, L2_SCAN_CFM_STAGE);
|
||||||
|
DBG_INFO("Received Adv frame, skipping 10ms for turn around...\n");
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
// no valid bm frame was received.
|
// no valid bm frame was received.
|
||||||
@@ -161,16 +267,20 @@ static int32_t Scan_AdvHandler(L2_INST *instPtr)
|
|||||||
/* if time out reached, go back to init scan stage. */
|
/* if time out reached, go back to init scan stage. */
|
||||||
if (scanFsmPtr->advTimeout > ADV_LISTEN_TIMEOUT)
|
if (scanFsmPtr->advTimeout > ADV_LISTEN_TIMEOUT)
|
||||||
{
|
{
|
||||||
/* Antenna setting (reserved.) */
|
/* Antenna steering (reserved, automatically accomplished by physical layer) */
|
||||||
|
Phy_SetBeamNo(phyRef, scanFsmPtr->beamNo, PHY_ANT_BEAM_16);
|
||||||
L2_SetupNextSlot(instPtr, L2_TOR_RX, L2_SCAN_FRAME);
|
L2_SetupNextSlot(instPtr, L2_TOR_RX, L2_SCAN_FRAME);
|
||||||
DBG_WARNING("Adv timeout, restart net scan from L2_SCAN_INIT_STAGE.\n");
|
DBG_WARNING("Adv timeout, restart net scan from L2_SCAN_INIT_STAGE.\n");
|
||||||
L2_Scan_Reset(scanFsmPtr);
|
L2_Scan_Reset(scanFsmPtr);
|
||||||
|
instPtr->log.lastBeamWidth = PHY_ANT_BEAM_16;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Antenna setting (reserved.) */
|
/* Antenna steering (reserved, automatically accomplished by physical layer) */
|
||||||
|
Phy_SetBeamNo(phyRef, scanFsmPtr->beamNo, PHY_ANT_BEAM_16);
|
||||||
L2_SetupNextSlot(instPtr, L2_TOR_RX, L2_ADV_FRAME);
|
L2_SetupNextSlot(instPtr, L2_TOR_RX, L2_ADV_FRAME);
|
||||||
scanFsmPtr->advTimeout++;
|
scanFsmPtr->advTimeout++;
|
||||||
|
instPtr->log.lastBeamWidth = PHY_ANT_BEAM_16;
|
||||||
}
|
}
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
@@ -187,7 +297,9 @@ static int32_t Scan_AdvHandler(L2_INST *instPtr)
|
|||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
static int32_t Scan_CfmHandler(L2_INST *instPtr)
|
static int32_t Scan_CfmHandler(L2_INST *instPtr)
|
||||||
{
|
{
|
||||||
|
ASSERT(instPtr != NULL);
|
||||||
L2_SCAN_FSM *scanFsmPtr = instPtr->scanFSM;
|
L2_SCAN_FSM *scanFsmPtr = instPtr->scanFSM;
|
||||||
|
PHY_INST *phyRef = instPtr->config.phyInstPtr;
|
||||||
DBG_INFO("** Net-Setup - Confirm Procedure (Timeout: %" PRIu8 ") **\n", scanFsmPtr->cfmTimeout);
|
DBG_INFO("** Net-Setup - Confirm Procedure (Timeout: %" PRIu8 ") **\n", scanFsmPtr->cfmTimeout);
|
||||||
|
|
||||||
// 2 way acq failed, back to init stage.
|
// 2 way acq failed, back to init stage.
|
||||||
@@ -201,9 +313,12 @@ static int32_t Scan_CfmHandler(L2_INST *instPtr)
|
|||||||
{
|
{
|
||||||
// using pull mode to receive confirm frame
|
// using pull mode to receive confirm frame
|
||||||
// since first time sync procedure is accomplished in ADV stage.
|
// since first time sync procedure is accomplished in ADV stage.
|
||||||
Phy_SetMode(instPtr->config.phyInstPtr, PHY_MODE_PULL);
|
Phy_SetBeamWidth(phyRef, PHY_ANT_BEAM_16);
|
||||||
|
Phy_SetBeamNo(phyRef, scanFsmPtr->beamNo, PHY_ANT_BEAM_16);
|
||||||
|
Phy_SetMode(phyRef, PHY_MODE_PULL);
|
||||||
L2_SetupNextSlot(instPtr, L2_TOR_RX, L2_CFM_FRAME);
|
L2_SetupNextSlot(instPtr, L2_TOR_RX, L2_CFM_FRAME);
|
||||||
scanFsmPtr->cfmTimeout++; // increase counter.
|
scanFsmPtr->cfmTimeout++; // increase counter.
|
||||||
|
instPtr->log.lastBeamWidth = PHY_ANT_BEAM_16;
|
||||||
}
|
}
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
@@ -231,6 +346,7 @@ static int32_t ScanMsg_Packing(L2_INST *instPtr, L2_FRAME_TYPE type, uint8_t dst
|
|||||||
return EPARAM;
|
return EPARAM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Common section of link layer package
|
||||||
dataChunk = L2_GetNextFrameNum(instPtr);
|
dataChunk = L2_GetNextFrameNum(instPtr);
|
||||||
L2_FrameInsertChunk(buff, L2_MSG_FRAME_NUM, L2_MSG_FRAME_NUM_LEN, &dataChunk);
|
L2_FrameInsertChunk(buff, L2_MSG_FRAME_NUM, L2_MSG_FRAME_NUM_LEN, &dataChunk);
|
||||||
dataChunk = L2_GetNextSlotNum(instPtr);
|
dataChunk = L2_GetNextSlotNum(instPtr);
|
||||||
@@ -278,6 +394,23 @@ static int32_t ScanMsg_Packing(L2_INST *instPtr, L2_FRAME_TYPE type, uint8_t dst
|
|||||||
L2_FrameInsertChunk(buff, L2_MSG_CFM_SRC_SPEEDY, L2_MSG_CFM_SRC_SPEEDY_LEN, &(instPtr->sysInfo.vY));
|
L2_FrameInsertChunk(buff, L2_MSG_CFM_SRC_SPEEDY, L2_MSG_CFM_SRC_SPEEDY_LEN, &(instPtr->sysInfo.vY));
|
||||||
L2_FrameInsertChunk(buff, L2_MSG_CFM_SRC_SPEEDZ, L2_MSG_CFM_SRC_SPEEDZ_LEN, &(instPtr->sysInfo.vZ));
|
L2_FrameInsertChunk(buff, L2_MSG_CFM_SRC_SPEEDZ, L2_MSG_CFM_SRC_SPEEDZ_LEN, &(instPtr->sysInfo.vZ));
|
||||||
|
|
||||||
|
// Packing extra payload
|
||||||
|
uint32_t dataId;
|
||||||
|
if (L2_GetNodeType(instPtr) == L2_NODE_HEAD)
|
||||||
|
{
|
||||||
|
SysMonitor_GetSendPayload(buff + L2_MSG_CFM_PAYLOAD, &dataId, PAYLOAD_LEN_FLJ_TX);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SysMonitor_GetSendPayload(buff + L2_MSG_CFM_PAYLOAD, &dataId, PAYLOAD_LEN_LJ_TX);
|
||||||
|
}
|
||||||
|
|
||||||
|
L2_FrameInsertChunk(buff, L2_MSG_CFM_PAYLOAD_ID, L2_MSG_CFM_PAYLOAD_ID_LEN, &dataId);
|
||||||
|
if (dataId == DATA_ID_NONE)
|
||||||
|
{
|
||||||
|
memset(buff + L2_MSG_CFM_PAYLOAD, 0xAA, L2_MSG_CFM_PAYLOAD_LEN);
|
||||||
|
}
|
||||||
|
|
||||||
// Append CRC
|
// Append CRC
|
||||||
Status = L2_CrcAppend(buff, L2_CMF_PACK_LEN - L2_MSG_CFM_CRC_LEN, L2_MSG_CFM_CRC, L2_CRC16_1021);
|
Status = L2_CrcAppend(buff, L2_CMF_PACK_LEN - L2_MSG_CFM_CRC_LEN, L2_MSG_CFM_CRC, L2_CRC16_1021);
|
||||||
if (Status != SUCCESS)
|
if (Status != SUCCESS)
|
||||||
@@ -285,6 +418,10 @@ static int32_t ScanMsg_Packing(L2_INST *instPtr, L2_FRAME_TYPE type, uint8_t dst
|
|||||||
DBG_ERROR("Fail to append CRC, error code: %" PRId32 ".\n", Status);
|
DBG_ERROR("Fail to append CRC, error code: %" PRId32 ".\n", Status);
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Logging...
|
||||||
|
memcpy(instPtr->log.txLog.data, buff, L2_CMF_PACK_LEN);
|
||||||
|
instPtr->log.txLog.dataId = dataId;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
@@ -296,68 +433,11 @@ static int32_t ScanMsg_Packing(L2_INST *instPtr, L2_FRAME_TYPE type, uint8_t dst
|
|||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/**
|
|
||||||
* @brief Initialize scan FSM.
|
|
||||||
*
|
|
||||||
* @param instPtr
|
|
||||||
*
|
|
||||||
* @return
|
|
||||||
*
|
|
||||||
******************************************************************************/
|
|
||||||
int32_t L2_Scan_Init(L2_SCAN_FSM **scanFSMPtr)
|
|
||||||
{
|
|
||||||
ASSERT(scanFSMPtr != NULL);
|
|
||||||
*scanFSMPtr = (L2_SCAN_FSM *)malloc(sizeof(L2_SCAN_FSM));
|
|
||||||
if (*scanFSMPtr == NULL)
|
|
||||||
{
|
|
||||||
DBG_ERROR("Failed to allocate memory for scanFsmPtr.\n");
|
|
||||||
return ENOMEM;
|
|
||||||
}
|
|
||||||
L2_Scan_Reset(*scanFSMPtr);
|
|
||||||
return SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/**
|
|
||||||
* @brief Reset ScanNet FSM
|
|
||||||
*
|
|
||||||
* @param scanFsmPtr a pointer to scan net finite state machine
|
|
||||||
*
|
|
||||||
* @return NONE
|
|
||||||
*
|
|
||||||
******************************************************************************/
|
|
||||||
void L2_Scan_Reset(L2_SCAN_FSM *scanFSMPtr)
|
|
||||||
{
|
|
||||||
ASSERT(scanFSMPtr != NULL);
|
|
||||||
scanFSMPtr->isLocked = false;
|
|
||||||
scanFSMPtr->isAdvRecvd = false;
|
|
||||||
scanFSMPtr->isAckPending = false;
|
|
||||||
scanFSMPtr->scanCnt = 0;
|
|
||||||
scanFSMPtr->beamNo = 0;
|
|
||||||
scanFSMPtr->advTimeout = 0;
|
|
||||||
scanFSMPtr->cfmTimeout = 0;
|
|
||||||
scanFSMPtr->scanStage = L2_SCAN_NONE_STAGE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/**
|
|
||||||
* @brief Destroy ScanNet FSM, free memory
|
|
||||||
*
|
|
||||||
* @param scanFsmPtr a pointer to scan net finite state machine
|
|
||||||
*
|
|
||||||
* @return NONE
|
|
||||||
*
|
|
||||||
******************************************************************************/
|
|
||||||
void L2_Scan_Destroy(L2_SCAN_FSM *scanFSMPtr)
|
|
||||||
{
|
|
||||||
free(scanFSMPtr);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/**
|
/**
|
||||||
* @brief Scan net packet handler.
|
* @brief Scan net packet handler.
|
||||||
*
|
*
|
||||||
|
* @param instPtr a pointer to linklayer layer instance
|
||||||
* @param msg A pointer to frame data buffer.
|
* @param msg A pointer to frame data buffer.
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
@@ -369,15 +449,19 @@ int32_t L2_Scan_PktHandler(L2_INST *instPtr, uint8_t *msg)
|
|||||||
ASSERT(msg != NULL);
|
ASSERT(msg != NULL);
|
||||||
int32_t Status;
|
int32_t Status;
|
||||||
L2_SCAN_FSM *scanFsmPtr = instPtr->scanFSM;
|
L2_SCAN_FSM *scanFsmPtr = instPtr->scanFSM;
|
||||||
L2_FRAME_TYPE frameType = L2_GetLastOptFrameType(instPtr);
|
L2_FRAME_TYPE frameType = L2_NONE_FRAME;
|
||||||
|
L2_FrameGetChunk(msg, L2_MSG_TYPE, L2_MSG_TYPE_LEN, &frameType);
|
||||||
switch (frameType)
|
switch (frameType)
|
||||||
{
|
{
|
||||||
case L2_SCAN_FRAME:
|
case L2_SCAN_FRAME:
|
||||||
LockStateUpdate(scanFsmPtr, true);
|
|
||||||
StageUpdate(scanFsmPtr, L2_SCAN_ADV_STAGE);
|
|
||||||
case L2_ADV_FRAME:
|
case L2_ADV_FRAME:
|
||||||
{
|
{
|
||||||
if (instPtr->config.myType == L2_NODE_HEAD)
|
if (L2_GetLastOptFrameType(instPtr) == L2_SCAN_FRAME)
|
||||||
|
{
|
||||||
|
LockStateUpdate(scanFsmPtr, true);
|
||||||
|
StageUpdate(scanFsmPtr, L2_SCAN_ADV_STAGE);
|
||||||
|
}
|
||||||
|
if (L2_GetNodeType(instPtr) == L2_NODE_HEAD)
|
||||||
{
|
{
|
||||||
DBG_ERROR("Unexpected call from head node, only member Node can handle L2_SCAN_FRAME and L2_ADV_FRAME.\n");
|
DBG_ERROR("Unexpected call from head node, only member Node can handle L2_SCAN_FRAME and L2_ADV_FRAME.\n");
|
||||||
Status = EUNEXP;
|
Status = EUNEXP;
|
||||||
@@ -405,6 +489,7 @@ int32_t L2_Scan_PktHandler(L2_INST *instPtr, uint8_t *msg)
|
|||||||
node->nodeInfo.pos.y = (double)nodePos;
|
node->nodeInfo.pos.y = (double)nodePos;
|
||||||
L2_FrameGetChunk(msg, L2_MSG_ADV_SRC_POSZ, L2_MSG_ADV_SRC_POSZ_LEN, &nodePos);
|
L2_FrameGetChunk(msg, L2_MSG_ADV_SRC_POSZ, L2_MSG_ADV_SRC_POSZ_LEN, &nodePos);
|
||||||
node->nodeInfo.pos.z = (double)nodePos;
|
node->nodeInfo.pos.z = (double)nodePos;
|
||||||
|
node->nodeInfo.beamNo = Phy_LastScanBeamNo(instPtr->config.phyInstPtr);
|
||||||
|
|
||||||
// Reset node ttl
|
// Reset node ttl
|
||||||
node->ttlCnt = 0;
|
node->ttlCnt = 0;
|
||||||
@@ -521,6 +606,24 @@ int32_t L2_Scan_PktHandler(L2_INST *instPtr, uint8_t *msg)
|
|||||||
// Time sync.
|
// Time sync.
|
||||||
L2_TimeAdjust(instPtr, &(instPtr->log.timeDev));
|
L2_TimeAdjust(instPtr, &(instPtr->log.timeDev));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get data payload
|
||||||
|
uint32_t dataId;
|
||||||
|
L2_FrameGetChunk(msg, L2_MSG_CFM_PAYLOAD_ID, L2_MSG_CFM_PAYLOAD_ID_LEN, &dataId);
|
||||||
|
|
||||||
|
if (L2_GetNodeType(instPtr) == L2_NODE_HEAD)
|
||||||
|
{
|
||||||
|
SysMonitor_UpdateRecvPayload(msg + L2_MSG_CFM_PAYLOAD, dataId, PAYLOAD_LEN_FLJ_RX);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SysMonitor_UpdateRecvPayload(msg + L2_MSG_CFM_PAYLOAD, dataId, PAYLOAD_LEN_LJ_RX);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Logging...
|
||||||
|
memcpy(instPtr->log.rxLog.data, msg, L2_CMF_PACK_LEN);
|
||||||
|
instPtr->log.rxLog.dataId = dataId;
|
||||||
|
|
||||||
Status = SUCCESS;
|
Status = SUCCESS;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -532,6 +635,90 @@ int32_t L2_Scan_PktHandler(L2_INST *instPtr, uint8_t *msg)
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/**
|
||||||
|
* @brief Initialize scan FSM.
|
||||||
|
*
|
||||||
|
* @param instPtr
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
int32_t L2_Scan_Init(L2_SCAN_FSM **scanFSMPtr)
|
||||||
|
{
|
||||||
|
ASSERT(scanFSMPtr != NULL);
|
||||||
|
*scanFSMPtr = (L2_SCAN_FSM *)malloc(sizeof(L2_SCAN_FSM));
|
||||||
|
if (*scanFSMPtr == NULL)
|
||||||
|
{
|
||||||
|
DBG_ERROR("Failed to allocate memory for scanFsmPtr.\n");
|
||||||
|
return ENOMEM;
|
||||||
|
}
|
||||||
|
L2_Scan_Reset(*scanFSMPtr);
|
||||||
|
(*scanFSMPtr)->beamNo = 0;
|
||||||
|
(*scanFSMPtr)->tableNo = 0;
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/**
|
||||||
|
* @brief Reset ScanNet FSM
|
||||||
|
*
|
||||||
|
* @param scanFsmPtr a pointer to scan net finite state machine
|
||||||
|
*
|
||||||
|
* @return NONE
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
void L2_Scan_Reset(L2_SCAN_FSM *scanFSMPtr)
|
||||||
|
{
|
||||||
|
ASSERT(scanFSMPtr != NULL);
|
||||||
|
scanFSMPtr->isLocked = false;
|
||||||
|
scanFSMPtr->isAdvRecvd = false;
|
||||||
|
scanFSMPtr->isAckPending = false;
|
||||||
|
scanFSMPtr->scanCnt = 0;
|
||||||
|
scanFSMPtr->advTimeout = 0;
|
||||||
|
scanFSMPtr->cfmTimeout = 0;
|
||||||
|
scanFSMPtr->scanStage = L2_SCAN_NONE_STAGE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/**
|
||||||
|
* @brief Destroy ScanNet FSM, free memory
|
||||||
|
*
|
||||||
|
* @param scanFsmPtr a pointer to scan net finite state machine
|
||||||
|
*
|
||||||
|
* @return NONE
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
void L2_Scan_Destroy(L2_SCAN_FSM *scanFSMPtr)
|
||||||
|
{
|
||||||
|
free(scanFSMPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/**
|
||||||
|
* @brief Refresh scan beam table.
|
||||||
|
*
|
||||||
|
* @param instPtr a pointer to linklayer layer instance
|
||||||
|
*
|
||||||
|
* @return NONE
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
void L2_Scan_RefreashScanTable(L2_INST *instPtr)
|
||||||
|
{
|
||||||
|
ASSERT(instPtr != NULL);
|
||||||
|
L2_SCAN_FSM *scanFsmPtr = instPtr->scanFSM;
|
||||||
|
PHY_INST *phyRef = instPtr->config.phyInstPtr;
|
||||||
|
if (scanFsmPtr->tableNo == 0)
|
||||||
|
{
|
||||||
|
Phy_SetBeamTable(phyRef, antNrrwPattern_0, scanFsmPtr->beamNo);
|
||||||
|
scanFsmPtr->tableNo = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Phy_SetBeamTable(phyRef, antNrrwPattern_1, scanFsmPtr->beamNo);
|
||||||
|
scanFsmPtr->tableNo = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/**
|
/**
|
||||||
@@ -591,6 +778,8 @@ int32_t L2_Scan_Routine(L2_INST *instPtr, const L2_RTNE_TABLE_ENTRY *rtneEntry)
|
|||||||
ASSERT(instPtr != NULL);
|
ASSERT(instPtr != NULL);
|
||||||
L2_TOR_TYPE torState;
|
L2_TOR_TYPE torState;
|
||||||
int32_t Status;
|
int32_t Status;
|
||||||
|
const NODE_ENTRY *commNode;
|
||||||
|
PHY_INST *phyRef = instPtr->config.phyInstPtr;
|
||||||
DBG_INFO("-------- Scan Routine --------\n");
|
DBG_INFO("-------- Scan Routine --------\n");
|
||||||
|
|
||||||
if (rtneEntry->slotSeq != 0)
|
if (rtneEntry->slotSeq != 0)
|
||||||
@@ -603,15 +792,25 @@ int32_t L2_Scan_Routine(L2_INST *instPtr, const L2_RTNE_TABLE_ENTRY *rtneEntry)
|
|||||||
if (rtneEntry->dst == L2_GetNodeId(instPtr) || rtneEntry->dst == L2_BROADCAST_ID)
|
if (rtneEntry->dst == L2_GetNodeId(instPtr) || rtneEntry->dst == L2_BROADCAST_ID)
|
||||||
{
|
{
|
||||||
torState = L2_TOR_RX;
|
torState = L2_TOR_RX;
|
||||||
|
commNode = L2_GetNodeById(instPtr->nodeList, rtneEntry->src);
|
||||||
}
|
}
|
||||||
else if (rtneEntry->src == L2_GetNodeId(instPtr) || rtneEntry->src == L2_BROADCAST_ID)
|
else if (rtneEntry->src == L2_GetNodeId(instPtr) || rtneEntry->src == L2_BROADCAST_ID)
|
||||||
{
|
{
|
||||||
torState = L2_TOR_TX;
|
torState = L2_TOR_TX;
|
||||||
|
commNode = L2_GetNodeById(instPtr->nodeList, rtneEntry->dst);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
torState = L2_TOR_SUSPEND;
|
torState = L2_TOR_SUSPEND;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Setup antenna beam
|
||||||
|
Phy_SetBeamWidth(phyRef, PHY_ANT_BEAM_16);
|
||||||
|
instPtr->log.lastBeamWidth = PHY_ANT_BEAM_16;
|
||||||
|
if (commNode != NULL)
|
||||||
|
{
|
||||||
|
Phy_SetBeamNo(phyRef, commNode->nodeInfo.beamNo, PHY_ANT_BEAM_16);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -627,6 +826,9 @@ int32_t L2_Scan_Routine(L2_INST *instPtr, const L2_RTNE_TABLE_ENTRY *rtneEntry)
|
|||||||
{
|
{
|
||||||
torState = L2_TOR_SUSPEND;
|
torState = L2_TOR_SUSPEND;
|
||||||
}
|
}
|
||||||
|
// Setup antenna beam
|
||||||
|
Phy_SetBeamWidth(phyRef, PHY_ANT_BEAM_120);
|
||||||
|
instPtr->log.lastBeamWidth = PHY_ANT_BEAM_120;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (rtneEntry->slotType)
|
switch (rtneEntry->slotType)
|
||||||
|
|||||||
@@ -88,6 +88,7 @@ static int32_t Service_Packing(L2_INST *instPtr, L2_FRAME_TYPE type, uint8_t dst
|
|||||||
uint32_t dataChunk;
|
uint32_t dataChunk;
|
||||||
uint8_t *buff = instPtr->sendPktData;
|
uint8_t *buff = instPtr->sendPktData;
|
||||||
|
|
||||||
|
// Common section of link layer package
|
||||||
dataChunk = L2_GetNextFrameNum(instPtr);
|
dataChunk = L2_GetNextFrameNum(instPtr);
|
||||||
L2_FrameInsertChunk(buff, L2_MSG_FRAME_NUM, L2_MSG_FRAME_NUM_LEN, &dataChunk);
|
L2_FrameInsertChunk(buff, L2_MSG_FRAME_NUM, L2_MSG_FRAME_NUM_LEN, &dataChunk);
|
||||||
dataChunk = L2_GetNextSlotNum(instPtr);
|
dataChunk = L2_GetNextSlotNum(instPtr);
|
||||||
@@ -128,13 +129,6 @@ static int32_t Service_Packing(L2_INST *instPtr, L2_FRAME_TYPE type, uint8_t dst
|
|||||||
L2_FrameInsertChunk(buff, L2_MSG_SVC_PAYLOAD, L2_MSG_SVC_PAYLOAD_LEN, testData);
|
L2_FrameInsertChunk(buff, L2_MSG_SVC_PAYLOAD, L2_MSG_SVC_PAYLOAD_LEN, testData);
|
||||||
}
|
}
|
||||||
|
|
||||||
// // packing payload
|
|
||||||
// uint32_t dataId;
|
|
||||||
// dataId = DATA_ID_TEST;
|
|
||||||
// L2_FrameInsertChunk(buff, L2_MSG_SVC_PAYLOAD_ID, L2_MSG_SVC_PAYLOAD_ID_LEN, &dataId);
|
|
||||||
// L2_FrameInsertChunk(buff, L2_MSG_SVC_PAYLOAD, L2_MSG_SVC_PAYLOAD_LEN, testData);
|
|
||||||
|
|
||||||
|
|
||||||
Status = L2_CrcAppend(buff, L2_SVC_PACK_LEN - L2_MSG_SVC_CRC_LEN, L2_MSG_SVC_CRC, L2_CRC16_1021);
|
Status = L2_CrcAppend(buff, L2_SVC_PACK_LEN - L2_MSG_SVC_CRC_LEN, L2_MSG_SVC_CRC, L2_CRC16_1021);
|
||||||
if (Status != SUCCESS)
|
if (Status != SUCCESS)
|
||||||
{
|
{
|
||||||
@@ -142,8 +136,8 @@ static int32_t Service_Packing(L2_INST *instPtr, L2_FRAME_TYPE type, uint8_t dst
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(instPtr->serviceFSM->txLog.data, buff, L2_SVC_PACK_LEN);
|
memcpy(instPtr->log.txLog.data, buff, L2_SVC_PACK_LEN);
|
||||||
instPtr->serviceFSM->txLog.dataId = dataId;
|
instPtr->log.txLog.dataId = dataId;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
@@ -160,62 +154,6 @@ static int32_t Service_Packing(L2_INST *instPtr, L2_FRAME_TYPE type, uint8_t dst
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/**
|
|
||||||
* @brief Initialize service net FSM
|
|
||||||
*
|
|
||||||
* @param serviceFSM A pointer to service FSM instance.
|
|
||||||
*
|
|
||||||
* @return SUCCESS Initialize successfully.
|
|
||||||
* Other Initialize failed.
|
|
||||||
*
|
|
||||||
******************************************************************************/
|
|
||||||
int32_t L2_Service_Init(L2_SVC_FSM **svcFSMPtr)
|
|
||||||
{
|
|
||||||
ASSERT(svcFSMPtr != NULL);
|
|
||||||
*svcFSMPtr = (L2_SVC_FSM *)malloc(sizeof(L2_SVC_FSM));
|
|
||||||
if (*svcFSMPtr == NULL)
|
|
||||||
{
|
|
||||||
return ENOMEM;
|
|
||||||
}
|
|
||||||
L2_Service_Reset(*svcFSMPtr);
|
|
||||||
return SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/**
|
|
||||||
* @brief Reset ServiceNet FSM
|
|
||||||
*
|
|
||||||
* @param scanFsmPtr a pointer to service net finite state machine
|
|
||||||
*
|
|
||||||
* @return NONE
|
|
||||||
*
|
|
||||||
******************************************************************************/
|
|
||||||
void L2_Service_Reset(L2_SVC_FSM *svcFSMPtr)
|
|
||||||
{
|
|
||||||
ASSERT(svcFSMPtr != NULL);
|
|
||||||
memset((&svcFSMPtr->rxLog), 0x00, sizeof(PAYLOAD));
|
|
||||||
memset((&svcFSMPtr->txLog), 0x00, sizeof(PAYLOAD));
|
|
||||||
#ifdef DATALINK_ENABLE_BERTEST
|
|
||||||
svcFSMPtr->bitTotal = 0;
|
|
||||||
svcFSMPtr->bitError = 0;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/**
|
|
||||||
* @brief Destroy ServiceNet FSM, free memory
|
|
||||||
*
|
|
||||||
* @param scanFsmPtr a pointer to service net finite state machine
|
|
||||||
*
|
|
||||||
* @return NONE
|
|
||||||
*
|
|
||||||
******************************************************************************/
|
|
||||||
void L2_Service_Destroy(L2_SVC_FSM *serviceFSM)
|
|
||||||
{
|
|
||||||
free(serviceFSM);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/**
|
/**
|
||||||
* @brief Handle service received packet. Send data up to MPC
|
* @brief Handle service received packet. Send data up to MPC
|
||||||
@@ -232,7 +170,7 @@ int32_t L2_Service_PktHandler(L2_INST *instPtr, uint8_t *msg)
|
|||||||
ASSERT(msg != NULL);
|
ASSERT(msg != NULL);
|
||||||
int32_t Status;
|
int32_t Status;
|
||||||
#ifndef DATALINK_ENABLE_BERTEST
|
#ifndef DATALINK_ENABLE_BERTEST
|
||||||
uint8_t frameType;
|
L2_FRAME_TYPE frameType = L2_NONE_FRAME;
|
||||||
L2_FrameGetChunk(msg, L2_MSG_TYPE, L2_MSG_TYPE_LEN, &frameType);
|
L2_FrameGetChunk(msg, L2_MSG_TYPE, L2_MSG_TYPE_LEN, &frameType);
|
||||||
switch (frameType)
|
switch (frameType)
|
||||||
{
|
{
|
||||||
@@ -286,21 +224,19 @@ int32_t L2_Service_PktHandler(L2_INST *instPtr, uint8_t *msg)
|
|||||||
uint32_t dataId;
|
uint32_t dataId;
|
||||||
L2_FrameGetChunk(msg, L2_MSG_SVC_PAYLOAD_ID, L2_MSG_SVC_PAYLOAD_ID_LEN, &dataId);
|
L2_FrameGetChunk(msg, L2_MSG_SVC_PAYLOAD_ID, L2_MSG_SVC_PAYLOAD_ID_LEN, &dataId);
|
||||||
|
|
||||||
if(dataId != DATA_ID_NONE)
|
|
||||||
{
|
|
||||||
if (L2_GetNodeType(instPtr) == L2_NODE_HEAD)
|
if (L2_GetNodeType(instPtr) == L2_NODE_HEAD)
|
||||||
{
|
{
|
||||||
SysMonitor_UpdateRecvPayload(msg+L2_MSG_SVC_PAYLOAD, PAYLOAD_LEN_FLJ_RX);
|
SysMonitor_UpdateRecvPayload(msg + L2_MSG_SVC_PAYLOAD, dataId, PAYLOAD_LEN_FLJ_RX);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SysMonitor_UpdateRecvPayload(msg+L2_MSG_SVC_PAYLOAD, PAYLOAD_LEN_LJ_RX);
|
SysMonitor_UpdateRecvPayload(msg + L2_MSG_SVC_PAYLOAD, dataId, PAYLOAD_LEN_LJ_RX);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Logging
|
// Logging
|
||||||
memcpy(instPtr->serviceFSM->rxLog.data, msg, L2_SVC_PACK_LEN);
|
memcpy(instPtr->log.rxLog.data, msg, L2_SVC_PACK_LEN);
|
||||||
instPtr->serviceFSM->rxLog.dataId = dataId;
|
instPtr->log.rxLog.dataId = dataId;
|
||||||
|
instPtr->serviceFSM->rxdCnt++;
|
||||||
|
|
||||||
#ifdef DATALINK_ENABLE_AUTOTIMESYNC
|
#ifdef DATALINK_ENABLE_AUTOTIMESYNC
|
||||||
// Implement a auto time sync.
|
// Implement a auto time sync.
|
||||||
@@ -347,6 +283,65 @@ int32_t L2_Service_PktHandler(L2_INST *instPtr, uint8_t *msg)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/**
|
||||||
|
* @brief Initialize service net FSM
|
||||||
|
*
|
||||||
|
* @param serviceFSM A pointer to service FSM instance.
|
||||||
|
*
|
||||||
|
* @return SUCCESS Initialize successfully.
|
||||||
|
* Other Initialize failed.
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
int32_t L2_Service_Init(L2_SVC_FSM **svcFSMPtr)
|
||||||
|
{
|
||||||
|
ASSERT(svcFSMPtr != NULL);
|
||||||
|
*svcFSMPtr = (L2_SVC_FSM *)malloc(sizeof(L2_SVC_FSM));
|
||||||
|
if (*svcFSMPtr == NULL)
|
||||||
|
{
|
||||||
|
return ENOMEM;
|
||||||
|
}
|
||||||
|
L2_Service_Reset(*svcFSMPtr);
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/**
|
||||||
|
* @brief Reset ServiceNet FSM
|
||||||
|
*
|
||||||
|
* @param scanFsmPtr a pointer to service net finite state machine
|
||||||
|
*
|
||||||
|
* @return NONE
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
void L2_Service_Reset(L2_SVC_FSM *svcFSMPtr)
|
||||||
|
{
|
||||||
|
ASSERT(svcFSMPtr != NULL);
|
||||||
|
svcFSMPtr->txCnt = 0;
|
||||||
|
svcFSMPtr->rxCnt = 0;
|
||||||
|
svcFSMPtr->rxdCnt = 0;
|
||||||
|
#ifdef DATALINK_ENABLE_BERTEST
|
||||||
|
svcFSMPtr->bitTotal = 0;
|
||||||
|
svcFSMPtr->bitError = 0;
|
||||||
|
svcFSMPtr->lossRate = 0;
|
||||||
|
svcFSMPtr->errorRate = 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/**
|
||||||
|
* @brief Destroy ServiceNet FSM, free memory
|
||||||
|
*
|
||||||
|
* @param scanFsmPtr a pointer to service net finite state machine
|
||||||
|
*
|
||||||
|
* @return NONE
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
void L2_Service_Destroy(L2_SVC_FSM *serviceFSM)
|
||||||
|
{
|
||||||
|
free(serviceFSM);
|
||||||
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/**
|
/**
|
||||||
* @brief Service FSM Routine.
|
* @brief Service FSM Routine.
|
||||||
@@ -368,25 +363,43 @@ int32_t L2_Service_Routine(L2_INST *instPtr, const L2_RTNE_TABLE_ENTRY *rtneEntr
|
|||||||
}
|
}
|
||||||
|
|
||||||
PHY_INST *phyRef = instPtr->config.phyInstPtr;
|
PHY_INST *phyRef = instPtr->config.phyInstPtr;
|
||||||
|
L2_SVC_FSM *svcFSMPtr = instPtr->serviceFSM;
|
||||||
L2_TOR_TYPE torState;
|
L2_TOR_TYPE torState;
|
||||||
|
const NODE_ENTRY *commNode;
|
||||||
if (rtneEntry->src == L2_GetNodeId(instPtr))
|
if (rtneEntry->src == L2_GetNodeId(instPtr))
|
||||||
{
|
{
|
||||||
torState = L2_TOR_TX;
|
torState = L2_TOR_TX;
|
||||||
|
commNode = L2_GetNodeById(instPtr->nodeList, rtneEntry->dst);
|
||||||
}
|
}
|
||||||
else if (rtneEntry->dst == L2_GetNodeId(instPtr))
|
else if (rtneEntry->dst == L2_GetNodeId(instPtr))
|
||||||
{
|
{
|
||||||
torState = L2_TOR_RX;
|
torState = L2_TOR_RX;
|
||||||
|
commNode = L2_GetNodeById(instPtr->nodeList, rtneEntry->src);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
torState = L2_TOR_SUSPEND;
|
torState = L2_TOR_SUSPEND;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Setup antenna beam
|
||||||
|
if (L2_GetNodeType(instPtr) != L2_NODE_HEAD && commNode != NULL)
|
||||||
|
{
|
||||||
|
Phy_SetBeamWidth(phyRef, PHY_ANT_BEAM_16);
|
||||||
|
Phy_SetBeamNo(phyRef, commNode->nodeInfo.beamNo, PHY_ANT_BEAM_16);
|
||||||
|
instPtr->log.lastBeamWidth = PHY_ANT_BEAM_16;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Phy_SetBeamWidth(phyRef, PHY_ANT_BEAM_120);
|
||||||
|
instPtr->log.lastBeamWidth = PHY_ANT_BEAM_120;
|
||||||
|
}
|
||||||
|
|
||||||
switch (rtneEntry->slotType)
|
switch (rtneEntry->slotType)
|
||||||
{
|
{
|
||||||
case L2_SLOT_SERVICE:
|
case L2_SLOT_SERVICE:
|
||||||
if (torState == L2_TOR_TX)
|
if (torState == L2_TOR_TX)
|
||||||
{
|
{
|
||||||
|
svcFSMPtr->txCnt++;
|
||||||
#ifndef DATALINK_ENABLE_BERTEST
|
#ifndef DATALINK_ENABLE_BERTEST
|
||||||
// Packing service data
|
// Packing service data
|
||||||
Service_Packing(instPtr, L2_SVC_FRAME, rtneEntry->dst);
|
Service_Packing(instPtr, L2_SVC_FRAME, rtneEntry->dst);
|
||||||
@@ -394,9 +407,10 @@ int32_t L2_Service_Routine(L2_INST *instPtr, const L2_RTNE_TABLE_ENTRY *rtneEntr
|
|||||||
memcpy(instPtr->sendPktData, testData, L2_SVC_PACK_LEN);
|
memcpy(instPtr->sendPktData, testData, L2_SVC_PACK_LEN);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
// FIXME: Steer antenna to point to destination.
|
else
|
||||||
Phy_SetBeamAngle(phyRef, 0.0, 0.0);
|
{
|
||||||
Phy_SetBeamWidth(phyRef, PHY_ANT_BEAM_8);
|
svcFSMPtr->rxCnt++;
|
||||||
|
}
|
||||||
L2_SetupNextSlot(instPtr, torState, L2_SVC_FRAME);
|
L2_SetupNextSlot(instPtr, torState, L2_SVC_FRAME);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -405,11 +419,11 @@ int32_t L2_Service_Routine(L2_INST *instPtr, const L2_RTNE_TABLE_ENTRY *rtneEntr
|
|||||||
}
|
}
|
||||||
#ifdef DATALINK_ENABLE_BERTEST
|
#ifdef DATALINK_ENABLE_BERTEST
|
||||||
uint32_t pktLoss;
|
uint32_t pktLoss;
|
||||||
pktLoss = instPtr->log.svcRecvCnt - instPtr->log.svcCorrectCnt;
|
pktLoss = svcFSMPtr->rxCnt - svcFSMPtr->rxdCnt;
|
||||||
instPtr->serviceFSM->lossRate = (instPtr->log.svcRecvCnt == 0) ? 0 : (double)pktLoss / (double)instPtr->serviceFSM->pktRecv;
|
svcFSMPtr->lossRate = (svcFSMPtr->rxCnt == 0) ? 0 : (double)pktLoss / (double)svcFSMPtr->rxCnt;
|
||||||
instPtr->serviceFSM->errorRate = (instPtr->serviceFSM->bitTotal == 0) ? 0 : (double)instPtr->serviceFSM->bitError / (double)instPtr->serviceFSM->bitTotal;
|
svcFSMPtr->errorRate = (svcFSMPtr->bitTotal == 0) ? 0 : (double)svcFSMPtr->bitError / (double)svcFSMPtr->bitTotal;
|
||||||
DBG_PRINT("Packet Loss Rate -- Total: %lu, Loss: %lu.\n", instPtr->serviceFSM->pktRecv, pktLoss);
|
DBG_PRINT("Packet Loss Rate -- Total: %lu, Loss: %lu.\n", instPtr->log.svcRxCnt, pktLoss);
|
||||||
DBG_PRINT("Bit Error Rate -- Total:%lu, Error:%lu.\n", instPtr->serviceFSM->bitTotal, instPtr->serviceFSM->bitError);
|
DBG_PRINT("Bit Error Rate -- Total:%lu, Error:%lu.\n", svcFSMPtr->bitTotal, svcFSMPtr->bitError);
|
||||||
#endif
|
#endif
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,7 +49,8 @@ int32_t L2_GetTimeDeviation(L2_INST *instPtr, uint32_t frameNum, uint32_t slotNu
|
|||||||
ASSERT(instPtr != NULL);
|
ASSERT(instPtr != NULL);
|
||||||
ASSERT(timeDev != NULL);
|
ASSERT(timeDev != NULL);
|
||||||
L1_FRAME_TYPE lastRecvdFrame;
|
L1_FRAME_TYPE lastRecvdFrame;
|
||||||
lastRecvdFrame = Phy_GetLastRecvFrameType(instPtr->config.phyInstPtr);
|
PHY_INST *phyRef = instPtr->config.phyInstPtr;
|
||||||
|
lastRecvdFrame = Phy_GetLastRecvFrameType(phyRef);
|
||||||
if (lastRecvdFrame == L1_NONE_FRAME)
|
if (lastRecvdFrame == L1_NONE_FRAME)
|
||||||
{
|
{
|
||||||
DBG_ERROR("Invalid TimeAlign operation, no frame was received.");
|
DBG_ERROR("Invalid TimeAlign operation, no frame was received.");
|
||||||
@@ -68,7 +69,7 @@ int32_t L2_GetTimeDeviation(L2_INST *instPtr, uint32_t frameNum, uint32_t slotNu
|
|||||||
expectTime += (uint64_t)instPtr->netStartTime * L2_SLOTS_PER_FRAME * TIME_FRAC_MAX;
|
expectTime += (uint64_t)instPtr->netStartTime * L2_SLOTS_PER_FRAME * TIME_FRAC_MAX;
|
||||||
}
|
}
|
||||||
|
|
||||||
Phy_GetLastReceivedFrameSyncTimeStamp(instPtr->config.phyInstPtr, &timeStamp);
|
Phy_GetLastReceivedFrameSyncTimeStamp(phyRef, &timeStamp);
|
||||||
currTime = (uint64_t)timeStamp.frac_part;
|
currTime = (uint64_t)timeStamp.frac_part;
|
||||||
currTime += ((uint64_t)timeStamp.int_part) * TIME_FRAC_MAX;
|
currTime += ((uint64_t)timeStamp.int_part) * TIME_FRAC_MAX;
|
||||||
|
|
||||||
@@ -76,7 +77,6 @@ int32_t L2_GetTimeDeviation(L2_INST *instPtr, uint32_t frameNum, uint32_t slotNu
|
|||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/**
|
/**
|
||||||
* @brief Implement time adjustment by applying time deviation.
|
* @brief Implement time adjustment by applying time deviation.
|
||||||
|
|||||||
@@ -29,16 +29,19 @@
|
|||||||
#define CTRL_WORD_DEFAULT 0x00
|
#define CTRL_WORD_DEFAULT 0x00
|
||||||
|
|
||||||
#define ANT_MODE_BEAM_MASK 0xF0
|
#define ANT_MODE_BEAM_MASK 0xF0
|
||||||
#define ANT_MODE_NARROR_BEAM 0x00 // 8
|
#define ANT_BEAM_NARROR 0x00 // 8
|
||||||
#define ANT_MODE_WIDE_BEAM_1 0x10 // 25
|
#define ANT_BEAM_SUBNARROR_0 0x10 // 25
|
||||||
#define ANT_MODE_WIDE_BEAM_2 0x20 // 60
|
#define ANT_BEAM_SUBNARROR_1 0x20 // 60
|
||||||
#define ANT_MODE_WIDE_BEAM_3 0x30 // 120
|
#define ANT_BEAM_WIDE 0x30 // 120
|
||||||
|
|
||||||
#define ANT_MODE_HIGH_POWER 0x00
|
#define ANT_MODE_POWER_MASK 0x0F
|
||||||
#define ANT_MODE_LOW_POWER 0x04
|
#define ANT_POWER_FULL 0x00
|
||||||
#define ANT_MODE_STANDBY 0x0F
|
#define ANT_POWER_LOW 0x04
|
||||||
#define ATN_MODE_DEFAULT (ANT_MODE_WIDE_BEAM_1 | ANT_MODE_LOW_POWER)
|
#define ANT_POWER_STANDBY 0x0F
|
||||||
#define ATN_MODE_HIGH (ANT_MODE_WIDE_BEAM_1 | ANT_MODE_HIGH_POWER)
|
#define ATN_MODE_SILENT (ANT_BEAM_SUBNARROR_0 | ANT_POWER_STANDBY)
|
||||||
|
#define ATN_MODE_LOWPOWER (ANT_BEAM_SUBNARROR_0 | ANT_POWER_LOW)
|
||||||
|
#define ATN_MODE_FULLPOWER (ANT_BEAM_SUBNARROR_0 | ANT_POWER_FULL)
|
||||||
|
#define ATN_MODE_DEFAULT ATN_MODE_SILENT
|
||||||
|
|
||||||
#define DEFAULT_CENTRTAL_FREQ 0x06D7 // 26.25GHz
|
#define DEFAULT_CENTRTAL_FREQ 0x06D7 // 26.25GHz
|
||||||
|
|
||||||
@@ -84,19 +87,36 @@ uint16_t hopPattern_10KBPS_10MS[L1_FRAME_10KBPS_10MS_HOPS] =
|
|||||||
1500
|
1500
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//uint16_t hopPattern_10KBPS_20MS[L1_FRAME_10KBPS_20MS_HOPS] =
|
||||||
|
//{
|
||||||
|
// 1500, 1600, 1700, 1800, 1900, 1400, 1300, 1200,
|
||||||
|
// 1100, 1000, 900
|
||||||
|
//};
|
||||||
|
|
||||||
uint16_t hopPattern_10KBPS_20MS[L1_FRAME_10KBPS_20MS_HOPS] =
|
uint16_t hopPattern_10KBPS_20MS[L1_FRAME_10KBPS_20MS_HOPS] =
|
||||||
{
|
{
|
||||||
1500
|
1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500,
|
||||||
|
1500, 1500, 1500
|
||||||
};
|
};
|
||||||
|
|
||||||
uint16_t hopPattern_40KBPS_10MS[L1_FRAME_40KBPS_10MS_HOPS] =
|
uint16_t hopPattern_40KBPS_10MS[L1_FRAME_40KBPS_10MS_HOPS] =
|
||||||
{
|
{
|
||||||
1600
|
1600, 1650, 1700, 1750, 1800, 1850, 1900, 1550,
|
||||||
|
1500
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//uint16_t hopPattern_40KBPS_20MS[L1_FRAME_40KBPS_20MS_HOPS] =
|
||||||
|
//{
|
||||||
|
// 1600, 1650, 1700, 1750, 1800, 1850, 1900, 1550,
|
||||||
|
// 1500, 1450, 1400, 1350, 1300, 1250, 1200, 1150,
|
||||||
|
// 1100, 1050, 1000
|
||||||
|
//};
|
||||||
|
|
||||||
uint16_t hopPattern_40KBPS_20MS[L1_FRAME_40KBPS_20MS_HOPS] =
|
uint16_t hopPattern_40KBPS_20MS[L1_FRAME_40KBPS_20MS_HOPS] =
|
||||||
{
|
{
|
||||||
1600
|
1700, 1800, 1900, 2000, 1700, 1700, 1700, 1700,
|
||||||
|
1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700,
|
||||||
|
1700, 1700, 1700
|
||||||
};
|
};
|
||||||
|
|
||||||
uint16_t hopPattern_200KBPS_5MS[L1_FRAME_200KBPS_5MS_HOPS] =
|
uint16_t hopPattern_200KBPS_5MS[L1_FRAME_200KBPS_5MS_HOPS] =
|
||||||
@@ -113,82 +133,13 @@ uint16_t hopPattern_1M2BPS_5MS[L1_FRAME_1M2BPS_5MS_HOPS] =
|
|||||||
900, 1000, 500, 500
|
900, 1000, 500, 500
|
||||||
};
|
};
|
||||||
|
|
||||||
// Pair by regex
|
|
||||||
// Regex: ((\{\.oaxis = [0-9]+[ ,]+\.raxis = [0-9]+[ ]*\}, ){2})
|
|
||||||
#ifdef PHY_BEAM_SET_PRESET
|
|
||||||
PHY_ANT_ANGLE antSubnrrwPattern[L1_NUM_ANT_SUBNRRW_PATTERN] =
|
|
||||||
{
|
|
||||||
{.oaxis = 0 , .raxis = 222}, {.oaxis = 10, .raxis = 85 },
|
|
||||||
{.oaxis = 14, .raxis = 307}, {.oaxis = 17, .raxis = 170},
|
|
||||||
{.oaxis = 19, .raxis = 32 }, {.oaxis = 21, .raxis = 255},
|
|
||||||
{.oaxis = 24, .raxis = 117}, {.oaxis = 25, .raxis = 340},
|
|
||||||
{.oaxis = 27, .raxis = 202}, {.oaxis = 29, .raxis = 65 },
|
|
||||||
{.oaxis = 31, .raxis = 287}, {.oaxis = 32, .raxis = 150},
|
|
||||||
{.oaxis = 34, .raxis = 12 }, {.oaxis = 35, .raxis = 235},
|
|
||||||
{.oaxis = 36, .raxis = 97 }, {.oaxis = 38, .raxis = 320},
|
|
||||||
{.oaxis = 39, .raxis = 182}, {.oaxis = 40, .raxis = 45 },
|
|
||||||
{.oaxis = 41, .raxis = 267}, {.oaxis = 43, .raxis = 130},
|
|
||||||
{.oaxis = 44, .raxis = 352}, {.oaxis = 45, .raxis = 215},
|
|
||||||
{.oaxis = 46, .raxis = 77 }, {.oaxis = 47, .raxis = 300},
|
|
||||||
{.oaxis = 48, .raxis = 162}, {.oaxis = 49, .raxis = 25 },
|
|
||||||
{.oaxis = 50, .raxis = 247}, {.oaxis = 51, .raxis = 110},
|
|
||||||
{.oaxis = 52, .raxis = 332}, {.oaxis = 53, .raxis = 195},
|
|
||||||
{.oaxis = 54, .raxis = 57 }, {.oaxis = 55, .raxis = 280},
|
|
||||||
{.oaxis = 56, .raxis = 142}, {.oaxis = 57, .raxis = 5 },
|
|
||||||
{.oaxis = 58, .raxis = 227}, {.oaxis = 59, .raxis = 90 },
|
|
||||||
{.oaxis = 60, .raxis = 312}
|
|
||||||
};
|
|
||||||
PHY_ANT_ANGLE antNrrwPattern[L1_NUM_ANT_NRRW_PATTERN] =
|
|
||||||
{
|
|
||||||
{.oaxis = 0 , .raxis = 222}, {.oaxis = 7 , .raxis = 85 },
|
|
||||||
{.oaxis = 10, .raxis = 307}, {.oaxis = 13, .raxis = 170},
|
|
||||||
{.oaxis = 15, .raxis = 32 }, {.oaxis = 17, .raxis = 255},
|
|
||||||
{.oaxis = 18, .raxis = 117}, {.oaxis = 20, .raxis = 340},
|
|
||||||
{.oaxis = 21, .raxis = 202}, {.oaxis = 22, .raxis = 65 },
|
|
||||||
{.oaxis = 24, .raxis = 287}, {.oaxis = 25, .raxis = 150},
|
|
||||||
{.oaxis = 26, .raxis = 12 }, {.oaxis = 27, .raxis = 235},
|
|
||||||
{.oaxis = 28, .raxis = 97 }, {.oaxis = 29, .raxis = 320},
|
|
||||||
{.oaxis = 30, .raxis = 182}, {.oaxis = 31, .raxis = 45 },
|
|
||||||
{.oaxis = 32, .raxis = 267}, {.oaxis = 33, .raxis = 130},
|
|
||||||
{.oaxis = 34, .raxis = 352}, {.oaxis = 34, .raxis = 215},
|
|
||||||
{.oaxis = 35, .raxis = 77 }, {.oaxis = 36, .raxis = 300},
|
|
||||||
{.oaxis = 37, .raxis = 162}, {.oaxis = 38, .raxis = 25 },
|
|
||||||
{.oaxis = 38, .raxis = 247}, {.oaxis = 39, .raxis = 110},
|
|
||||||
{.oaxis = 40, .raxis = 332}, {.oaxis = 41, .raxis = 195},
|
|
||||||
{.oaxis = 41, .raxis = 57 }, {.oaxis = 42, .raxis = 280},
|
|
||||||
{.oaxis = 43, .raxis = 142}, {.oaxis = 44, .raxis = 5 },
|
|
||||||
{.oaxis = 44, .raxis = 227}, {.oaxis = 45, .raxis = 90 },
|
|
||||||
{.oaxis = 46, .raxis = 312}, {.oaxis = 46, .raxis = 175},
|
|
||||||
{.oaxis = 47, .raxis = 37 }, {.oaxis = 48, .raxis = 260},
|
|
||||||
{.oaxis = 48, .raxis = 122}, {.oaxis = 49, .raxis = 345},
|
|
||||||
{.oaxis = 49, .raxis = 207}, {.oaxis = 50, .raxis = 70 },
|
|
||||||
{.oaxis = 51, .raxis = 292}, {.oaxis = 51, .raxis = 155},
|
|
||||||
{.oaxis = 52, .raxis = 17 }, {.oaxis = 53, .raxis = 240},
|
|
||||||
{.oaxis = 53, .raxis = 102}, {.oaxis = 54, .raxis = 325},
|
|
||||||
{.oaxis = 54, .raxis = 187}, {.oaxis = 55, .raxis = 50 },
|
|
||||||
{.oaxis = 55, .raxis = 272}, {.oaxis = 56, .raxis = 135},
|
|
||||||
{.oaxis = 57, .raxis = 357}, {.oaxis = 57, .raxis = 220},
|
|
||||||
{.oaxis = 58, .raxis = 82 }, {.oaxis = 58, .raxis = 305},
|
|
||||||
{.oaxis = 59, .raxis = 167}, {.oaxis = 59, .raxis = 30 },
|
|
||||||
{.oaxis = 60, .raxis = 252}
|
|
||||||
};
|
|
||||||
#else
|
|
||||||
PHY_ANT_ANGLE antSubnrrwPattern[L1_NUM_ANT_SUBNRRW_PATTERN] =
|
|
||||||
{
|
|
||||||
0
|
|
||||||
};
|
|
||||||
PHY_ANT_ANGLE antNrrwPattern[L1_NUM_ANT_NRRW_PATTERN] =
|
|
||||||
{
|
|
||||||
0
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/**
|
/**
|
||||||
* @brief
|
* @brief Initialize antenna configurations (load preset values)
|
||||||
*
|
*
|
||||||
* @param antConfig
|
* @param antConfig pointer to antenna configure
|
||||||
*
|
*
|
||||||
* @return
|
* @return None.
|
||||||
*
|
*
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
void Phy_AntConfigInit(PHY_ANT_CONFIG *antConfig)
|
void Phy_AntConfigInit(PHY_ANT_CONFIG *antConfig)
|
||||||
@@ -242,32 +193,80 @@ void Phy_AntConfigInit(PHY_ANT_CONFIG *antConfig)
|
|||||||
// ***********************
|
// ***********************
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/**
|
||||||
|
* @brief Update antenna power mode setting
|
||||||
|
*
|
||||||
|
* @param instPtr pointer to physical layer instance
|
||||||
|
* @param mode new antenna mode
|
||||||
|
*
|
||||||
|
* @return None.
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
void Phy_AntConfigMode(PHY_INST *instPtr, PHY_ANT_MODE mode)
|
void Phy_AntConfigMode(PHY_INST *instPtr, PHY_ANT_MODE mode)
|
||||||
{
|
{
|
||||||
ASSERT(instPtr != NULL);
|
ASSERT(instPtr != NULL);
|
||||||
uint8_t config = instPtr->antConfig.antMode & ANT_MODE_BEAM_MASK;
|
uint8_t config = instPtr->antConfig.antMode & ANT_MODE_BEAM_MASK;
|
||||||
switch (mode)
|
switch (mode)
|
||||||
{
|
{
|
||||||
case PHY_ANT_MODE_SILENT:
|
case PHY_ANT_MODE_STANDBY:
|
||||||
config |= ANT_MODE_STANDBY;
|
config |= ANT_POWER_STANDBY;
|
||||||
break;
|
break;
|
||||||
case PHY_ANT_MODE_LOW_POWER:
|
case PHY_ANT_MODE_POWER_LOW:
|
||||||
config |= ANT_MODE_LOW_POWER;
|
config |= ANT_POWER_LOW;
|
||||||
break;
|
break;
|
||||||
case PHY_ANT_MODE_HIGH_POWER:
|
case PHY_ANT_MODE_POWER_FULL:
|
||||||
config |= ANT_MODE_HIGH_POWER;
|
config |= ANT_POWER_FULL;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
DBG_ERROR("Unknown antenna mode: %" PRIu8 ", remain previous mode.\n", mode);
|
DBG_ERROR("Unknown antenna mode: %" PRIu8 ", remain previous mode.\n", mode);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
instPtr->phyLog.antMode = mode;
|
||||||
instPtr->antConfig.antMode = config;
|
instPtr->antConfig.antMode = config;
|
||||||
|
// Sync logs to system monitor
|
||||||
|
SysMonitor_UpdatePhysicalLayerLog(&(instPtr->phyLog));
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t Phy_SetBeamNo(PHY_INST *instPtr, int32_t beamNo)
|
/*****************************************************************************/
|
||||||
|
/**
|
||||||
|
* @brief Update antenna beam width setting
|
||||||
|
*
|
||||||
|
* @param instPtr pointer to physical layer instance
|
||||||
|
* @param table new beam table
|
||||||
|
* @param offset table offset
|
||||||
|
*
|
||||||
|
* @return None
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
void Phy_SetBeamTable(PHY_INST *instPtr, PHY_ANT_ANGLE *table, uint32_t offset)
|
||||||
{
|
{
|
||||||
ASSERT(instPtr != NULL);
|
ASSERT(instPtr != NULL);
|
||||||
if (instPtr->beamWd.next == PHY_ANT_BEAM_8)
|
ASSERT(table != NULL);
|
||||||
|
for (int i = 0; i < L1_NUM_ANT_NRRW_PATTERN; i++)
|
||||||
|
{
|
||||||
|
instPtr->antNrrwPattern[i] = table[(i+offset) % L1_NUM_ANT_NRRW_PATTERN];
|
||||||
|
}
|
||||||
|
memcpy((uint32_t*)instPtr->antInfoAddr, instPtr->antNrrwPattern,
|
||||||
|
L1_NUM_ANT_NRRW_PATTERN*sizeof(PHY_ANT_ANGLE));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/**
|
||||||
|
* @brief Update antenna point direction using predefined beam table
|
||||||
|
*
|
||||||
|
* @param instPtr pointer to physical layer instance
|
||||||
|
* @param beamNo new beam index
|
||||||
|
*
|
||||||
|
* @return SUCCESS.
|
||||||
|
* FAILURE beamNo exceeds the table size
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
int32_t Phy_SetBeamNo(PHY_INST *instPtr, int32_t beamNo, PHY_ANT_BEAM_WIDTH beamWidth)
|
||||||
|
{
|
||||||
|
ASSERT(instPtr != NULL);
|
||||||
|
|
||||||
|
if (beamWidth == PHY_ANT_BEAM_16)
|
||||||
{
|
{
|
||||||
if (beamNo >= L1_NUM_ANT_NRRW_PATTERN)
|
if (beamNo >= L1_NUM_ANT_NRRW_PATTERN)
|
||||||
{
|
{
|
||||||
@@ -276,26 +275,10 @@ int32_t Phy_SetBeamNo(PHY_INST *instPtr, int32_t beamNo)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
instPtr->beamNo.next = beamNo;
|
instPtr->beamNo.next = beamNo;
|
||||||
instPtr->antConfig.oaxis[1] = (uint8_t)(antNrrwPattern[beamNo].oaxis);
|
instPtr->antConfig.oaxis[0] = (uint8_t)(instPtr->antNrrwPattern[beamNo].oaxis >> 8);
|
||||||
instPtr->antConfig.oaxis[0] = (uint8_t)((antNrrwPattern[beamNo].oaxis) >> 8);
|
instPtr->antConfig.oaxis[1] = (uint8_t)(instPtr->antNrrwPattern[beamNo].oaxis);
|
||||||
instPtr->antConfig.raxis[1] = (uint8_t)(antNrrwPattern[beamNo].raxis);
|
instPtr->antConfig.raxis[0] = (uint8_t)(instPtr->antNrrwPattern[beamNo].raxis >> 8);
|
||||||
instPtr->antConfig.raxis[0] = (uint8_t)((antNrrwPattern[beamNo].raxis) >> 8);
|
instPtr->antConfig.raxis[1] = (uint8_t)(instPtr->antNrrwPattern[beamNo].raxis);
|
||||||
return SUCCESS;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (instPtr->beamWd.next == PHY_ANT_BEAM_25)
|
|
||||||
{
|
|
||||||
if (beamNo >= L1_NUM_ANT_SUBNRRW_PATTERN)
|
|
||||||
{
|
|
||||||
return FAILURE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
instPtr->beamNo.next = beamNo;
|
|
||||||
instPtr->antConfig.oaxis[1] = (uint8_t)(antSubnrrwPattern[beamNo].oaxis);
|
|
||||||
instPtr->antConfig.oaxis[0] = (uint8_t)((antSubnrrwPattern[beamNo].oaxis) >> 8);
|
|
||||||
instPtr->antConfig.raxis[1] = (uint8_t)(antSubnrrwPattern[beamNo].raxis);
|
|
||||||
instPtr->antConfig.raxis[0] = (uint8_t)((antSubnrrwPattern[beamNo].raxis) >> 8);
|
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -304,15 +287,26 @@ int32_t Phy_SetBeamNo(PHY_INST *instPtr, int32_t beamNo)
|
|||||||
// Beam number assign not support.
|
// Beam number assign not support.
|
||||||
// Assign default angle (0,0)
|
// Assign default angle (0,0)
|
||||||
instPtr->beamNo.next = 0;
|
instPtr->beamNo.next = 0;
|
||||||
instPtr->antConfig.oaxis[1] = 0;
|
|
||||||
instPtr->antConfig.oaxis[0] = 0;
|
instPtr->antConfig.oaxis[0] = 0;
|
||||||
instPtr->antConfig.raxis[1] = 0;
|
instPtr->antConfig.oaxis[1] = 0;
|
||||||
instPtr->antConfig.raxis[0] = 0;
|
instPtr->antConfig.raxis[0] = 0;
|
||||||
|
instPtr->antConfig.raxis[1] = 0;
|
||||||
DBG_WARNING("Using default beam number...\n");
|
DBG_WARNING("Using default beam number...\n");
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/**
|
||||||
|
* @brief Update antenna beam width setting
|
||||||
|
*
|
||||||
|
* @param instPtr pointer to physical layer instance
|
||||||
|
* @param beamWidth new beam width
|
||||||
|
*
|
||||||
|
* @return SUCCESS.
|
||||||
|
* EPARAM - the direction is exceeds predefined range
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
int32_t Phy_SetBeamWidth(PHY_INST *instPtr, PHY_ANT_BEAM_WIDTH beamWidth)
|
int32_t Phy_SetBeamWidth(PHY_INST *instPtr, PHY_ANT_BEAM_WIDTH beamWidth)
|
||||||
{
|
{
|
||||||
ASSERT(instPtr != NULL);
|
ASSERT(instPtr != NULL);
|
||||||
@@ -320,28 +314,38 @@ int32_t Phy_SetBeamWidth(PHY_INST *instPtr, PHY_ANT_BEAM_WIDTH beamWidth)
|
|||||||
switch (beamWidth)
|
switch (beamWidth)
|
||||||
{
|
{
|
||||||
case PHY_ANT_BEAM_120:
|
case PHY_ANT_BEAM_120:
|
||||||
beamConfig |= ANT_MODE_WIDE_BEAM_3;
|
beamConfig |= ANT_BEAM_WIDE;
|
||||||
break;
|
break;
|
||||||
case PHY_ANT_BEAM_60:
|
case PHY_ANT_BEAM_60:
|
||||||
beamConfig |= ANT_MODE_WIDE_BEAM_2;
|
beamConfig |= ANT_BEAM_SUBNARROR_1;
|
||||||
break;
|
break;
|
||||||
case PHY_ANT_BEAM_25:
|
case PHY_ANT_BEAM_25:
|
||||||
beamConfig |= ANT_MODE_WIDE_BEAM_1;
|
beamConfig |= ANT_BEAM_SUBNARROR_0;
|
||||||
break;
|
break;
|
||||||
case PHY_ANT_BEAM_8:
|
case PHY_ANT_BEAM_16:
|
||||||
beamConfig |= ANT_MODE_NARROR_BEAM;
|
beamConfig |= ANT_BEAM_NARROR;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
DBG_ERROR("Beam width code: 0x%08X is illegal.\n\r", beamWidth);
|
DBG_ERROR("Beam width code: 0x%08X is illegal.\n\r", beamWidth);
|
||||||
return EPARAM;
|
return EPARAM;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
instPtr->antConfig.antMode = beamConfig;
|
instPtr->antConfig.antMode = beamConfig;
|
||||||
instPtr->beamWd.next = beamWidth;
|
instPtr->beamWd.next = beamWidth;
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Common version radius double input
|
/*****************************************************************************/
|
||||||
|
/**
|
||||||
|
* @brief Set antenna to a specific direction
|
||||||
|
*
|
||||||
|
* @param instPtr pointer to physical layer instance
|
||||||
|
* @param offAx elevation angle
|
||||||
|
* @param rndAx azimuth angle
|
||||||
|
*
|
||||||
|
* @return SUCCESS.
|
||||||
|
* EPARAM - the direction is exceeds predefined range
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
int32_t Phy_SetBeamAngle(PHY_INST *instPtr, double offAx, double rndAx)
|
int32_t Phy_SetBeamAngle(PHY_INST *instPtr, double offAx, double rndAx)
|
||||||
{
|
{
|
||||||
ASSERT(instPtr != NULL);
|
ASSERT(instPtr != NULL);
|
||||||
@@ -357,9 +361,9 @@ int32_t Phy_SetBeamAngle(PHY_INST *instPtr, double offAx, double rndAx)
|
|||||||
}
|
}
|
||||||
offAxDeg = offAxDeg * 10;
|
offAxDeg = offAxDeg * 10;
|
||||||
rndAxDeg = rndAxDeg * 10;
|
rndAxDeg = rndAxDeg * 10;
|
||||||
instPtr->antConfig.oaxis[1] = (uint8_t)offAxDeg;
|
|
||||||
instPtr->antConfig.oaxis[0] = (uint8_t)(offAxDeg >> 8);
|
instPtr->antConfig.oaxis[0] = (uint8_t)(offAxDeg >> 8);
|
||||||
instPtr->antConfig.raxis[1] = (uint8_t)rndAxDeg;
|
instPtr->antConfig.oaxis[1] = (uint8_t)offAxDeg;
|
||||||
instPtr->antConfig.raxis[0] = (uint8_t)(rndAxDeg >> 8);
|
instPtr->antConfig.raxis[0] = (uint8_t)(rndAxDeg >> 8);
|
||||||
|
instPtr->antConfig.raxis[1] = (uint8_t)rndAxDeg;
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include "phy_layer.h"
|
#include "phy_layer.h"
|
||||||
|
#include "phy_reg.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "error.h"
|
#include "error.h"
|
||||||
#ifndef EMULATION
|
#ifndef EMULATION
|
||||||
@@ -33,7 +34,6 @@
|
|||||||
#include "xadcps.h"
|
#include "xadcps.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/************************** Constant Definitions *****************************/
|
/************************** Constant Definitions *****************************/
|
||||||
#define L1_FRAME_LEN_MAX (8192 / 8) // byte
|
#define L1_FRAME_LEN_MAX (8192 / 8) // byte
|
||||||
#define L1_FRAME_2KBPS_20MS_LEN 0 // byte
|
#define L1_FRAME_2KBPS_20MS_LEN 0 // byte
|
||||||
@@ -59,6 +59,16 @@
|
|||||||
|
|
||||||
#define ANT_COINFO_LEN 32 // bytes
|
#define ANT_COINFO_LEN 32 // bytes
|
||||||
|
|
||||||
|
#define ATTN_DEFAULT 0
|
||||||
|
#define ATTN_2KBPS_100MS ATTN_DEFAULT
|
||||||
|
#define ATTN_2KBPS_20MS ATTN_DEFAULT
|
||||||
|
#define ATTN_10KBPS_10MS 31
|
||||||
|
#define ATTN_10KBPS_20MS 31
|
||||||
|
#define ATTN_40KBPS_10MS 21
|
||||||
|
#define ATTN_40KBPS_20MS 21
|
||||||
|
#define ATTN_200KBPS_5MS ATTN_DEFAULT
|
||||||
|
#define ATTN_1M2BPS_5MS ATTN_DEFAULT
|
||||||
|
|
||||||
/***************** Macros (Inline Functions) Definitions *********************/
|
/***************** Macros (Inline Functions) Definitions *********************/
|
||||||
/************************** Function Prototypes ******************************/
|
/************************** Function Prototypes ******************************/
|
||||||
static void Phy_RcdShift(PHY_RCD *rcd, int32_t netxVal);
|
static void Phy_RcdShift(PHY_RCD *rcd, int32_t netxVal);
|
||||||
@@ -184,7 +194,8 @@ inline L1_FRAME_TYPE Phy_GetLastRecvFrameType(PHY_INST *instPtr)
|
|||||||
return L1_NONE_FRAME;
|
return L1_NONE_FRAME;
|
||||||
}
|
}
|
||||||
int32_t frame_type = (PhyRead(instPtr, COASE_FREQEST) & COASE_TYPE_MASK);
|
int32_t frame_type = (PhyRead(instPtr, COASE_FREQEST) & COASE_TYPE_MASK);
|
||||||
switch (frame_type) {
|
switch (frame_type)
|
||||||
|
{
|
||||||
case COASE_TYPE_2KBPS_20MS:
|
case COASE_TYPE_2KBPS_20MS:
|
||||||
return L1_2KBPS_20MS_FRAME;
|
return L1_2KBPS_20MS_FRAME;
|
||||||
case COASE_TYPE_2KBPS_100MS:
|
case COASE_TYPE_2KBPS_100MS:
|
||||||
@@ -307,31 +318,35 @@ void Phy_UpdateState(PHY_INST *instPtr)
|
|||||||
{
|
{
|
||||||
instPtr->isValid = false;
|
instPtr->isValid = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Logging
|
||||||
instPtr->recvSlotTime.int_part = PhyRead(instPtr, TM_TARGET_H);
|
instPtr->recvSlotTime.int_part = PhyRead(instPtr, TM_TARGET_H);
|
||||||
instPtr->recvSlotTime.frac_part = PhyRead(instPtr, TM_TARGET_L);
|
instPtr->recvSlotTime.frac_part = PhyRead(instPtr, TM_TARGET_L);
|
||||||
instPtr->recvFsTime.int_part = PhyRead(instPtr, FSTIME_H);
|
instPtr->recvFsTime.int_part = PhyRead(instPtr, FSTIME_H);
|
||||||
instPtr->recvFsTime.frac_part = PhyRead(instPtr, FSTIME_L);
|
instPtr->recvFsTime.frac_part = PhyRead(instPtr, FSTIME_L);
|
||||||
|
|
||||||
instPtr->phyLog.acqCnt = PhyRead(instPtr, PHY_ACQ_CNT);
|
instPtr->phyLog.acqCnt = PhyRead(instPtr, PHY_ACQ_CNT);
|
||||||
instPtr->phyLog.fsyncCnt = PhyRead(instPtr, PHY_FRAME_SYNC_CNT);
|
instPtr->phyLog.fsyncCnt = PhyRead(instPtr, PHY_FRAME_SYNC_CNT);
|
||||||
instPtr->phyLog.decodeCnt = PhyRead(instPtr, PHY_DECODE_CNT);
|
instPtr->phyLog.decodeCnt = PhyRead(instPtr, PHY_DECODE_CNT);
|
||||||
instPtr->phyLog.crcCnt = PhyRead(instPtr, PHY_CRC_OK_CNT);
|
instPtr->phyLog.crcCnt = PhyRead(instPtr, PHY_CRC_OK_CNT);
|
||||||
instPtr->phyLog.doppler = Phy_GetFreqEst(instPtr);
|
instPtr->phyLog.doppler = Phy_GetFreqEst(instPtr);
|
||||||
instPtr->phyLog.recvStamp = (uint64_t)instPtr->recvFsTime.int_part * TIME_FRAC_MAX + instPtr->recvFsTime.frac_part;
|
instPtr->phyLog.recvStamp = (uint64_t)instPtr->recvFsTime.int_part * TIME_FRAC_MAX + instPtr->recvFsTime.frac_part;
|
||||||
instPtr->phyLog.acqPeak = PhyRead(instPtr, PHY_ACQ_PEAK_L);
|
uint64_t peak, avg;
|
||||||
instPtr->phyLog.acqPeak |= ((uint64_t)PhyRead(instPtr, PHY_ACQ_PEAK_H)) << 32;
|
peak = PhyRead(instPtr, PHY_ACQ_PEAK_L);
|
||||||
instPtr->phyLog.acqMean = PhyRead(instPtr, PHY_ACQ_MEAN_L);
|
peak |= ((uint64_t)PhyRead(instPtr, PHY_ACQ_PEAK_H)) << 32;
|
||||||
instPtr->phyLog.acqMean |= ((uint64_t)PhyRead(instPtr, PHY_ACQ_MEAN_H)) << 32;
|
avg = PhyRead(instPtr, PHY_ACQ_MEAN_L);
|
||||||
|
avg |= ((uint64_t)PhyRead(instPtr, PHY_ACQ_MEAN_H)) << 32;
|
||||||
|
instPtr->phyLog.acqPAPR = ((double)peak) / ((double)avg);
|
||||||
instPtr->phyLog.acqPhase = (PhyRead(instPtr, PHY_ACQ_FREQEST) & PHY_ACQ_FREQEST_PHASE_MASK) >> PHY_ACQ_FREQEST_PHASE_SHIFT;
|
instPtr->phyLog.acqPhase = (PhyRead(instPtr, PHY_ACQ_FREQEST) & PHY_ACQ_FREQEST_PHASE_MASK) >> PHY_ACQ_FREQEST_PHASE_SHIFT;
|
||||||
instPtr->phyLog.acqFreqCh = (PhyRead(instPtr, PHY_ACQ_FREQEST) & PHY_ACQ_FREQEST_CHANNEL_MASK) >> PHY_ACQ_FREQEST_CHANNEL_SHIFT;
|
instPtr->phyLog.acqFreqCh = (PhyRead(instPtr, PHY_ACQ_FREQEST) & PHY_ACQ_FREQEST_CHANNEL_MASK) >> PHY_ACQ_FREQEST_CHANNEL_SHIFT;
|
||||||
instPtr->phyLog.fsyncPeak = PhyRead(instPtr, PHY_FRAME_SYNC_PEAK_L);
|
peak = PhyRead(instPtr, PHY_FRAME_SYNC_PEAK_L);
|
||||||
instPtr->phyLog.fsyncPeak |= ((uint64_t)PhyRead(instPtr, PHY_FRAME_SYNC_PEAK_H)) << 32;
|
peak |= ((uint64_t)PhyRead(instPtr, PHY_FRAME_SYNC_PEAK_H)) << 32;
|
||||||
instPtr->phyLog.fsyncMean = PhyRead(instPtr, PHY_FRAME_SYNC_MEAN_L);
|
avg = PhyRead(instPtr, PHY_FRAME_SYNC_MEAN_L);
|
||||||
instPtr->phyLog.fsyncMean |= ((uint64_t)PhyRead(instPtr, PHY_FRAME_SYNC_MEAN_H)) << 32;
|
avg |= ((uint64_t)PhyRead(instPtr, PHY_FRAME_SYNC_MEAN_H)) << 32;
|
||||||
|
instPtr->phyLog.fsyncPAPR = ((double)peak) / ((double)avg);
|
||||||
instPtr->phyLog.fsyncFreqCh = (PhyRead(instPtr, PHY_FRAME_SYNC_FREQEST) & PHY_FRAME_SYNC_FREQEST_CHANNEL_MASK) >> PHY_FRAME_SYNC_FREQEST_CHANNEL_SHIFT;
|
instPtr->phyLog.fsyncFreqCh = (PhyRead(instPtr, PHY_FRAME_SYNC_FREQEST) & PHY_FRAME_SYNC_FREQEST_CHANNEL_MASK) >> PHY_FRAME_SYNC_FREQEST_CHANNEL_SHIFT;
|
||||||
instPtr->phyLog.deintlvAmpEst = PhyRead(instPtr, PHY_DEINTLV_AMPEST) & PHY_DEINTLV_AMPEST_MASK;
|
instPtr->phyLog.deintlvAmpEst = PhyRead(instPtr, PHY_DEINTLV_AMPEST) & PHY_DEINTLV_AMPEST_MASK;
|
||||||
instPtr->phyLog.reserve = 0;
|
memset(instPtr->phyLog.reserve, 0x00, sizeof(instPtr->phyLog.reserve));
|
||||||
|
// Sync logs to system monitor
|
||||||
SysMonitor_UpdatePhysicalLayerLog(&(instPtr->phyLog));
|
SysMonitor_UpdatePhysicalLayerLog(&(instPtr->phyLog));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -357,6 +372,7 @@ int32_t Phy_InstInit(PHY_INST **instPtr, PHY_CONFIG *phyConfig)
|
|||||||
{
|
{
|
||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
}
|
}
|
||||||
|
memset(*instPtr, 0x00, sizeof(PHY_INST));
|
||||||
|
|
||||||
memcpy(&((*instPtr)->phyCofig), phyConfig, sizeof(PHY_CONFIG));
|
memcpy(&((*instPtr)->phyCofig), phyConfig, sizeof(PHY_CONFIG));
|
||||||
(*instPtr)->isPhyEn = false;
|
(*instPtr)->isPhyEn = false;
|
||||||
@@ -454,6 +470,42 @@ int32_t Phy_InstInit(PHY_INST **instPtr, PHY_CONFIG *phyConfig)
|
|||||||
(*instPtr)->recvDataAddr = rxDataBram.Config.MemBaseAddress;
|
(*instPtr)->recvDataAddr = rxDataBram.Config.MemBaseAddress;
|
||||||
(*instPtr)->sendDataAddr = txDataBram.Config.MemBaseAddress;
|
(*instPtr)->sendDataAddr = txDataBram.Config.MemBaseAddress;
|
||||||
|
|
||||||
|
// Setup antenna presets
|
||||||
|
XBram antInfoBram;
|
||||||
|
if (phyConfig->antInfoBramId != -1)
|
||||||
|
{
|
||||||
|
bramConfigPtr = XBram_LookupConfig(phyConfig->antInfoBramId);
|
||||||
|
if (bramConfigPtr == NULL)
|
||||||
|
{
|
||||||
|
Status = EDCONF;
|
||||||
|
goto init_error;
|
||||||
|
}
|
||||||
|
Status = XBram_CfgInitialize(&antInfoBram, bramConfigPtr,
|
||||||
|
bramConfigPtr->CtrlBaseAddress);
|
||||||
|
if (Status != SUCCESS)
|
||||||
|
{
|
||||||
|
goto init_error;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* Execute the BRAM driver self test.
|
||||||
|
*/
|
||||||
|
Status = XBram_SelfTest(&antInfoBram, 0);
|
||||||
|
if (Status != SUCCESS)
|
||||||
|
{
|
||||||
|
goto init_error;
|
||||||
|
}
|
||||||
|
(*instPtr)->antInfoAddr = antInfoBram.Config.MemBaseAddress;
|
||||||
|
uint32_t phyMainCtrl = PhyRead(*instPtr, PHY_MAIN_CTRL);
|
||||||
|
phyMainCtrl &= ~PHY_MAIN_CTRL_NSCAN_MASK;
|
||||||
|
phyMainCtrl |= PHY_MAIN_CTRL_NSCAN_MASK &
|
||||||
|
(L1_NUM_ANT_NRRW_PATTERN << PHY_MAIN_CTRL_NSCAN_SHIFT);
|
||||||
|
PhyWrite(*instPtr, PHY_MAIN_CTRL, phyMainCtrl);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
(*instPtr)->antInfoAddr = (uintptr_t)NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* Initialize the XAdc driver. */
|
/* Initialize the XAdc driver. */
|
||||||
XAdcPs_Config *xadcConfigPtr;
|
XAdcPs_Config *xadcConfigPtr;
|
||||||
|
|
||||||
@@ -654,41 +706,49 @@ int32_t Phy_SetupNextSlot(PHY_INST *instPtr, PHY_TOR_TYPE txrxMode,
|
|||||||
phyModeCtrl |= PHY_MODE_CTRL_FRAME_2KBPS_20MS;
|
phyModeCtrl |= PHY_MODE_CTRL_FRAME_2KBPS_20MS;
|
||||||
hopNum = L1_FRAME_2KBPS_20MS_HOPS;
|
hopNum = L1_FRAME_2KBPS_20MS_HOPS;
|
||||||
hopPattern = hopPattern_2KBPS_20MS;
|
hopPattern = hopPattern_2KBPS_20MS;
|
||||||
|
instPtr->antConfig.rfTxMgc = ATTN_2KBPS_20MS;
|
||||||
break;
|
break;
|
||||||
case L1_2KBPS_100MS_FRAME:
|
case L1_2KBPS_100MS_FRAME:
|
||||||
phyModeCtrl |= PHY_MODE_CTRL_FRAME_2KBPS_100MS;
|
phyModeCtrl |= PHY_MODE_CTRL_FRAME_2KBPS_100MS;
|
||||||
hopNum = L1_FRAME_2KBPS_100MS_HOPS;
|
hopNum = L1_FRAME_2KBPS_100MS_HOPS;
|
||||||
hopPattern = hopPattern_2KBPS_100MS;
|
hopPattern = hopPattern_2KBPS_100MS;
|
||||||
|
instPtr->antConfig.rfTxMgc = ATTN_2KBPS_100MS;
|
||||||
break;
|
break;
|
||||||
case L1_10KBPS_10MS_FRAME:
|
case L1_10KBPS_10MS_FRAME:
|
||||||
phyModeCtrl |= PHY_MODE_CTRL_FRAME_10KBPS_10MS;
|
phyModeCtrl |= PHY_MODE_CTRL_FRAME_10KBPS_10MS;
|
||||||
hopNum = L1_FRAME_10KBPS_10MS_HOPS;
|
hopNum = L1_FRAME_10KBPS_20MS_HOPS;
|
||||||
hopPattern = hopPattern_10KBPS_10MS;
|
hopPattern = hopPattern_10KBPS_20MS;
|
||||||
|
instPtr->antConfig.rfTxMgc = ATTN_10KBPS_10MS;
|
||||||
break;
|
break;
|
||||||
case L1_10KBPS_20MS_FRAME:
|
case L1_10KBPS_20MS_FRAME:
|
||||||
phyModeCtrl |= PHY_MODE_CTRL_FRAME_10KBPS_20MS;
|
phyModeCtrl |= PHY_MODE_CTRL_FRAME_10KBPS_20MS;
|
||||||
hopNum = L1_FRAME_10KBPS_20MS_HOPS;
|
hopNum = L1_FRAME_10KBPS_20MS_HOPS;
|
||||||
hopPattern = hopPattern_10KBPS_20MS;
|
hopPattern = hopPattern_10KBPS_20MS;
|
||||||
|
instPtr->antConfig.rfTxMgc = ATTN_10KBPS_20MS;
|
||||||
break;
|
break;
|
||||||
case L1_40KBPS_20MS_FRAME:
|
case L1_40KBPS_20MS_FRAME:
|
||||||
phyModeCtrl |= PHY_MODE_CTRL_FRAME_40KBPS_20MS;
|
phyModeCtrl |= PHY_MODE_CTRL_FRAME_40KBPS_20MS;
|
||||||
hopNum = L1_FRAME_40KBPS_20MS_HOPS;
|
hopNum = L1_FRAME_40KBPS_20MS_HOPS;
|
||||||
hopPattern = hopPattern_40KBPS_20MS;
|
hopPattern = hopPattern_40KBPS_20MS;
|
||||||
|
instPtr->antConfig.rfTxMgc = ATTN_40KBPS_20MS;
|
||||||
break;
|
break;
|
||||||
case L1_40KBPS_10MS_FRAME:
|
case L1_40KBPS_10MS_FRAME:
|
||||||
phyModeCtrl |= PHY_MODE_CTRL_FRAME_40KBPS_10MS;
|
phyModeCtrl |= PHY_MODE_CTRL_FRAME_40KBPS_10MS;
|
||||||
hopNum = L1_FRAME_40KBPS_10MS_HOPS;
|
hopNum = L1_FRAME_40KBPS_10MS_HOPS;
|
||||||
hopPattern = hopPattern_40KBPS_10MS;
|
hopPattern = hopPattern_40KBPS_10MS;
|
||||||
|
instPtr->antConfig.rfTxMgc = ATTN_40KBPS_10MS;
|
||||||
break;
|
break;
|
||||||
case L1_200KBPS_5MS_FRAME:
|
case L1_200KBPS_5MS_FRAME:
|
||||||
phyModeCtrl |= PHY_MODE_CTRL_FRAME_200KBPS_5MS;
|
phyModeCtrl |= PHY_MODE_CTRL_FRAME_200KBPS_5MS;
|
||||||
hopNum = L1_FRAME_200KBPS_5MS_HOPS;
|
hopNum = L1_FRAME_200KBPS_5MS_HOPS;
|
||||||
hopPattern = hopPattern_200KBPS_5MS;
|
hopPattern = hopPattern_200KBPS_5MS;
|
||||||
|
instPtr->antConfig.rfTxMgc = ATTN_200KBPS_5MS;
|
||||||
break;
|
break;
|
||||||
case L1_1M2BPS_5MS_FRAME:
|
case L1_1M2BPS_5MS_FRAME:
|
||||||
phyModeCtrl |= PHY_MODE_CTRL_FRAME_1M2BPS_5MS;
|
phyModeCtrl |= PHY_MODE_CTRL_FRAME_1M2BPS_5MS;
|
||||||
hopNum = L1_FRAME_1M2BPS_5MS_HOPS;
|
hopNum = L1_FRAME_1M2BPS_5MS_HOPS;
|
||||||
hopPattern = hopPattern_1M2BPS_5MS;
|
hopPattern = hopPattern_1M2BPS_5MS;
|
||||||
|
instPtr->antConfig.rfTxMgc = ATTN_1M2BPS_5MS;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return EPARAM;
|
return EPARAM;
|
||||||
@@ -703,16 +763,14 @@ int32_t Phy_SetupNextSlot(PHY_INST *instPtr, PHY_TOR_TYPE txrxMode,
|
|||||||
const uint8_t *dataSrcPtr = (uint8_t *)(&(instPtr->antConfig));
|
const uint8_t *dataSrcPtr = (uint8_t *)(&(instPtr->antConfig));
|
||||||
for (int32_t i = 0; i < hopNum; i++)
|
for (int32_t i = 0; i < hopNum; i++)
|
||||||
{
|
{
|
||||||
instPtr->antConfig.antFreq[1] = (uint8_t)(hopPattern[i] & 0x00FF);
|
instPtr->antConfig.antFreq[0] = (uint8_t)(hopPattern[i] >> 8);
|
||||||
instPtr->antConfig.antFreq[0] = (uint8_t)((hopPattern[i] >> 8) & 0x00FF);
|
instPtr->antConfig.antFreq[1] = (uint8_t)hopPattern[i];
|
||||||
instPtr->antConfig.rfFreq[1] = (uint8_t)(hopPattern[i] & 0x00FF);
|
instPtr->antConfig.rfFreq[0] = (uint8_t)(hopPattern[i] >> 8);
|
||||||
instPtr->antConfig.rfFreq[0] = (uint8_t)((hopPattern[i] >> 8) & 0x00FF);
|
instPtr->antConfig.rfFreq[1] = (uint8_t)hopPattern[i];
|
||||||
memcpy((uint8_t *)(antConfigAddr + i * ANT_COINFO_LEN),
|
memcpy((uint8_t *)(antConfigAddr + i * ANT_COINFO_LEN),
|
||||||
dataSrcPtr, sizeof(PHY_ANT_CONFIG));
|
dataSrcPtr, sizeof(PHY_ANT_CONFIG));
|
||||||
}
|
}
|
||||||
uint32_t antCtrl = (instPtr->antConfigOffset & ANT_CONFIG_OFFSET_MASK)
|
uint32_t antCtrl = (instPtr->antConfigOffset & ANT_CONFIG_OFFSET_MASK) | ((hopNum << ANT_CONFIG_NUM_SHIFT) & ANT_CONFIG_NUM_MASK) | ((ANT_COINFO_LEN << ANT_CONFIG_LEN_SHIFT) & ANT_CONFIG_LEN_MASK);
|
||||||
| ((hopNum << ANT_CONFIG_NUM_SHIFT) & ANT_CONFIG_NUM_MASK)
|
|
||||||
| ((ANT_COINFO_LEN << ANT_CONFIG_LEN_SHIFT) & ANT_CONFIG_LEN_MASK);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
memcpy((uint8_t*)antConfigDataAddr, hopPattern, hopNum*sizeof(uint16_t));
|
memcpy((uint8_t*)antConfigDataAddr, hopPattern, hopNum*sizeof(uint16_t));
|
||||||
@@ -819,6 +877,21 @@ uint32_t Phy_GetTimeComp(L1_FRAME_TYPE frameType)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/**
|
||||||
|
* @brief Get the last scan beam number after autoscan.
|
||||||
|
*
|
||||||
|
* @param instPtr a pointer to physical instance
|
||||||
|
*
|
||||||
|
* @return beam number
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
uint8_t Phy_LastScanBeamNo(PHY_INST *instPtr)
|
||||||
|
{
|
||||||
|
ASSERT(instPtr != NULL);
|
||||||
|
return (uint8_t)PhyRead(instPtr, BEAM_SELECT_INDEX);
|
||||||
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/**
|
/**
|
||||||
* @brief Get frequency estimation of last valid frame.
|
* @brief Get frequency estimation of last valid frame.
|
||||||
@@ -837,7 +910,6 @@ double Phy_GetFreqEst(PHY_INST *instPtr)
|
|||||||
L1_FRAME_TYPE frameType;
|
L1_FRAME_TYPE frameType;
|
||||||
double coarse, fine;
|
double coarse, fine;
|
||||||
|
|
||||||
|
|
||||||
frameType = Phy_GetLastRecvFrameType(instPtr);
|
frameType = Phy_GetLastRecvFrameType(instPtr);
|
||||||
if (frameType > L1_1M2BPS_5MS_FRAME || frameType <= L1_NONE_FRAME)
|
if (frameType > L1_1M2BPS_5MS_FRAME || frameType <= L1_NONE_FRAME)
|
||||||
{
|
{
|
||||||
@@ -866,8 +938,7 @@ double Phy_GetFreqEst(PHY_INST *instPtr)
|
|||||||
fine = 12e6 / 2048 * ((double)estAbs) / 8192.0;
|
fine = 12e6 / 2048 * ((double)estAbs) / 8192.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
fine = ((fineReg & FINE_FREQEST_SIGN_MASK) == FINE_FREQEST_SIGN_NEG) ?
|
fine = ((fineReg & FINE_FREQEST_SIGN_MASK) == FINE_FREQEST_SIGN_NEG) ? -fine : fine;
|
||||||
-fine : fine;
|
|
||||||
|
|
||||||
return (coarse + fine);
|
return (coarse + fine);
|
||||||
}
|
}
|
||||||
@@ -946,8 +1017,7 @@ double Phy_GetFineFreqEst(PHY_INST *instPtr)
|
|||||||
// 1.5M Rc
|
// 1.5M Rc
|
||||||
freqEst = 12e6 / 2048 * ((double)estAbs) / 8192.0;
|
freqEst = 12e6 / 2048 * ((double)estAbs) / 8192.0;
|
||||||
}
|
}
|
||||||
freqEst = ((regValue & FINE_FREQEST_SIGN_MASK) == FINE_FREQEST_SIGN_NEG) ?
|
freqEst = ((regValue & FINE_FREQEST_SIGN_MASK) == FINE_FREQEST_SIGN_NEG) ? -freqEst : freqEst;
|
||||||
-freqEst : freqEst;
|
|
||||||
return freqEst;
|
return freqEst;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1078,7 +1148,6 @@ void Phy_GetLastReceivedSlotStartTimeStamp(PHY_INST *instPtr, TIME_WORD *slotSta
|
|||||||
memcpy(slotStart, &(instPtr->recvSlotTime), sizeof(TIME_WORD));
|
memcpy(slotStart, &(instPtr->recvSlotTime), sizeof(TIME_WORD));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/**
|
/**
|
||||||
* @brief Copy ans store the received data, if received data valid.
|
* @brief Copy ans store the received data, if received data valid.
|
||||||
@@ -1143,58 +1212,88 @@ void Phy_RefreshHwSate(PHY_INST *instPtr)
|
|||||||
#ifndef EMULATION
|
#ifndef EMULATION
|
||||||
float evalData;
|
float evalData;
|
||||||
instPtr->hwSate.isSpOk = true;
|
instPtr->hwSate.isSpOk = true;
|
||||||
// -- Update Ps voltage, unit mV
|
// -- Update FPGA voltage status;
|
||||||
|
instPtr->hwSate.spFpgaVolt = 0;
|
||||||
rawData = XAdcPs_GetAdcData(&(instPtr->hwXadc), XADCPS_CH_VCCPINT);
|
rawData = XAdcPs_GetAdcData(&(instPtr->hwXadc), XADCPS_CH_VCCPINT);
|
||||||
evalData = XAdcPs_RawToVoltage(rawData);
|
evalData = XAdcPs_RawToVoltage(rawData);
|
||||||
instPtr->hwSate.spPsVolt = (evalData > VOLTAGE_MAX) ? UINT8_MAX : (uint8_t) round(evalData/VOLTAGE_LSB);
|
instPtr->hwSate.spFpgaVolt |= (IS_PS_VALID(evalData)) ? VOLT_PS_OK : 0;
|
||||||
instPtr->hwSate.isSpOk = instPtr->hwSate.isSpOk && IS_PS_VALID(evalData);
|
|
||||||
|
|
||||||
// -- Update Ps aux voltage, unit mV
|
// -- -- Update Ps aux voltage
|
||||||
rawData = XAdcPs_GetAdcData(&(instPtr->hwXadc), XADCPS_CH_VCCPAUX);
|
rawData = XAdcPs_GetAdcData(&(instPtr->hwXadc), XADCPS_CH_VCCPAUX);
|
||||||
evalData = XAdcPs_RawToVoltage(rawData);
|
evalData = XAdcPs_RawToVoltage(rawData);
|
||||||
instPtr->hwSate.spPsAuxVolt = (evalData > VOLTAGE_MAX) ? UINT8_MAX : (uint8_t) round(evalData/VOLTAGE_LSB);
|
instPtr->hwSate.spFpgaVolt |= (IS_PSAUX_VALID(evalData)) ? VOLT_PSAUX_OK : 0;
|
||||||
instPtr->hwSate.isSpOk = instPtr->hwSate.isSpOk && IS_PSAUX_VALID(evalData);
|
|
||||||
|
|
||||||
// -- Update DDR voltage, unit mV
|
// -- -- Update DDR voltage
|
||||||
rawData = XAdcPs_GetAdcData(&(instPtr->hwXadc), XADCPS_CH_VCCPDRO);
|
rawData = XAdcPs_GetAdcData(&(instPtr->hwXadc), XADCPS_CH_VCCPDRO);
|
||||||
evalData = XAdcPs_RawToVoltage(rawData);
|
evalData = XAdcPs_RawToVoltage(rawData);
|
||||||
instPtr->hwSate.spDdrVolt = (evalData > VOLTAGE_MAX) ? UINT8_MAX : (uint8_t) round(evalData/VOLTAGE_LSB);
|
instPtr->hwSate.spFpgaVolt |= (IS_DDR_VALID(evalData)) ? VOLT_DDR_OK : 0;
|
||||||
instPtr->hwSate.isSpOk = instPtr->hwSate.isSpOk && IS_DDR_VALID(evalData);
|
|
||||||
|
|
||||||
// -- Update PL voltage, unit mV
|
// -- -- Update PL voltage
|
||||||
rawData = XAdcPs_GetAdcData(&(instPtr->hwXadc), XADCPS_CH_VCCINT);
|
rawData = XAdcPs_GetAdcData(&(instPtr->hwXadc), XADCPS_CH_VCCINT);
|
||||||
evalData = XAdcPs_RawToVoltage(rawData);
|
evalData = XAdcPs_RawToVoltage(rawData);
|
||||||
instPtr->hwSate.spPlVolt = (evalData > VOLTAGE_MAX) ? UINT8_MAX : (uint8_t) round(evalData/VOLTAGE_LSB);
|
instPtr->hwSate.spFpgaVolt |= (IS_PL_VALID(evalData)) ? VOLT_PL_OK : 0;
|
||||||
instPtr->hwSate.isSpOk = instPtr->hwSate.isSpOk && IS_PL_VALID(evalData);
|
|
||||||
|
|
||||||
// -- Update PL aux voltage, unit mV
|
// -- -- Update PL aux voltage
|
||||||
rawData = XAdcPs_GetAdcData(&(instPtr->hwXadc), XADCPS_CH_VCCAUX);
|
rawData = XAdcPs_GetAdcData(&(instPtr->hwXadc), XADCPS_CH_VCCAUX);
|
||||||
evalData = XAdcPs_RawToVoltage(rawData);
|
evalData = XAdcPs_RawToVoltage(rawData);
|
||||||
instPtr->hwSate.spPlAuxVolt = (evalData > VOLTAGE_MAX) ? UINT8_MAX : (uint8_t) round(evalData/VOLTAGE_LSB);
|
instPtr->hwSate.spFpgaVolt |= (IS_PLAUX_VALID(evalData)) ? VOLT_PLAUX_OK : 0;
|
||||||
instPtr->hwSate.isSpOk = instPtr->hwSate.isSpOk && IS_PLAUX_VALID(evalData);
|
|
||||||
|
|
||||||
// -- Update Bram voltage, unit mV
|
// -- -- Update Bram voltage
|
||||||
rawData = XAdcPs_GetAdcData(&(instPtr->hwXadc), XADCPS_CH_VBRAM);
|
rawData = XAdcPs_GetAdcData(&(instPtr->hwXadc), XADCPS_CH_VBRAM);
|
||||||
evalData = XAdcPs_RawToVoltage(rawData);
|
evalData = XAdcPs_RawToVoltage(rawData);
|
||||||
instPtr->hwSate.spBramVolt = (evalData > VOLTAGE_MAX) ? UINT8_MAX : (uint8_t) round(evalData/VOLTAGE_LSB);
|
instPtr->hwSate.spFpgaVolt |= (IS_BRAM_VALID(evalData)) ? VOLT_BRAM_OK : 0;
|
||||||
instPtr->hwSate.isSpOk = instPtr->hwSate.isSpOk && IS_BRAM_VALID(evalData);
|
|
||||||
|
|
||||||
// -- Update Chip temperature, unit 0.01 deg
|
// -- Update clock lock state
|
||||||
|
if (instPtr->phyCofig.get_clk_state != NULL)
|
||||||
|
{
|
||||||
|
instPtr->hwSate.spClkState = instPtr->phyCofig.get_clk_state();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
instPtr->hwSate.spClkState = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// -- Update AD9361 pll lock state
|
||||||
|
if (instPtr->phyCofig.get_ad_lock_state != NULL)
|
||||||
|
{
|
||||||
|
instPtr->hwSate.spAdLockState = instPtr->phyCofig.get_ad_lock_state();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
instPtr->hwSate.spAdLockState = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// -- Update AD9361-0 temperature, unit 1 Celcius degree
|
||||||
|
if (instPtr->phyCofig.get_ad0_temp != NULL)
|
||||||
|
{
|
||||||
|
instPtr->hwSate.spAdTemp_0 = instPtr->phyCofig.get_ad0_temp();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
instPtr->hwSate.spAdTemp_0 = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// -- Update AD9361-1 temperature, unit 1 Celcius degree
|
||||||
|
if (instPtr->phyCofig.get_ad1_temp != NULL)
|
||||||
|
{
|
||||||
|
instPtr->hwSate.spAdTemp_1 = instPtr->phyCofig.get_ad1_temp();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
instPtr->hwSate.spAdTemp_1 = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// -- Update FPGA Chip temperature, unit 1 deg
|
||||||
rawData = XAdcPs_GetAdcData(&(instPtr->hwXadc), XADCPS_CH_TEMP);
|
rawData = XAdcPs_GetAdcData(&(instPtr->hwXadc), XADCPS_CH_TEMP);
|
||||||
evalData = XAdcPs_RawToTemperature(rawData);
|
evalData = XAdcPs_RawToTemperature(rawData);
|
||||||
instPtr->hwSate.spTemp = (evalData > TEMPERATURE_MAX)
|
instPtr->hwSate.spFpgaTemp = (evalData > TEMPERATURE_MAX)
|
||||||
? INT8_MAX
|
? INT8_MAX
|
||||||
: ((evalData < TEMPERATURE_MIN) ? INT8_MIN : (int8_t)round(evalData / TEMPERATURE_LSB));
|
: ((evalData < TEMPERATURE_MIN) ? INT8_MIN : (int8_t)round(evalData / TEMPERATURE_LSB));
|
||||||
|
instPtr->hwSate.isSpOk = (instPtr->hwSate.spFpgaVolt == (VOLT_PS_OK | VOLT_PSAUX_OK | VOLT_DDR_OK | VOLT_PL_OK | VOLT_PLAUX_OK | VOLT_BRAM_OK))
|
||||||
|
&& (instPtr->hwSate.spClkState == (CLK_SP_PLL0_LOCK | CLK_SP_PLL1_LOCK))
|
||||||
|
&& (instPtr->hwSate.spAdLockState == (CLK_AD0_BBPLL_LOCK | CLK_AD0_RFPLL_LOCK | CLK_AD1_BBPLL_LOCK | CLK_AD1_RFPLL_LOCK));
|
||||||
#else
|
#else
|
||||||
instPtr->spPsVolt = 0;
|
instPtr->hwSate.isSpOk = true;
|
||||||
instPtr->spPsAuxVolt = 0;
|
|
||||||
instPtr->spDdrVolt = 0;
|
|
||||||
instPtr->spPlVolt = 0;
|
|
||||||
instPtr->spPlAuxVolt = 0;
|
|
||||||
instPtr->spBramVolt = 0;
|
|
||||||
instPtr->spTemp = 0;
|
|
||||||
instPtr->isSpOk = true;
|
|
||||||
#endif
|
#endif
|
||||||
/*** Voltage and Status ***/
|
/*** Voltage and Status ***/
|
||||||
rawData = PhyRead(instPtr, ANT_STATUS);
|
rawData = PhyRead(instPtr, ANT_STATUS);
|
||||||
@@ -1203,10 +1302,10 @@ void Phy_RefreshHwSate(PHY_INST *instPtr)
|
|||||||
// [2] - RF voltage status
|
// [2] - RF voltage status
|
||||||
// [4] - NIL voltage status
|
// [4] - NIL voltage status
|
||||||
// [6] - Antenna status
|
// [6] - Antenna status
|
||||||
instPtr->hwSate.antVolt = ((rawData & ANT_STATUS_ANT_VOLT_MASK) == ANT_STATUS_ANT_VOLT_OK) ? 0x01 : 0x00;
|
instPtr->hwSate.antVolt = ((rawData & ANT_STATUS_ANT_VOLT_MASK) == ANT_STATUS_ANT_VOLT_OK) ? VOLT_ANT_PROC_OK : 0x00;
|
||||||
instPtr->hwSate.antVolt |= ((rawData & ANT_STATUS_RF_VOLT_MASK) == ANT_STATUS_RF_VOLT_OK) ? 0x04 : 0x00;
|
instPtr->hwSate.antVolt |= ((rawData & ANT_STATUS_RF_VOLT_MASK) == ANT_STATUS_RF_VOLT_OK) ? VOLT_ANT_RF_OK : 0x00;
|
||||||
instPtr->hwSate.antVolt |= ((rawData & ANT_STATUS_NIL_VOLT_MASK) == ANT_STATUS_NIL_VOLT_OK) ? 0x10 : 0x00;
|
instPtr->hwSate.antVolt |= ((rawData & ANT_STATUS_NIL_VOLT_MASK) == ANT_STATUS_NIL_VOLT_OK) ? VOLT_ANT_NIL_OK : 0x00;
|
||||||
instPtr->hwSate.antVolt |= ((rawData & ANT_STATUS_CODE_MASK) == ANT_STATUS_CODE_OK) ? 0x40 : 0x00;
|
instPtr->hwSate.antVolt |= ((rawData & ANT_STATUS_CODE_MASK) == ANT_STATUS_CODE_OK) ? ANT_STATE_OK : 0x00;
|
||||||
|
|
||||||
/*** Temperature and Lock Status ***/
|
/*** Temperature and Lock Status ***/
|
||||||
rawData = PhyRead(instPtr, ANT_RF_STATUS);
|
rawData = PhyRead(instPtr, ANT_RF_STATUS);
|
||||||
@@ -1216,9 +1315,9 @@ void Phy_RefreshHwSate(PHY_INST *instPtr)
|
|||||||
// [0] - BASEBAND lock status
|
// [0] - BASEBAND lock status
|
||||||
// [2] - PLLA lock status
|
// [2] - PLLA lock status
|
||||||
// [4] - PLLB lock status
|
// [4] - PLLB lock status
|
||||||
instPtr->hwSate.antPll = ((rawData & ANT_RF_STATUS_BBLOCK_MASK) == ANT_RF_STATUS_BBLOCK_OK) ? 0x01 : 0x00;
|
instPtr->hwSate.antPll = ((rawData & ANT_RF_STATUS_BBLOCK_MASK) == ANT_RF_STATUS_BBLOCK_OK) ? CLK_ANT_BBPLL_LOCK : 0x00;
|
||||||
instPtr->hwSate.antPll |= ((rawData & ANT_RF_STATUS_PLLA_MASK) == ANT_RF_STATUS_PLLA_OK) ? 0x04 : 0x00;
|
instPtr->hwSate.antPll |= ((rawData & ANT_RF_STATUS_PLLA_MASK) == ANT_RF_STATUS_PLLA_OK) ? CLK_ANT_RFPLL0_LOCK : 0x00;
|
||||||
instPtr->hwSate.antPll |= ((rawData & ANT_RF_STATUS_PLLB_MASK) == ANT_RF_STATUS_PLLB_OK) ? 0x10 : 0x00;
|
instPtr->hwSate.antPll |= ((rawData & ANT_RF_STATUS_PLLB_MASK) == ANT_RF_STATUS_PLLB_OK) ? CLK_ANT_RFPLL1_LOCK : 0x00;
|
||||||
|
|
||||||
/*** MGCs ***/
|
/*** MGCs ***/
|
||||||
rawData = PhyRead(instPtr, ANT_RF_MGC);
|
rawData = PhyRead(instPtr, ANT_RF_MGC);
|
||||||
@@ -1233,14 +1332,10 @@ void Phy_RefreshHwSate(PHY_INST *instPtr)
|
|||||||
instPtr->hwSate.antMgc1 |= (rawData & ANT_RF_MGC_CH4_MASK) >> 24;
|
instPtr->hwSate.antMgc1 |= (rawData & ANT_RF_MGC_CH4_MASK) >> 24;
|
||||||
|
|
||||||
// Determin if antenna is ok.
|
// Determin if antenna is ok.
|
||||||
if(instPtr->hwSate.antVolt != 0x55 //01010101
|
instPtr->hwSate.isAntOk = (instPtr->hwSate.antVolt == (VOLT_ANT_PROC_OK | VOLT_ANT_RF_OK | VOLT_ANT_NIL_OK | ANT_STATE_OK))
|
||||||
||instPtr->hwSate.antPll != 0x15) // 00010101
|
&& (instPtr->hwSate.antPll == (CLK_ANT_BBPLL_LOCK | CLK_ANT_RFPLL0_LOCK | CLK_ANT_RFPLL1_LOCK));
|
||||||
{
|
|
||||||
instPtr->hwSate.isSpOk = false;
|
memset(instPtr->hwSate.reserve, 0x00, sizeof(instPtr->hwSate.reserve));
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
instPtr->hwSate.isSpOk = true;
|
|
||||||
}
|
|
||||||
SysMonitor_UpdateHardwareStatus(&(instPtr->hwSate));
|
SysMonitor_UpdateHardwareStatus(&(instPtr->hwSate));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,17 +26,16 @@
|
|||||||
|
|
||||||
/***************************** Include Files *********************************/
|
/***************************** Include Files *********************************/
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include "phy_reg.h"
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#ifndef EMULATION
|
#ifndef EMULATION
|
||||||
#include "xbram.h"
|
#include "xbram.h"
|
||||||
#include "xadcps.h"
|
#include "xadcps.h"
|
||||||
|
#include "../config/app_config.h"
|
||||||
#endif
|
#endif
|
||||||
#include "../../system_monitor.h"
|
#include "../../system_monitor.h"
|
||||||
#include "../../time_ctrl/time_ctrl.h"
|
#include "../../time_ctrl/time_ctrl.h"
|
||||||
/************************** Constant Definitions *****************************/
|
/************************** Constant Definitions *****************************/
|
||||||
#define L1_NUM_ANT_SUBNRRW_PATTERN 37
|
#define L1_NUM_ANT_NRRW_PATTERN 37
|
||||||
#define L1_NUM_ANT_NRRW_PATTERN 61
|
|
||||||
#define L1_INIT_BEAM_NO 0
|
#define L1_INIT_BEAM_NO 0
|
||||||
#define L1_INIT_ANT_WD PHY_ANT_BEAM_120
|
#define L1_INIT_ANT_WD PHY_ANT_BEAM_120
|
||||||
#define L1_INIT_ANT_NO 0
|
#define L1_INIT_ANT_NO 0
|
||||||
@@ -149,7 +148,7 @@ typedef enum
|
|||||||
PHY_ANT_BEAM_120 = 1,
|
PHY_ANT_BEAM_120 = 1,
|
||||||
PHY_ANT_BEAM_60 = 2,
|
PHY_ANT_BEAM_60 = 2,
|
||||||
PHY_ANT_BEAM_25 = 3,
|
PHY_ANT_BEAM_25 = 3,
|
||||||
PHY_ANT_BEAM_8 = 4
|
PHY_ANT_BEAM_16 = 4
|
||||||
} PHY_ANT_BEAM_WIDTH;
|
} PHY_ANT_BEAM_WIDTH;
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
@@ -170,9 +169,9 @@ typedef enum
|
|||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
PHY_ANT_MODE_NONE = 0,
|
PHY_ANT_MODE_NONE = 0,
|
||||||
PHY_ANT_MODE_SILENT = 1,
|
PHY_ANT_MODE_STANDBY = 1,
|
||||||
PHY_ANT_MODE_LOW_POWER = 2,
|
PHY_ANT_MODE_POWER_LOW = 2,
|
||||||
PHY_ANT_MODE_HIGH_POWER = 3,
|
PHY_ANT_MODE_POWER_FULL = 3,
|
||||||
} PHY_ANT_MODE;
|
} PHY_ANT_MODE;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
@@ -181,8 +180,15 @@ typedef struct
|
|||||||
uint32_t txBramId;
|
uint32_t txBramId;
|
||||||
uint32_t rxBramId;
|
uint32_t rxBramId;
|
||||||
uint32_t antBramId;
|
uint32_t antBramId;
|
||||||
|
uint32_t antInfoBramId;
|
||||||
uint32_t hwXadcId;
|
uint32_t hwXadcId;
|
||||||
uintptr_t baseAddr;
|
uintptr_t baseAddr;
|
||||||
|
#ifndef EMULATION
|
||||||
|
uint8_t (*get_clk_state)(void);
|
||||||
|
uint8_t (*get_ad_lock_state)(void);
|
||||||
|
int8_t (*get_ad0_temp)(void);
|
||||||
|
int8_t (*get_ad1_temp)(void);
|
||||||
|
#endif
|
||||||
} PHY_CONFIG;
|
} PHY_CONFIG;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
@@ -198,6 +204,7 @@ typedef struct
|
|||||||
uintptr_t recvDataAddr;
|
uintptr_t recvDataAddr;
|
||||||
uintptr_t sendDataAddr;
|
uintptr_t sendDataAddr;
|
||||||
uintptr_t antConfigAddr;
|
uintptr_t antConfigAddr;
|
||||||
|
uintptr_t antInfoAddr;
|
||||||
bool isPhyEn; // if physical layer running
|
bool isPhyEn; // if physical layer running
|
||||||
bool isAcq; // if last reception acquisition success
|
bool isAcq; // if last reception acquisition success
|
||||||
bool isFrameSync; // if last reception frame sync success
|
bool isFrameSync; // if last reception frame sync success
|
||||||
@@ -217,6 +224,7 @@ typedef struct
|
|||||||
#ifndef EMULATION
|
#ifndef EMULATION
|
||||||
XAdcPs hwXadc;
|
XAdcPs hwXadc;
|
||||||
#endif
|
#endif
|
||||||
|
PHY_ANT_ANGLE antNrrwPattern[L1_NUM_ANT_NRRW_PATTERN];
|
||||||
HWSTATE hwSate;
|
HWSTATE hwSate;
|
||||||
PHYLOG phyLog;
|
PHYLOG phyLog;
|
||||||
} PHY_INST;
|
} PHY_INST;
|
||||||
@@ -233,9 +241,6 @@ extern uint16_t hopPattern_40KBPS_20MS[L1_FRAME_40KBPS_20MS_HOPS];
|
|||||||
extern uint16_t hopPattern_200KBPS_5MS[L1_FRAME_200KBPS_5MS_HOPS];
|
extern uint16_t hopPattern_200KBPS_5MS[L1_FRAME_200KBPS_5MS_HOPS];
|
||||||
extern uint16_t hopPattern_1M2BPS_5MS[L1_FRAME_1M2BPS_5MS_HOPS];
|
extern uint16_t hopPattern_1M2BPS_5MS[L1_FRAME_1M2BPS_5MS_HOPS];
|
||||||
|
|
||||||
extern PHY_ANT_ANGLE antSubnrrwPattern[L1_NUM_ANT_SUBNRRW_PATTERN];
|
|
||||||
extern PHY_ANT_ANGLE antNrrwPattern[L1_NUM_ANT_NRRW_PATTERN];
|
|
||||||
|
|
||||||
/************************** Function Prototypes ******************************/
|
/************************** Function Prototypes ******************************/
|
||||||
int32_t Phy_InstInit(PHY_INST **instPtr, PHY_CONFIG *phyConfig);
|
int32_t Phy_InstInit(PHY_INST **instPtr, PHY_CONFIG *phyConfig);
|
||||||
void Phy_Destroy(PHY_INST *instPtr);
|
void Phy_Destroy(PHY_INST *instPtr);
|
||||||
@@ -265,11 +270,13 @@ uint32_t Phy_GetTimeComp(L1_FRAME_TYPE frameType);
|
|||||||
|
|
||||||
void Phy_AntConfigInit(PHY_ANT_CONFIG *antConfig);
|
void Phy_AntConfigInit(PHY_ANT_CONFIG *antConfig);
|
||||||
void Phy_AntConfigMode(PHY_INST *instPtr, PHY_ANT_MODE mode);
|
void Phy_AntConfigMode(PHY_INST *instPtr, PHY_ANT_MODE mode);
|
||||||
|
void Phy_SetBeamTable(PHY_INST *instPtr, PHY_ANT_ANGLE *table, uint32_t offset);
|
||||||
int32_t Phy_SetBeamWidth(PHY_INST *instPtr, PHY_ANT_BEAM_WIDTH beamWidth);
|
int32_t Phy_SetBeamWidth(PHY_INST *instPtr, PHY_ANT_BEAM_WIDTH beamWidth);
|
||||||
int32_t Phy_SetBeamNo(PHY_INST *instPtr, int32_t beamNo);
|
int32_t Phy_SetBeamNo(PHY_INST *instPtr, int32_t beamNo, PHY_ANT_BEAM_WIDTH beamWidth);
|
||||||
int32_t Phy_SetBeamAngle(PHY_INST *phyInstPtr, double offAx, double rndAx);
|
int32_t Phy_SetBeamAngle(PHY_INST *phyInstPtr, double offAx, double rndAx);
|
||||||
int32_t Phy_SetTimeWord(PHY_INST *instPtr, const TIME_WORD *tmWord, PHY_TIME_WORD_TYPE tmType);
|
int32_t Phy_SetTimeWord(PHY_INST *instPtr, const TIME_WORD *tmWord, PHY_TIME_WORD_TYPE tmType);
|
||||||
|
|
||||||
|
uint8_t Phy_LastScanBeamNo(PHY_INST *instPtr);
|
||||||
double Phy_GetFreqEst(PHY_INST *instPtr);
|
double Phy_GetFreqEst(PHY_INST *instPtr);
|
||||||
double Phy_GetCoarseFreqEst(PHY_INST *instPtr);
|
double Phy_GetCoarseFreqEst(PHY_INST *instPtr);
|
||||||
double Phy_GetFineFreqEst(PHY_INST *instPtr);
|
double Phy_GetFineFreqEst(PHY_INST *instPtr);
|
||||||
@@ -277,4 +284,4 @@ void Phy_GetFrameSyncTimeStamp(PHY_INST *instPtr, TIME_WORD *frameSyncT);
|
|||||||
void Phy_GetLastReceivedFrameSyncTimeStamp(PHY_INST *instPtr, TIME_WORD *frameSyncT);
|
void Phy_GetLastReceivedFrameSyncTimeStamp(PHY_INST *instPtr, TIME_WORD *frameSyncT);
|
||||||
void Phy_GetSlotStartTimeStamp(PHY_INST *instPtr, TIME_WORD *slotStart);
|
void Phy_GetSlotStartTimeStamp(PHY_INST *instPtr, TIME_WORD *slotStart);
|
||||||
void Phy_GetLastReceivedSlotStartTimeStamp(PHY_INST *instPtr, TIME_WORD *slotStart);
|
void Phy_GetLastReceivedSlotStartTimeStamp(PHY_INST *instPtr, TIME_WORD *slotStart);
|
||||||
#endif /* PHY_CTRL_H_ */
|
#endif // PHY_CTRL_H_
|
||||||
@@ -26,8 +26,8 @@
|
|||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
/***************** Macros (Inline Functions) Definitions *********************/
|
/***************** Macros (Inline Functions) Definitions *********************/
|
||||||
#define PhyRead(instPtr, addr) IO_In32(instPtr->phyCofig.baseAddr + addr)
|
#define PhyRead(instPtr, addr) IO_In32((instPtr)->phyCofig.baseAddr + addr)
|
||||||
#define PhyWrite(instPtr, addr, value) IO_Out32(instPtr->phyCofig.baseAddr + addr, value)
|
#define PhyWrite(instPtr, addr, value) IO_Out32((instPtr)->phyCofig.baseAddr + addr, value)
|
||||||
|
|
||||||
/************************** Constant Definitions *****************************/
|
/************************** Constant Definitions *****************************/
|
||||||
/**
|
/**
|
||||||
@@ -40,6 +40,9 @@
|
|||||||
#define PHY_MAIN_CTRL_MODE_SHIFT 8
|
#define PHY_MAIN_CTRL_MODE_SHIFT 8
|
||||||
#define PHY_MAIN_CTRL_MODE_WIDTH 8
|
#define PHY_MAIN_CTRL_MODE_WIDTH 8
|
||||||
#define PHY_MAIN_CTRL_MODE_MASK 0x0000FF00U
|
#define PHY_MAIN_CTRL_MODE_MASK 0x0000FF00U
|
||||||
|
#define PHY_MAIN_CTRL_NSCAN_SHIFT 16
|
||||||
|
#define PHY_MAIN_CTRL_NSCAN_WIDTH 8
|
||||||
|
#define PHY_MAIN_CTRL_NSCAN_MASK 0x00FF0000U
|
||||||
|
|
||||||
#define PHY_MAIN_CTRL_EN_EN 0x00000001U
|
#define PHY_MAIN_CTRL_EN_EN 0x00000001U
|
||||||
#define PHY_MAIN_CTRL_EN_DSBL 0x00000000U
|
#define PHY_MAIN_CTRL_EN_DSBL 0x00000000U
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
|
/***************************** Include Files *********************************/
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "system_monitor.h"
|
#include "system_monitor.h"
|
||||||
|
/************************** Constant Definitions *****************************/
|
||||||
#define BUFF_A 0x00
|
#define BUFF_A 0x00
|
||||||
#define BUFF_B 0x01
|
#define BUFF_B 0x01
|
||||||
#define BUFF_NONE 0xFF
|
#define BUFF_NONE 0xFF
|
||||||
@@ -14,6 +15,7 @@
|
|||||||
#define PRTCLLOG_PACK_ELN 24 // bytes
|
#define PRTCLLOG_PACK_ELN 24 // bytes
|
||||||
#define HWSTATE_PACK_ELN 12 // bytes
|
#define HWSTATE_PACK_ELN 12 // bytes
|
||||||
|
|
||||||
|
/************************** Data Type Definitions ****************************/
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
uint8_t latest;
|
uint8_t latest;
|
||||||
@@ -37,12 +39,14 @@ typedef struct
|
|||||||
HWSTATE hwState[2];
|
HWSTATE hwState[2];
|
||||||
} SYSMONITOR;
|
} SYSMONITOR;
|
||||||
|
|
||||||
|
/************************** Function Prototypes ******************************/
|
||||||
|
static uint8_t GetWritable(PINGPONG ctrllor);
|
||||||
|
static uint8_t GetReadable(PINGPONG ctrllor);
|
||||||
|
/************************** Variable Definitions *****************************/
|
||||||
static SYSMONITOR *sysMonitorInst;
|
static SYSMONITOR *sysMonitorInst;
|
||||||
|
|
||||||
uint8_t GetWritable(PINGPONG ctrllor);
|
/*********************** Function Implementations ***************************/
|
||||||
uint8_t GetReadable(PINGPONG ctrllor);
|
inline static uint8_t GetWritable(PINGPONG ctrllor)
|
||||||
|
|
||||||
inline uint8_t GetWritable(PINGPONG ctrllor)
|
|
||||||
{
|
{
|
||||||
// Allow only one write.
|
// Allow only one write.
|
||||||
ASSERT(ctrllor.wBusy == BUFF_NONE);
|
ASSERT(ctrllor.wBusy == BUFF_NONE);
|
||||||
@@ -52,7 +56,7 @@ inline uint8_t GetWritable(PINGPONG ctrllor)
|
|||||||
return ((ctrllor.rBusy == BUFF_B) ? BUFF_A : BUFF_B);
|
return ((ctrllor.rBusy == BUFF_B) ? BUFF_A : BUFF_B);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline uint8_t GetReadable(PINGPONG ctrllor)
|
inline static uint8_t GetReadable(PINGPONG ctrllor)
|
||||||
{
|
{
|
||||||
if (ctrllor.wBusy == BUFF_NONE || ctrllor.wBusy != ctrllor.latest)
|
if (ctrllor.wBusy == BUFF_NONE || ctrllor.wBusy != ctrllor.latest)
|
||||||
return ((ctrllor.latest == BUFF_NONE) ? BUFF_A : BUFF_B);
|
return ((ctrllor.latest == BUFF_NONE) ? BUFF_A : BUFF_B);
|
||||||
@@ -126,6 +130,10 @@ void SysMonitor_GetSysinfo(SYSINFO *info)
|
|||||||
void SysMonitor_UpdateSendPayload(const uint8_t *buff, size_t len)
|
void SysMonitor_UpdateSendPayload(const uint8_t *buff, size_t len)
|
||||||
{
|
{
|
||||||
ASSERT(sysMonitorInst != NULL);
|
ASSERT(sysMonitorInst != NULL);
|
||||||
|
if (len > PAYLOAD_LEN_MAX)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
uint8_t buffIndx;
|
uint8_t buffIndx;
|
||||||
buffIndx = GetWritable(sysMonitorInst->sendCtrl);
|
buffIndx = GetWritable(sysMonitorInst->sendCtrl);
|
||||||
sysMonitorInst->sendCtrl.wBusy = buffIndx;
|
sysMonitorInst->sendCtrl.wBusy = buffIndx;
|
||||||
@@ -141,6 +149,12 @@ void SysMonitor_UpdateSendPayload(const uint8_t *buff, size_t len)
|
|||||||
void SysMonitor_GetSendPayload(uint8_t *buff, uint32_t *id, size_t len)
|
void SysMonitor_GetSendPayload(uint8_t *buff, uint32_t *id, size_t len)
|
||||||
{
|
{
|
||||||
ASSERT(sysMonitorInst != NULL);
|
ASSERT(sysMonitorInst != NULL);
|
||||||
|
ASSERT(buff != NULL);
|
||||||
|
ASSERT(id != NULL);
|
||||||
|
if (len > PAYLOAD_LEN_MAX)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
uint8_t buffIndx, buffIndex_old;
|
uint8_t buffIndx, buffIndex_old;
|
||||||
buffIndex_old = sysMonitorInst->sendCtrl.rBusy;
|
buffIndex_old = sysMonitorInst->sendCtrl.rBusy;
|
||||||
if (buffIndex_old != BUFF_NONE)
|
if (buffIndex_old != BUFF_NONE)
|
||||||
@@ -160,14 +174,19 @@ void SysMonitor_GetSendPayload(uint8_t *buff, uint32_t *id, size_t len)
|
|||||||
/**
|
/**
|
||||||
* Update receive payload.
|
* Update receive payload.
|
||||||
*/
|
*/
|
||||||
void SysMonitor_UpdateRecvPayload(const uint8_t *buff, size_t len)
|
void SysMonitor_UpdateRecvPayload(const uint8_t *buff, uint32_t id, size_t len)
|
||||||
{
|
{
|
||||||
ASSERT(sysMonitorInst != NULL);
|
ASSERT(sysMonitorInst != NULL);
|
||||||
|
ASSERT(buff != NULL);
|
||||||
|
if (id == DATA_ID_NONE || len > PAYLOAD_LEN_MAX)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
uint8_t buffIndx;
|
uint8_t buffIndx;
|
||||||
buffIndx = GetWritable(sysMonitorInst->recvCtrl);
|
buffIndx = GetWritable(sysMonitorInst->recvCtrl);
|
||||||
sysMonitorInst->recvCtrl.wBusy = buffIndx;
|
sysMonitorInst->recvCtrl.wBusy = buffIndx;
|
||||||
memcpy(sysMonitorInst->recv[buffIndx].data, buff, len);
|
memcpy(sysMonitorInst->recv[buffIndx].data, buff, len);
|
||||||
sysMonitorInst->recv[buffIndx].dataId++;
|
sysMonitorInst->recv[buffIndx].dataId = id;
|
||||||
sysMonitorInst->recvCtrl.latest = buffIndx;
|
sysMonitorInst->recvCtrl.latest = buffIndx;
|
||||||
sysMonitorInst->recvCtrl.wBusy = BUFF_NONE;
|
sysMonitorInst->recvCtrl.wBusy = BUFF_NONE;
|
||||||
}
|
}
|
||||||
@@ -178,6 +197,12 @@ void SysMonitor_UpdateRecvPayload(const uint8_t *buff, size_t len)
|
|||||||
void SysMonitor_GetRecvPayload(uint8_t *buff, uint32_t *id, size_t len)
|
void SysMonitor_GetRecvPayload(uint8_t *buff, uint32_t *id, size_t len)
|
||||||
{
|
{
|
||||||
ASSERT(sysMonitorInst != NULL);
|
ASSERT(sysMonitorInst != NULL);
|
||||||
|
ASSERT(buff != NULL);
|
||||||
|
ASSERT(id != NULL);
|
||||||
|
if(len > PAYLOAD_LEN_MAX)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
uint8_t buffIndx, buffIndex_old;
|
uint8_t buffIndx, buffIndex_old;
|
||||||
buffIndex_old = sysMonitorInst->recvCtrl.rBusy;
|
buffIndex_old = sysMonitorInst->recvCtrl.rBusy;
|
||||||
if (buffIndex_old != BUFF_NONE)
|
if (buffIndex_old != BUFF_NONE)
|
||||||
@@ -200,6 +225,7 @@ void SysMonitor_GetRecvPayload(uint8_t *buff, uint32_t *id, size_t len)
|
|||||||
void SysMonitor_UpdateLinklayerLog(const LINKLOG *log)
|
void SysMonitor_UpdateLinklayerLog(const LINKLOG *log)
|
||||||
{
|
{
|
||||||
ASSERT(sysMonitorInst != NULL);
|
ASSERT(sysMonitorInst != NULL);
|
||||||
|
ASSERT(log != NULL);
|
||||||
uint8_t buffIndx;
|
uint8_t buffIndx;
|
||||||
buffIndx = GetWritable(sysMonitorInst->linkLogCtrl);
|
buffIndx = GetWritable(sysMonitorInst->linkLogCtrl);
|
||||||
sysMonitorInst->linkLogCtrl.wBusy = buffIndx;
|
sysMonitorInst->linkLogCtrl.wBusy = buffIndx;
|
||||||
@@ -214,6 +240,7 @@ void SysMonitor_UpdateLinklayerLog(const LINKLOG *log)
|
|||||||
void SysMonitor_GetLinklayerLog(LINKLOG *log)
|
void SysMonitor_GetLinklayerLog(LINKLOG *log)
|
||||||
{
|
{
|
||||||
ASSERT(sysMonitorInst != NULL);
|
ASSERT(sysMonitorInst != NULL);
|
||||||
|
ASSERT(log != NULL);
|
||||||
uint8_t buffIndx, buffIndex_old;
|
uint8_t buffIndx, buffIndex_old;
|
||||||
buffIndex_old = sysMonitorInst->linkLogCtrl.rBusy;
|
buffIndex_old = sysMonitorInst->linkLogCtrl.rBusy;
|
||||||
if (buffIndex_old != BUFF_NONE)
|
if (buffIndex_old != BUFF_NONE)
|
||||||
@@ -232,6 +259,7 @@ void SysMonitor_GetLinklayerLog(LINKLOG *log)
|
|||||||
void SysMonitor_UpdatePhysicalLayerLog(const PHYLOG *log)
|
void SysMonitor_UpdatePhysicalLayerLog(const PHYLOG *log)
|
||||||
{
|
{
|
||||||
ASSERT(sysMonitorInst != NULL);
|
ASSERT(sysMonitorInst != NULL);
|
||||||
|
ASSERT(log != NULL);
|
||||||
uint8_t buffIndx;
|
uint8_t buffIndx;
|
||||||
buffIndx = GetWritable(sysMonitorInst->phyLogCtrl);
|
buffIndx = GetWritable(sysMonitorInst->phyLogCtrl);
|
||||||
sysMonitorInst->phyLogCtrl.wBusy = buffIndx;
|
sysMonitorInst->phyLogCtrl.wBusy = buffIndx;
|
||||||
@@ -246,6 +274,7 @@ void SysMonitor_UpdatePhysicalLayerLog(const PHYLOG *log)
|
|||||||
void SysMonitor_GetPhysicalLayerLog(PHYLOG *log)
|
void SysMonitor_GetPhysicalLayerLog(PHYLOG *log)
|
||||||
{
|
{
|
||||||
ASSERT(sysMonitorInst != NULL);
|
ASSERT(sysMonitorInst != NULL);
|
||||||
|
ASSERT(log != NULL);
|
||||||
uint8_t buffIndx, buffIndex_old;
|
uint8_t buffIndx, buffIndex_old;
|
||||||
buffIndex_old = sysMonitorInst->phyLogCtrl.rBusy;
|
buffIndex_old = sysMonitorInst->phyLogCtrl.rBusy;
|
||||||
if (buffIndex_old != BUFF_NONE)
|
if (buffIndex_old != BUFF_NONE)
|
||||||
@@ -257,7 +286,6 @@ void SysMonitor_GetPhysicalLayerLog(PHYLOG *log)
|
|||||||
sysMonitorInst->phyLogCtrl.rBusy = buffIndex_old;
|
sysMonitorInst->phyLogCtrl.rBusy = buffIndex_old;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// @Hardware state
|
// @Hardware state
|
||||||
/**
|
/**
|
||||||
* Log hardware running status.
|
* Log hardware running status.
|
||||||
@@ -265,6 +293,7 @@ void SysMonitor_GetPhysicalLayerLog(PHYLOG *log)
|
|||||||
void SysMonitor_UpdateHardwareStatus(const HWSTATE *state)
|
void SysMonitor_UpdateHardwareStatus(const HWSTATE *state)
|
||||||
{
|
{
|
||||||
ASSERT(sysMonitorInst != NULL);
|
ASSERT(sysMonitorInst != NULL);
|
||||||
|
ASSERT(state != NULL);
|
||||||
uint8_t buffIndx;
|
uint8_t buffIndx;
|
||||||
buffIndx = GetWritable(sysMonitorInst->hwStateCtrl);
|
buffIndx = GetWritable(sysMonitorInst->hwStateCtrl);
|
||||||
sysMonitorInst->hwStateCtrl.wBusy = buffIndx;
|
sysMonitorInst->hwStateCtrl.wBusy = buffIndx;
|
||||||
@@ -279,6 +308,7 @@ void SysMonitor_UpdateHardwareStatus(const HWSTATE *state)
|
|||||||
void SysMonitor_GetHardwareStatus(HWSTATE *state)
|
void SysMonitor_GetHardwareStatus(HWSTATE *state)
|
||||||
{
|
{
|
||||||
ASSERT(sysMonitorInst != NULL);
|
ASSERT(sysMonitorInst != NULL);
|
||||||
|
ASSERT(state != NULL);
|
||||||
uint8_t buffIndx, buffIndex_old;
|
uint8_t buffIndx, buffIndex_old;
|
||||||
buffIndex_old = sysMonitorInst->hwStateCtrl.rBusy;
|
buffIndex_old = sysMonitorInst->hwStateCtrl.rBusy;
|
||||||
if (buffIndex_old != BUFF_NONE)
|
if (buffIndex_old != BUFF_NONE)
|
||||||
@@ -289,16 +319,3 @@ void SysMonitor_GetHardwareStatus(HWSTATE *state)
|
|||||||
memcpy(state, &(sysMonitorInst->hwState[buffIndx]), sizeof(HWSTATE));
|
memcpy(state, &(sysMonitorInst->hwState[buffIndx]), sizeof(HWSTATE));
|
||||||
sysMonitorInst->hwStateCtrl.rBusy = buffIndex_old;
|
sysMonitorInst->hwStateCtrl.rBusy = buffIndex_old;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// @System log
|
|
||||||
/**
|
|
||||||
* Get the latest system running log.
|
|
||||||
*/
|
|
||||||
void SysMonitor_GetSyslog(SYSLOG *log)
|
|
||||||
{
|
|
||||||
ASSERT(sysMonitorInst != NULL);
|
|
||||||
SysMonitor_GetLinklayerLog(&(log->linkLog));
|
|
||||||
SysMonitor_GetPhysicalLayerLog(&(log->phyLog));
|
|
||||||
SysMonitor_GetHardwareStatus(&(log->hwState));
|
|
||||||
}
|
|
||||||
@@ -1,9 +1,12 @@
|
|||||||
#ifndef __SYSTEM_MONITOR_H_
|
#ifndef __SYSTEM_MONITOR_H_
|
||||||
#define __SYSTEM_MONITOR_H_
|
#define __SYSTEM_MONITOR_H_
|
||||||
|
|
||||||
|
/***************************** Include Files *********************************/
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
|
/************************** Constant Definitions *****************************/
|
||||||
#define PAYLOAD_LEN_MAX 256
|
#define PAYLOAD_LEN_MAX 256
|
||||||
#define PAYLOAD_LEN_FLJ_RX 168
|
#define PAYLOAD_LEN_FLJ_RX 168
|
||||||
#define PAYLOAD_LEN_FLJ_TX 66
|
#define PAYLOAD_LEN_FLJ_TX 66
|
||||||
@@ -23,17 +26,51 @@
|
|||||||
#define VOLT_PLAUX_STD 1.8
|
#define VOLT_PLAUX_STD 1.8
|
||||||
#define VOLT_BRAM_STD 1.0
|
#define VOLT_BRAM_STD 1.0
|
||||||
|
|
||||||
#define IS_PS_VALID(x) (x <= 0.95 && x >= 1.05)
|
#define VOLT_PS_OK BIT(0)
|
||||||
|
#define VOLT_PSAUX_OK BIT(1)
|
||||||
|
#define VOLT_DDR_OK BIT(2)
|
||||||
|
#define VOLT_PL_OK BIT(3)
|
||||||
|
#define VOLT_PLAUX_OK BIT(4)
|
||||||
|
#define VOLT_BRAM_OK BIT(5)
|
||||||
|
|
||||||
|
#define VOLT_ANT_PROC_OK BIT(0)
|
||||||
|
#define VOLT_ANT_RF_OK BIT(2)
|
||||||
|
#define VOLT_ANT_NIL_OK BIT(4)
|
||||||
|
#define ANT_STATE_OK BIT(6)
|
||||||
|
|
||||||
|
// Xilinx Recommended
|
||||||
|
// #define IS_PS_VALID(x) (x <= 1.05 && x >= 0.95)
|
||||||
|
// #define IS_PSAUX_VALID(x) (x <= 1.89 && x >= 1.71)
|
||||||
|
// #define IS_DDR_VALID(x) (x <= 1.89 && x >= 1.14)
|
||||||
|
// #define IS_PL_VALID(x) (x <= 1.03 && x >= 0.97)
|
||||||
|
// #define IS_PLAUX_VALID(x) (x <= 1.89 && x >= 1.71)
|
||||||
|
// #define IS_BRAM_VALID(x) (x <= 1.03 && x >= 0.97)
|
||||||
|
#define IS_PS_VALID(x) (x <= 1.05 && x >= 0.95)
|
||||||
#define IS_PSAUX_VALID(x) (x <= 1.89 && x >= 1.71)
|
#define IS_PSAUX_VALID(x) (x <= 1.89 && x >= 1.71)
|
||||||
#define IS_DDR_VALID(x) (x <= 1.14 && x >= 1.89)
|
#define IS_DDR_VALID(x) (x <= 1.89 && x >= 1.14)
|
||||||
#define IS_PL_VALID(x) (x <= 0.97 && x >= 1.03)
|
#define IS_PL_VALID(x) (x <= 1.03 && x >= 0.96)
|
||||||
#define IS_PLAUX_VALID(x) (x <= 1.89 && x >= 1.71)
|
#define IS_PLAUX_VALID(x) (x <= 1.89 && x >= 1.71)
|
||||||
#define IS_BRAM_VALID(x) (x <= 0.97 && x >= 1.03)
|
#define IS_BRAM_VALID(x) (x <= 1.03 && x >= 0.96)
|
||||||
|
|
||||||
|
#define CLK_SP_PLL0_LOCK BIT(0)
|
||||||
|
#define CLK_SP_PLL1_LOCK BIT(2)
|
||||||
|
|
||||||
|
#define CLK_AD0_BBPLL_LOCK BIT(0)
|
||||||
|
#define CLK_AD0_RFPLL_LOCK BIT(2)
|
||||||
|
#define CLK_AD1_BBPLL_LOCK BIT(4)
|
||||||
|
#define CLK_AD1_RFPLL_LOCK BIT(6)
|
||||||
|
|
||||||
|
#define CLK_ANT_BBPLL_LOCK BIT(0)
|
||||||
|
#define CLK_ANT_RFPLL0_LOCK BIT(2)
|
||||||
|
#define CLK_ANT_RFPLL1_LOCK BIT(4)
|
||||||
|
|
||||||
#define TEMPERATURE_LSB 1.0 // Celsius degree
|
#define TEMPERATURE_LSB 1.0 // Celsius degree
|
||||||
#define TEMPERATURE_MAX 127.0 // Celsius degree
|
#define TEMPERATURE_MAX 127.0 // Celsius degree
|
||||||
#define TEMPERATURE_MIN -128.0 // Celsius degree
|
#define TEMPERATURE_MIN -128.0 // Celsius degree
|
||||||
|
|
||||||
|
/************************** Data Type Definitions ****************************/
|
||||||
|
/** @name System Info
|
||||||
|
*/
|
||||||
typedef struct __attribute__((packed))
|
typedef struct __attribute__((packed))
|
||||||
{
|
{
|
||||||
// -- unit: ms, 0~604799999
|
// -- unit: ms, 0~604799999
|
||||||
@@ -73,6 +110,22 @@ typedef struct __attribute__((packed))
|
|||||||
float roll;
|
float roll;
|
||||||
} SYSINFO;
|
} SYSINFO;
|
||||||
|
|
||||||
|
/** @name System Bus Log
|
||||||
|
*/
|
||||||
|
typedef struct __attribute__((packed))
|
||||||
|
{
|
||||||
|
// SystemBus log
|
||||||
|
// -- last valid config
|
||||||
|
// byte 0: 0x11 FLJ, 0x00 LJ
|
||||||
|
// byte 1: 0x66 Full Power, 0x88 Low Power
|
||||||
|
uint8_t lastConfig[2];
|
||||||
|
uint32_t pollCnt;
|
||||||
|
uint32_t svcCnt;
|
||||||
|
uint32_t remoteCnt;
|
||||||
|
} SYSBUSLOG;
|
||||||
|
|
||||||
|
/** @name Linklayer Log
|
||||||
|
*/
|
||||||
typedef struct __attribute__((packed))
|
typedef struct __attribute__((packed))
|
||||||
{
|
{
|
||||||
// Network log
|
// Network log
|
||||||
@@ -95,11 +148,14 @@ typedef struct __attribute__((packed))
|
|||||||
uint32_t svcTxCnt;
|
uint32_t svcTxCnt;
|
||||||
uint32_t svcRecvCnt;
|
uint32_t svcRecvCnt;
|
||||||
uint32_t svcCorrectCnt;
|
uint32_t svcCorrectCnt;
|
||||||
int64_t timeDev;
|
int32_t timeDev;
|
||||||
uint32_t sendId;
|
uint32_t sendId;
|
||||||
uint32_t recvId;
|
uint32_t recvId;
|
||||||
|
uint8_t reserve[4];
|
||||||
} LINKLOG;
|
} LINKLOG;
|
||||||
|
|
||||||
|
/** @name Physical layer Log
|
||||||
|
*/
|
||||||
typedef struct __attribute__((packed))
|
typedef struct __attribute__((packed))
|
||||||
{
|
{
|
||||||
uint32_t acqCnt;
|
uint32_t acqCnt;
|
||||||
@@ -108,57 +164,48 @@ typedef struct __attribute__((packed))
|
|||||||
uint32_t crcCnt;
|
uint32_t crcCnt;
|
||||||
double doppler;
|
double doppler;
|
||||||
uint64_t recvStamp;
|
uint64_t recvStamp;
|
||||||
uint64_t acqPeak;
|
double acqPAPR;
|
||||||
uint64_t acqMean;
|
|
||||||
uint8_t acqPhase;
|
uint8_t acqPhase;
|
||||||
uint8_t acqFreqCh;
|
uint8_t acqFreqCh;
|
||||||
uint64_t fsyncPeak;
|
double fsyncPAPR;
|
||||||
uint64_t fsyncMean;
|
|
||||||
uint8_t fsyncFreqCh;
|
uint8_t fsyncFreqCh;
|
||||||
uint16_t deintlvAmpEst;
|
uint16_t deintlvAmpEst;
|
||||||
uint16_t reserve;
|
uint8_t antMode;
|
||||||
|
uint8_t reserve[3];
|
||||||
} PHYLOG;
|
} PHYLOG;
|
||||||
|
|
||||||
|
/** @name Hardware Status Log
|
||||||
|
*/
|
||||||
typedef struct __attribute__((packed))
|
typedef struct __attribute__((packed))
|
||||||
{
|
{
|
||||||
// Hardware status
|
// Hardware status
|
||||||
bool isSpOk;
|
bool isSpOk;
|
||||||
bool isAntOk;
|
bool isAntOk;
|
||||||
// -- Signal processor status
|
// -- Signal processor status
|
||||||
uint8_t spPsVolt;
|
uint8_t spFpgaVolt;
|
||||||
uint8_t spPsAuxVolt;
|
uint8_t spClkState;
|
||||||
uint8_t spDdrVolt;
|
uint8_t spAdLockState;
|
||||||
uint8_t spPlVolt;
|
uint8_t spAdTemp_0;
|
||||||
uint8_t spPlAuxVolt;
|
uint8_t spAdTemp_1;
|
||||||
uint8_t spBramVolt;
|
uint8_t spFpgaTemp;
|
||||||
int8_t spTemp;
|
|
||||||
// -- Antenna status
|
// -- Antenna status
|
||||||
uint8_t antVolt;
|
uint8_t antVolt;
|
||||||
uint8_t antTemp;
|
uint8_t antTemp;
|
||||||
uint8_t antPll;
|
uint8_t antPll;
|
||||||
uint8_t antMgc0;
|
uint8_t antMgc0;
|
||||||
uint8_t antMgc1;
|
uint8_t antMgc1;
|
||||||
uint8_t dummy;
|
uint8_t reserve[2];
|
||||||
} HWSTATE;
|
} HWSTATE;
|
||||||
|
|
||||||
typedef struct
|
/** @name Payload
|
||||||
{
|
*/
|
||||||
// Link layer log
|
|
||||||
LINKLOG linkLog;
|
|
||||||
|
|
||||||
// Physical layer log
|
|
||||||
PHYLOG phyLog;
|
|
||||||
|
|
||||||
// Hardware status
|
|
||||||
HWSTATE hwState;
|
|
||||||
} SYSLOG;
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
uint32_t dataId;
|
uint32_t dataId;
|
||||||
uint8_t data[PAYLOAD_LEN_MAX];
|
uint8_t data[PAYLOAD_LEN_MAX];
|
||||||
} PAYLOAD;
|
} PAYLOAD;
|
||||||
|
|
||||||
|
/************************** Function Prototypes ******************************/
|
||||||
int32_t SysMonitor_Init(void);
|
int32_t SysMonitor_Init(void);
|
||||||
void SysMonitor_Destroy(void);
|
void SysMonitor_Destroy(void);
|
||||||
|
|
||||||
@@ -166,7 +213,7 @@ void SysMonitor_UpdateSysinfo(const SYSINFO *info);
|
|||||||
void SysMonitor_GetSysinfo(SYSINFO *info);
|
void SysMonitor_GetSysinfo(SYSINFO *info);
|
||||||
|
|
||||||
void SysMonitor_UpdateSendPayload(const uint8_t *buff, size_t len);
|
void SysMonitor_UpdateSendPayload(const uint8_t *buff, size_t len);
|
||||||
void SysMonitor_UpdateRecvPayload(const uint8_t *buff, size_t len);
|
void SysMonitor_UpdateRecvPayload(const uint8_t *buff, uint32_t id, size_t len);
|
||||||
void SysMonitor_GetSendPayload(uint8_t *buff, uint32_t *id, size_t len);
|
void SysMonitor_GetSendPayload(uint8_t *buff, uint32_t *id, size_t len);
|
||||||
void SysMonitor_GetRecvPayload(uint8_t *buff, uint32_t *id, size_t len);
|
void SysMonitor_GetRecvPayload(uint8_t *buff, uint32_t *id, size_t len);
|
||||||
|
|
||||||
@@ -177,6 +224,4 @@ void SysMonitor_GetLinklayerLog(LINKLOG *log);
|
|||||||
void SysMonitor_GetPhysicalLayerLog(PHYLOG *log);
|
void SysMonitor_GetPhysicalLayerLog(PHYLOG *log);
|
||||||
void SysMonitor_GetHardwareStatus(HWSTATE *state);
|
void SysMonitor_GetHardwareStatus(HWSTATE *state);
|
||||||
|
|
||||||
void SysMonitor_GetSyslog(SYSLOG *log);
|
|
||||||
|
|
||||||
#endif //__SYSTEM_MONITOR_H_
|
#endif //__SYSTEM_MONITOR_H_
|
||||||
|
|||||||
@@ -53,31 +53,30 @@
|
|||||||
#define ST_RET_ERROR 0x55
|
#define ST_RET_ERROR 0x55
|
||||||
#define ST_RET_INFO_LEN 13
|
#define ST_RET_INFO_LEN 13
|
||||||
// -- -- Signal processor PS voltage
|
// -- -- Signal processor PS voltage
|
||||||
#define WD_SP_PS_VOLT 0x03
|
#define WD_SP_FPGA_VOLT 0x03
|
||||||
// -- -- Signal processor PS AUX voltage
|
// -- -- Signal processor PS AUX voltage
|
||||||
#define WD_SP_PSAUX_VOLT 0x04
|
#define WD_SP_CLK_STATE 0x04
|
||||||
// -- -- Signal processor DDR voltage
|
// -- -- Signal processor DDR voltage
|
||||||
#define WD_SP_DDR_VOLT 0x05
|
#define WD_SP_AD_LOCK_STATE 0x05
|
||||||
// -- -- Signal processor PL voltage
|
// -- -- Signal processor PL voltage
|
||||||
#define WD_SP_PL_VOLT 0x06
|
#define WD_SP_AD_TEMP_0 0x06
|
||||||
// -- -- Signal processor PL AUX voltage
|
// -- -- Signal processor PL AUX voltage
|
||||||
#define WD_SP_PLAUX_VOLT 0x07
|
#define WD_SP_AD_TEMP_1 0x07
|
||||||
// -- -- Signal processor Bram voltage
|
// -- -- Signal processor Bram voltage
|
||||||
#define WD_SP_BRAM_VOLT 0x08
|
#define WD_SP_FPGA_TEMP 0x08
|
||||||
// -- -- Signal processor temperature
|
|
||||||
#define WD_SP_TEMP 0x09
|
|
||||||
|
|
||||||
// -- -- Signal processor antenna voltage status
|
// -- -- Signal processor antenna voltage status
|
||||||
#define WD_ANT_VOLT 0x0A
|
#define WD_ANT_VOLT 0x09
|
||||||
|
|
||||||
// -- -- Signal processor antenna RF temperature
|
// -- -- Signal processor antenna RF temperature
|
||||||
#define WD_ANT_RF_TEMP 0x0B
|
#define WD_ANT_RF_TEMP 0x0A
|
||||||
// -- -- Signal processor antenna PLL lock status
|
// -- -- Signal processor antenna PLL lock status
|
||||||
#define WD_ANT_RF_PLL 0x0C
|
#define WD_ANT_RF_PLL 0x0B
|
||||||
// -- -- Signal processor antenna MGC
|
// -- -- Signal processor antenna MGC
|
||||||
#define WD_ANT_MGC_0 0x0D
|
#define WD_ANT_MGC_0 0x0C
|
||||||
#define WD_ANT_MGC_1 0x0E
|
#define WD_ANT_MGC_1 0x0D
|
||||||
// -- -- Dummy must be 0x00
|
// -- -- Reserved
|
||||||
#define WD_ST_DUMMY 0x0F
|
#define WD_ANT_RESERVE 0x0E
|
||||||
|
|
||||||
// Data Send Test Command
|
// Data Send Test Command
|
||||||
#define CMD_DATA_TEST_A 0xE2
|
#define CMD_DATA_TEST_A 0xE2
|
||||||
@@ -102,7 +101,8 @@
|
|||||||
// -- Request
|
// -- Request
|
||||||
#define WD_EN_CMD 0x02
|
#define WD_EN_CMD 0x02
|
||||||
#define EN_CMD_ON_HIGH_POWER 0x66
|
#define EN_CMD_ON_HIGH_POWER 0x66
|
||||||
#define EN_CMD_ON_LOW_POWER 0x88
|
#define EN_CMD_ON_LOW_POWER 0x77
|
||||||
|
#define EN_CMD_SILENT 0x88
|
||||||
|
|
||||||
#define WD_MODE_CMD 0x03
|
#define WD_MODE_CMD 0x03
|
||||||
#define MODE_CMD_HEAD 0x11
|
#define MODE_CMD_HEAD 0x11
|
||||||
@@ -160,10 +160,12 @@
|
|||||||
// -- Response
|
// -- Response
|
||||||
#define WD_FLJ_TIME_STAMP 0x02
|
#define WD_FLJ_TIME_STAMP 0x02
|
||||||
#define WD_FLJ_TIME_STAMP_LEN 8
|
#define WD_FLJ_TIME_STAMP_LEN 8
|
||||||
#define WD_FLJ_LINK_LOG 0x0A
|
#define WD_FLJ_SYSBUS_LOG 0x0A
|
||||||
|
#define WD_FLJ_SYSBUS_LOG_LEN 14
|
||||||
|
#define WD_FLJ_LINK_LOG 0x18
|
||||||
#define WD_FLJ_LINK_LOG_LEN 64
|
#define WD_FLJ_LINK_LOG_LEN 64
|
||||||
#define WD_FLJ_PHY_LOG 0x4A
|
#define WD_FLJ_PHY_LOG 0x58
|
||||||
#define WD_FLJ_PHY_LOG_LEN 71
|
#define WD_FLJ_PHY_LOG_LEN 57
|
||||||
#define WD_FLJ_HARDWARE_ST 0x91
|
#define WD_FLJ_HARDWARE_ST 0x91
|
||||||
#define WD_FLJ_HARDWARE_ST_LEN 13
|
#define WD_FLJ_HARDWARE_ST_LEN 13
|
||||||
|
|
||||||
@@ -177,20 +179,26 @@
|
|||||||
// -- Response
|
// -- Response
|
||||||
#define WD_LJ_TIME_STAMP 0x02
|
#define WD_LJ_TIME_STAMP 0x02
|
||||||
#define WD_LJ_TIME_STAMP_LEN 8
|
#define WD_LJ_TIME_STAMP_LEN 8
|
||||||
#define WD_LJ_LINK_LOG 0x0A
|
#define WD_LJ_SYSBUS_LOG 0x0A
|
||||||
|
#define WD_LJ_SYSBUS_LOG_LEN 14
|
||||||
|
#define WD_LJ_LINK_LOG 0x18
|
||||||
#define WD_LJ_LINK_LOG_LEN 64
|
#define WD_LJ_LINK_LOG_LEN 64
|
||||||
#define WD_LJ_PHY_LOG 0x4A
|
#define WD_LJ_PHY_LOG 0x58
|
||||||
#define WD_LJ_PHY_LOG_LEN 71
|
#define WD_LJ_PHY_LOG_LEN 57
|
||||||
#define WD_LJ_HARDWARE_ST 0x91
|
#define WD_LJ_HARDWARE_ST 0x91
|
||||||
#define WD_LJ_HARDWARE_ST_LEN 13
|
#define WD_LJ_HARDWARE_ST_LEN 13
|
||||||
|
|
||||||
#define LJ_RM_TEST_RESP_LEN 158
|
#define LJ_RM_TEST_RESP_LEN 158
|
||||||
|
|
||||||
|
|
||||||
// My Production Type
|
// My Production Type
|
||||||
#define MY_PRD_ID PRD_DL_K
|
#define MY_PRD_ID PRD_DL_K
|
||||||
|
|
||||||
/************************** Function Prototypes ******************************/
|
/************************** Function Prototypes ******************************/
|
||||||
|
static int32_t SystemBus_GenSelfTestRsp(SYSBUS *instPtr);
|
||||||
|
static int32_t SystemBus_SystemConfig(SYSBUS *instPtr, uint8_t *msg);
|
||||||
|
static int32_t SystemBus_Echo(SYSBUS *instPtr, SYSBUS_UART_FRAME *frame);
|
||||||
|
static int32_t SystemBus_GenPollRsp(SYSBUS *instPtr, uint8_t *msg);
|
||||||
|
static int32_t SystemBus_GenRemoteTestRsp(SYSBUS *instPtr, uint8_t *msg);
|
||||||
/**************************** Type Definitions *******************************/
|
/**************************** Type Definitions *******************************/
|
||||||
/************************** Variable Definitions *****************************/
|
/************************** Variable Definitions *****************************/
|
||||||
// TODO: better approach?
|
// TODO: better approach?
|
||||||
@@ -199,13 +207,13 @@
|
|||||||
extern L2_INST *linkInstPtr;
|
extern L2_INST *linkInstPtr;
|
||||||
extern L2_CONFIG linkConfig;
|
extern L2_CONFIG linkConfig;
|
||||||
|
|
||||||
inline bool SystemBus_IsReqPendding(SYSBUS *instPtr)
|
inline bool SystemBus_IsReqPending(SYSBUS *instPtr)
|
||||||
{
|
{
|
||||||
ASSERT(instPtr != NULL);
|
ASSERT(instPtr != NULL);
|
||||||
return (!isCircQueueEmpty(instPtr->rxQueue));
|
return (!isCircQueueEmpty(instPtr->rxQueue));
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool SystemBus_IsRsqPendding(SYSBUS *instPtr)
|
inline bool SystemBus_IsRsqPending(SYSBUS *instPtr)
|
||||||
{
|
{
|
||||||
ASSERT(instPtr != NULL);
|
ASSERT(instPtr != NULL);
|
||||||
return (!isCircQueueEmpty(instPtr->txQueue));
|
return (!isCircQueueEmpty(instPtr->txQueue));
|
||||||
@@ -222,6 +230,271 @@ inline bool SystemBus_IsRxBusy(SYSBUS *instPtr)
|
|||||||
return SysbusUart_IsRxBusy(instPtr->uartInst);
|
return SysbusUart_IsRxBusy(instPtr->uartInst);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Generate System Bus SelfTest response.
|
||||||
|
*/
|
||||||
|
static int32_t SystemBus_GenSelfTestRsp(SYSBUS *instPtr)
|
||||||
|
{
|
||||||
|
ASSERT(instPtr != NULL);
|
||||||
|
SYSBUS_UART_FRAME *sysbusRsp = malloc(sizeof(SYSBUS_UART_FRAME));
|
||||||
|
if (sysbusRsp == NULL)
|
||||||
|
{
|
||||||
|
DBG_ERROR("Failed to allocate memory for SELF TEST Response!\n");
|
||||||
|
return ENOMEM;
|
||||||
|
}
|
||||||
|
HWSTATE *hwStatsPtr = &(instPtr->hwState);
|
||||||
|
sysbusRsp->len = ST_RSP_LEN;
|
||||||
|
memset(sysbusRsp->data, 0x00, ST_RSP_LEN);
|
||||||
|
sysbusRsp->data[WD_CMD] = CMD_SELF_TEST;
|
||||||
|
sysbusRsp->data[WD_PRD] = MY_PRD_ID;
|
||||||
|
SysMonitor_GetHardwareStatus(hwStatsPtr);
|
||||||
|
if (L2_isStarted(linkInstPtr))
|
||||||
|
{
|
||||||
|
sysbusRsp->data[WD_ST_RET] = (hwStatsPtr->isSpOk && hwStatsPtr->isAntOk) ? ST_RET_OK : ST_RET_ERROR;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sysbusRsp->data[WD_ST_RET] = (hwStatsPtr->isSpOk) ? ST_RET_OK : ST_RET_ERROR;
|
||||||
|
}
|
||||||
|
// apply status and omit 2 bytes of overhead.
|
||||||
|
memcpy(sysbusRsp->data + WD_SP_FPGA_VOLT, &(hwStatsPtr->spFpgaVolt), ST_RET_INFO_LEN);
|
||||||
|
|
||||||
|
if (CircQueuePush(instPtr->txQueue, (void *)sysbusRsp) == false)
|
||||||
|
{
|
||||||
|
free(sysbusRsp);
|
||||||
|
DBG_ERROR("SystemBus::TX Queue overflowed!\n");
|
||||||
|
return EQUEUE;
|
||||||
|
}
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Apply system configuration
|
||||||
|
*/
|
||||||
|
static int32_t SystemBus_SystemConfig(SYSBUS *instPtr, uint8_t *msg)
|
||||||
|
{
|
||||||
|
ASSERT(instPtr != NULL);
|
||||||
|
ASSERT(msg != NULL);
|
||||||
|
PHY_INST *phyRef = linkInstPtr->config.phyInstPtr;
|
||||||
|
TMC_INST *tmcRef = linkInstPtr->config.tmcInstPtr;
|
||||||
|
bool reconfig = false;
|
||||||
|
|
||||||
|
if (msg[WD_MODE_CMD] == MODE_CMD_HEAD)
|
||||||
|
{
|
||||||
|
// head node config
|
||||||
|
reconfig = (L2_NODE_HEAD != L2_GetNodeType(linkInstPtr));
|
||||||
|
linkConfig.myType = L2_NODE_HEAD;
|
||||||
|
linkConfig.myId = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (msg[WD_MODE_CMD] == MODE_CMD_MEMBER)
|
||||||
|
{
|
||||||
|
// member node config
|
||||||
|
reconfig = (L2_NODE_MEMBER != L2_GetNodeType(linkInstPtr));
|
||||||
|
linkConfig.myType = L2_NODE_MEMBER;
|
||||||
|
linkConfig.myId = 2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Ignore current command
|
||||||
|
DBG_ERROR("Unexpected config command 0x%02X:0x%02X",
|
||||||
|
WD_MODE_CMD, msg[WD_MODE_CMD]);
|
||||||
|
return EPARAM;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (msg[WD_EN_CMD] == EN_CMD_ON_HIGH_POWER)
|
||||||
|
{
|
||||||
|
// full power config
|
||||||
|
Phy_AntConfigMode(phyRef, PHY_ANT_MODE_POWER_FULL);
|
||||||
|
if (reconfig || !L2_isStarted(linkInstPtr))
|
||||||
|
{
|
||||||
|
Linklayer_Reconfig(linkInstPtr, &linkConfig);
|
||||||
|
}
|
||||||
|
Linklayer_Start(linkInstPtr);
|
||||||
|
}
|
||||||
|
else if (msg[WD_EN_CMD] == EN_CMD_ON_LOW_POWER)
|
||||||
|
{
|
||||||
|
// low power config
|
||||||
|
Phy_AntConfigMode(phyRef, PHY_ANT_MODE_POWER_LOW);
|
||||||
|
if (reconfig || !L2_isStarted(linkInstPtr))
|
||||||
|
{
|
||||||
|
Linklayer_Reconfig(linkInstPtr, &linkConfig);
|
||||||
|
}
|
||||||
|
Linklayer_Start(linkInstPtr);
|
||||||
|
}
|
||||||
|
else if (msg[WD_EN_CMD] == EN_CMD_SILENT)
|
||||||
|
{
|
||||||
|
// silence config
|
||||||
|
// TODO: better approach?
|
||||||
|
Linklayer_Halt(linkInstPtr);
|
||||||
|
Phy_AntConfigMode(phyRef, PHY_ANT_MODE_STANDBY);
|
||||||
|
TIME_WORD pullTime = {0, 0};
|
||||||
|
pullTime.int_part = TimeCtrl_GetIntCnt(tmcRef) + 1;
|
||||||
|
if (Phy_SetTimeWord(phyRef, &pullTime, PHY_TIME_WORD_POLL) != SUCCESS)
|
||||||
|
{
|
||||||
|
DBG_ERROR("Physical set pull time failed.\n");
|
||||||
|
}
|
||||||
|
Phy_SetupNextSlot(phyRef, PHY_TOR_RX, L1_10KBPS_10MS_FRAME, NULL);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Ignore current command
|
||||||
|
DBG_ERROR("Unexpected config command 0x%02X:0x%02X",
|
||||||
|
WD_EN_CMD, msg[WD_EN_CMD]);
|
||||||
|
return EIGNORE;
|
||||||
|
}
|
||||||
|
instPtr->sysbusLog.lastConfig[0] = msg[WD_MODE_CMD];
|
||||||
|
instPtr->sysbusLog.lastConfig[1] = msg[WD_EN_CMD];
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Echo System Bus frame
|
||||||
|
*/
|
||||||
|
static int32_t SystemBus_Echo(SYSBUS *instPtr, SYSBUS_UART_FRAME *frame)
|
||||||
|
{
|
||||||
|
ASSERT(instPtr != NULL);
|
||||||
|
ASSERT(frame != NULL);
|
||||||
|
SYSBUS_UART_FRAME *sysbusRsp = malloc(sizeof(SYSBUS_UART_FRAME));
|
||||||
|
if (sysbusRsp == NULL)
|
||||||
|
{
|
||||||
|
DBG_ERROR("Failed to allocate memory for DATA TEST A Response!\n");
|
||||||
|
return ENOMEM;
|
||||||
|
}
|
||||||
|
sysbusRsp->len = frame->len;
|
||||||
|
memcpy(sysbusRsp->data, frame->data, sysbusRsp->len);
|
||||||
|
if (CircQueuePush(instPtr->txQueue, (void *)sysbusRsp) == false)
|
||||||
|
{
|
||||||
|
free(sysbusRsp);
|
||||||
|
DBG_ERROR("SystemBus::TX Queue overflowed!\n");
|
||||||
|
return EQUEUE;
|
||||||
|
}
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Generate System Bus poll call command response
|
||||||
|
*/
|
||||||
|
static int32_t SystemBus_GenPollRsp(SYSBUS *instPtr, uint8_t *msg)
|
||||||
|
{
|
||||||
|
ASSERT(instPtr != NULL);
|
||||||
|
ASSERT(msg != NULL);
|
||||||
|
size_t dataLen;
|
||||||
|
uint8_t *payload;
|
||||||
|
SYSBUS_UART_FRAME *sysbusRsp = malloc(sizeof(SYSBUS_UART_FRAME));
|
||||||
|
if (sysbusRsp == NULL)
|
||||||
|
{
|
||||||
|
DBG_ERROR("Failed to allocate memory for FLJ POLL Response!\n");
|
||||||
|
return ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (msg[WD_CMD] == CMD_FLJ_POLL)
|
||||||
|
{
|
||||||
|
sysbusRsp->len = FLJ_POLL_RESP_LEN;
|
||||||
|
sysbusRsp->data[WD_CMD] = CMD_FLJ_POLL;
|
||||||
|
sysbusRsp->data[WD_PRD] = MY_PRD_ID;
|
||||||
|
dataLen = PAYLOAD_LEN_FLJ_RX;
|
||||||
|
payload = sysbusRsp->data + FLJ_DATA_OFFSET;
|
||||||
|
}
|
||||||
|
else if (msg[WD_CMD] == CMD_LJ_POLL)
|
||||||
|
{
|
||||||
|
sysbusRsp->len = LJ_POLL_RESP_LEN;
|
||||||
|
sysbusRsp->data[WD_CMD] = CMD_LJ_POLL;
|
||||||
|
sysbusRsp->data[WD_PRD] = MY_PRD_ID;
|
||||||
|
dataLen = PAYLOAD_LEN_LJ_RX;
|
||||||
|
payload = sysbusRsp->data + LJ_DATA_OFFSET;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DBG_ERROR("Unexpected command 0x%02X.\n", msg[WD_CMD]);
|
||||||
|
free(sysbusRsp);
|
||||||
|
return EUNEXP;
|
||||||
|
}
|
||||||
|
uint32_t dataId;
|
||||||
|
SysMonitor_GetRecvPayload(payload, &dataId, dataLen); // omit control info
|
||||||
|
if (dataId == DATA_ID_NONE)
|
||||||
|
{
|
||||||
|
free(sysbusRsp);
|
||||||
|
DBG_WARNING("SystemBus::no RX data!\n");
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
if (CircQueuePush(instPtr->txQueue, (void *)sysbusRsp) == false)
|
||||||
|
{
|
||||||
|
free(sysbusRsp);
|
||||||
|
DBG_WARNING("SystemBus::TX Queue overflowed!\n");
|
||||||
|
return EQUEUE;
|
||||||
|
}
|
||||||
|
instPtr->sysbusLog.pollCnt++;
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Generate System Bus remote test command response
|
||||||
|
*/
|
||||||
|
static int32_t SystemBus_GenRemoteTestRsp(SYSBUS *instPtr, uint8_t *msg)
|
||||||
|
{
|
||||||
|
ASSERT(instPtr != NULL);
|
||||||
|
ASSERT(msg != NULL);
|
||||||
|
SYSBUS_UART_FRAME *sysbusRsp = malloc(sizeof(SYSBUS_UART_FRAME));
|
||||||
|
if (sysbusRsp == NULL)
|
||||||
|
{
|
||||||
|
DBG_ERROR("Failed to allocate memory for LJ REMOTE TEST Response!\n");
|
||||||
|
return ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
TIME_WORD tmWord;
|
||||||
|
uint64_t time;
|
||||||
|
TimeCtrl_GetCurrentTime(linkInstPtr->config.tmcInstPtr, &tmWord);
|
||||||
|
time = (uint64_t)tmWord.int_part * TIME_FRAC_MAX + tmWord.frac_part;
|
||||||
|
|
||||||
|
if (msg[WD_CMD] == CMD_FLJ_RM_TEST)
|
||||||
|
{
|
||||||
|
sysbusRsp->len = FLJ_RM_TEST_RESP_LEN;
|
||||||
|
memset(sysbusRsp->data, 0x00, FLJ_RM_TEST_RESP_LEN);
|
||||||
|
sysbusRsp->data[WD_CMD] = CMD_FLJ_RM_TEST;
|
||||||
|
sysbusRsp->data[WD_PRD] = MY_PRD_ID;
|
||||||
|
|
||||||
|
memcpy(sysbusRsp->data + WD_FLJ_TIME_STAMP, &time, WD_FLJ_TIME_STAMP_LEN);
|
||||||
|
SysMonitor_GetLinklayerLog(&(instPtr->linkLog));
|
||||||
|
SysMonitor_GetPhysicalLayerLog(&(instPtr->phyLog));
|
||||||
|
SysMonitor_GetHardwareStatus(&(instPtr->hwState));
|
||||||
|
memcpy(sysbusRsp->data + WD_FLJ_SYSBUS_LOG, &(instPtr->sysbusLog), WD_FLJ_SYSBUS_LOG_LEN);
|
||||||
|
memcpy(sysbusRsp->data + WD_FLJ_LINK_LOG, &(instPtr->linkLog), WD_FLJ_LINK_LOG_LEN);
|
||||||
|
memcpy(sysbusRsp->data + WD_FLJ_PHY_LOG, &(instPtr->phyLog), WD_FLJ_PHY_LOG_LEN);
|
||||||
|
memcpy(sysbusRsp->data + WD_FLJ_HARDWARE_ST, &(instPtr->hwState.spFpgaVolt), WD_FLJ_HARDWARE_ST_LEN);
|
||||||
|
}
|
||||||
|
else if (msg[WD_CMD] == CMD_LJ_RM_TEST)
|
||||||
|
{
|
||||||
|
sysbusRsp->len = LJ_RM_TEST_RESP_LEN;
|
||||||
|
sysbusRsp->data[WD_CMD] = CMD_LJ_RM_TEST;
|
||||||
|
sysbusRsp->data[WD_PRD] = MY_PRD_ID;
|
||||||
|
|
||||||
|
memcpy(sysbusRsp->data + WD_LJ_TIME_STAMP, &time, WD_LJ_TIME_STAMP_LEN);
|
||||||
|
SysMonitor_GetLinklayerLog(&(instPtr->linkLog));
|
||||||
|
SysMonitor_GetPhysicalLayerLog(&(instPtr->phyLog));
|
||||||
|
SysMonitor_GetHardwareStatus(&(instPtr->hwState));
|
||||||
|
memcpy(sysbusRsp->data + WD_LJ_SYSBUS_LOG, &(instPtr->sysbusLog), WD_LJ_SYSBUS_LOG_LEN);
|
||||||
|
memcpy(sysbusRsp->data + WD_LJ_LINK_LOG, &(instPtr->linkLog), WD_LJ_LINK_LOG_LEN);
|
||||||
|
memcpy(sysbusRsp->data + WD_LJ_PHY_LOG, &(instPtr->phyLog), WD_LJ_PHY_LOG_LEN);
|
||||||
|
memcpy(sysbusRsp->data + WD_LJ_HARDWARE_ST, &(instPtr->hwState.spFpgaVolt), WD_LJ_HARDWARE_ST_LEN);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DBG_ERROR("Unexpected command 0x%02X.\n", msg[WD_CMD]);
|
||||||
|
free(sysbusRsp);
|
||||||
|
return EUNEXP;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CircQueuePush(instPtr->txQueue, (void *)sysbusRsp) == false)
|
||||||
|
{
|
||||||
|
free(sysbusRsp);
|
||||||
|
DBG_WARNING("SystemBus::TX Queue overflowed!\n");
|
||||||
|
return EQUEUE;
|
||||||
|
}
|
||||||
|
instPtr->sysbusLog.remoteCnt++;
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/**
|
/**
|
||||||
* @brief Initialize System Bus instance.
|
* @brief Initialize System Bus instance.
|
||||||
@@ -247,7 +520,10 @@ int32_t SystemBus_Init(SYSBUS **instPtr, SYSBUS_CONFIG *config)
|
|||||||
(*instPtr)->txQueue = NULL;
|
(*instPtr)->txQueue = NULL;
|
||||||
(*instPtr)->uartInst = NULL;
|
(*instPtr)->uartInst = NULL;
|
||||||
memcpy(&((*instPtr)->config), config, sizeof(SYSBUS_CONFIG));
|
memcpy(&((*instPtr)->config), config, sizeof(SYSBUS_CONFIG));
|
||||||
memset(&((*instPtr)->sysLog), 0x00, sizeof(SYSLOG));
|
memset(&((*instPtr)->sysbusLog), 0x00, sizeof(SYSBUSLOG));
|
||||||
|
memset(&((*instPtr)->linkLog), 0x00, sizeof(LINKLOG));
|
||||||
|
memset(&((*instPtr)->phyLog), 0x00, sizeof(PHYLOG));
|
||||||
|
memset(&((*instPtr)->hwState), 0x00, sizeof(HWSTATE));
|
||||||
uartConfig.baseAddr = config->baseAddr;
|
uartConfig.baseAddr = config->baseAddr;
|
||||||
Status = SysbusUart_Init(&((*instPtr)->uartInst), &uartConfig);
|
Status = SysbusUart_Init(&((*instPtr)->uartInst), &uartConfig);
|
||||||
if (Status != SUCCESS)
|
if (Status != SUCCESS)
|
||||||
@@ -291,339 +567,106 @@ int32_t SystemBus_HandleCmd(SYSBUS *instPtr)
|
|||||||
{
|
{
|
||||||
ASSERT(instPtr != NULL);
|
ASSERT(instPtr != NULL);
|
||||||
int32_t Status;
|
int32_t Status;
|
||||||
SYSBUS_UART_FRAME *sysbusReq, *sysbusRsp;
|
SYSBUS_UART_FRAME *sysbusReq;
|
||||||
uint8_t *data;
|
uint8_t *msg;
|
||||||
if (CircQueuePop(instPtr->rxQueue, (void **)(&sysbusReq)) == false)
|
if (CircQueuePop(instPtr->rxQueue, (void **)(&sysbusReq)) == false)
|
||||||
{
|
{
|
||||||
DBG_WARNING("SystemBus::Nothing to be handled.\n");
|
DBG_WARNING("SystemBus::Nothing to be handled.\n");
|
||||||
return EIGNORE;
|
return EIGNORE;
|
||||||
}
|
}
|
||||||
data = sysbusReq->data;
|
msg = sysbusReq->data;
|
||||||
if (data[WD_PRD] != MY_PRD_ID && data[WD_PRD] != PRD_ALL)
|
if (msg[WD_PRD] != MY_PRD_ID && msg[WD_PRD] != PRD_ALL)
|
||||||
{
|
{
|
||||||
DBG_WARNING("SystemBus::Production code mismatch!\n");
|
DBG_WARNING("SystemBus::Production code mismatch!\n");
|
||||||
return EIGNORE;
|
return EIGNORE;
|
||||||
}
|
}
|
||||||
switch (data[WD_CMD])
|
|
||||||
|
switch (msg[WD_CMD])
|
||||||
{
|
{
|
||||||
case CMD_SELF_TEST:
|
case CMD_SELF_TEST:
|
||||||
{
|
{
|
||||||
HWSTATE *hwStatsPtr = &(instPtr->sysLog.hwState);
|
Status = SystemBus_GenSelfTestRsp(instPtr);
|
||||||
sysbusRsp = malloc(sizeof(SYSBUS_UART_FRAME));
|
|
||||||
if (sysbusRsp == NULL) {
|
|
||||||
DBG_ERROR("Failed to allocate memory for SELF TEST Response!\n");
|
|
||||||
Status = ENOMEM;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
sysbusRsp->len = ST_RSP_LEN;
|
|
||||||
memset(sysbusRsp->data, 0x00, ST_RSP_LEN);
|
|
||||||
sysbusRsp->data[WD_CMD] = CMD_SELF_TEST;
|
|
||||||
sysbusRsp->data[WD_PRD] = MY_PRD_ID;
|
|
||||||
SysMonitor_GetHardwareStatus(hwStatsPtr);
|
|
||||||
if (linkInstPtr->isEnable == false)
|
|
||||||
{
|
|
||||||
sysbusRsp->data[WD_ST_RET] = (hwStatsPtr->isSpOk) ? ST_RET_OK : ST_RET_ERROR;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sysbusRsp->data[WD_ST_RET] = (hwStatsPtr->isSpOk && hwStatsPtr->isAntOk) ? ST_RET_OK : ST_RET_ERROR;
|
|
||||||
}
|
|
||||||
// apply status and omit 2 bytes of overhead.
|
|
||||||
memcpy(sysbusRsp->data + WD_SP_PS_VOLT, &(hwStatsPtr->spPsVolt), ST_RET_INFO_LEN);
|
|
||||||
|
|
||||||
if (CircQueuePush(instPtr->txQueue, (void *)sysbusRsp) == false)
|
|
||||||
{
|
|
||||||
free(sysbusRsp);
|
|
||||||
DBG_ERROR("SystemBus::TX Queue overflowed!\n");
|
|
||||||
Status = EQUEUE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
Status = SUCCESS;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CMD_DATA_TEST_A:
|
case CMD_DATA_TEST_A:
|
||||||
{
|
|
||||||
sysbusRsp = malloc(sizeof(SYSBUS_UART_FRAME));
|
|
||||||
if (sysbusRsp == NULL) {
|
|
||||||
DBG_ERROR("Failed to allocate memory for DATA TEST A Response!\n");
|
|
||||||
Status = ENOMEM;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
sysbusRsp->len = DATA_TEST_RSP_A_LEN;
|
|
||||||
memcpy(sysbusRsp->data, sysbusReq->data, DATA_TEST_RSP_A_LEN);
|
|
||||||
if (CircQueuePush(instPtr->txQueue, (void *)sysbusRsp) == false)
|
|
||||||
{
|
|
||||||
free(sysbusRsp);
|
|
||||||
DBG_ERROR("SystemBus::TX Queue overflowed!\n");
|
|
||||||
Status = EQUEUE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
Status = SUCCESS;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case CMD_DATA_TEST_B:
|
case CMD_DATA_TEST_B:
|
||||||
{
|
{
|
||||||
sysbusRsp = malloc(sizeof(SYSBUS_UART_FRAME));
|
Status = SystemBus_Echo(instPtr, sysbusReq);
|
||||||
if (sysbusRsp == NULL) {
|
|
||||||
DBG_ERROR("Failed to allocate memory for DATA TEST B Response!\n");
|
|
||||||
Status = ENOMEM;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
sysbusRsp->len = DATA_TEST_RSP_B_LEN;
|
|
||||||
memcpy(sysbusRsp->data, sysbusReq->data, DATA_TEST_RSP_B_LEN);
|
|
||||||
if (CircQueuePush(instPtr->txQueue, (void *)sysbusRsp) == false)
|
|
||||||
{
|
|
||||||
free(sysbusRsp);
|
|
||||||
DBG_ERROR("SystemBus::TX Queue overflowed!\n");
|
|
||||||
Status = EQUEUE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
Status = SUCCESS;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CMD_CONFIG:
|
case CMD_CONFIG:
|
||||||
{
|
{
|
||||||
PHY_INST *phyRef = linkInstPtr->config.phyInstPtr;
|
Status = SystemBus_SystemConfig(instPtr, msg);
|
||||||
TMC_INST *tmcRef = linkInstPtr->config.tmcInstPtr;
|
|
||||||
|
|
||||||
if (data[WD_MODE_CMD] == MODE_CMD_HEAD)
|
|
||||||
{
|
|
||||||
// omit unnecessary reconfiguration
|
|
||||||
if (L2_GetNodeType(linkInstPtr) != L2_NODE_HEAD)
|
|
||||||
{
|
|
||||||
// head node config
|
|
||||||
linkConfig.myType = L2_NODE_HEAD;
|
|
||||||
linkConfig.myId = 1;
|
|
||||||
Linklayer_Reconfig(linkInstPtr, &linkConfig);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (data[WD_MODE_CMD] == MODE_CMD_MEMBER )
|
|
||||||
{
|
|
||||||
// omit unnecessary reconfiguration
|
|
||||||
if (L2_GetNodeType(linkInstPtr) != L2_NODE_MEMBER)
|
|
||||||
{
|
|
||||||
// member node config
|
|
||||||
linkConfig.myType = L2_NODE_MEMBER;
|
|
||||||
linkConfig.myId = 2;
|
|
||||||
Linklayer_Reconfig(linkInstPtr, &linkConfig);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// FIXME: to confirm
|
|
||||||
// Halt linklayer
|
|
||||||
Linklayer_Halt(linkInstPtr);
|
|
||||||
DBG_ERROR("Unexpected config command 0x%02X:0x%02X",
|
|
||||||
WD_MODE_CMD, data[WD_MODE_CMD]);
|
|
||||||
Status = EPARAM;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(data[WD_EN_CMD] == EN_CMD_ON_HIGH_POWER)
|
|
||||||
{
|
|
||||||
// high power config
|
|
||||||
Phy_AntConfigMode(phyRef, PHY_ANT_MODE_HIGH_POWER);
|
|
||||||
}
|
|
||||||
else if(data[WD_EN_CMD] == EN_CMD_ON_LOW_POWER)
|
|
||||||
{
|
|
||||||
// low power config
|
|
||||||
Phy_AntConfigMode(phyRef, PHY_ANT_MODE_LOW_POWER);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// silence config
|
|
||||||
// FIXME: confirm
|
|
||||||
// TODO: better approach?
|
|
||||||
Linklayer_Halt(linkInstPtr);
|
|
||||||
Phy_AntConfigMode(phyRef, PHY_ANT_MODE_SILENT);
|
|
||||||
TIME_WORD pullTime = {0, 0};
|
|
||||||
pullTime.int_part = TimeCtrl_GetIntCnt(tmcRef) + 1;
|
|
||||||
Status = Phy_SetTimeWord(phyRef, &pullTime, PHY_TIME_WORD_POLL);
|
|
||||||
if (Status != SUCCESS)
|
|
||||||
{
|
|
||||||
DBG_ERROR("Physical set pull time failed, with error code: %" PRId32 ".\n", Status);
|
|
||||||
}
|
|
||||||
Phy_SetupNextSlot(phyRef, PHY_TOR_RX, L1_10KBPS_10MS_FRAME, NULL);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
Linklayer_Start(linkInstPtr);
|
|
||||||
Status = SUCCESS;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CMD_SYS_INFO:
|
case CMD_SYS_INFO:
|
||||||
{
|
{
|
||||||
SysMonitor_UpdateSysinfo((SYSINFO *)(data + SYS_INFO_OFFSET));
|
SysMonitor_UpdateSysinfo((SYSINFO *)(msg + SYS_INFO_OFFSET));
|
||||||
Status = SUCCESS;
|
Status = SUCCESS;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// TODO
|
|
||||||
case CMD_FLJ_SEND:
|
case CMD_FLJ_SEND:
|
||||||
{
|
{
|
||||||
SysMonitor_UpdateSendPayload(data + FLJ_DATA_OFFSET, PAYLOAD_LEN_FLJ_TX); // omit control info
|
SysMonitor_UpdateSendPayload(msg + FLJ_DATA_OFFSET, PAYLOAD_LEN_FLJ_TX); // omit control info
|
||||||
|
instPtr->sysbusLog.svcCnt++;
|
||||||
|
Status = SUCCESS;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CMD_LJ_SEND:
|
case CMD_LJ_SEND:
|
||||||
{
|
{
|
||||||
SysMonitor_UpdateSendPayload(data + LJ_DATA_OFFSET, PAYLOAD_LEN_LJ_TX); // omit control info
|
SysMonitor_UpdateSendPayload(msg + LJ_DATA_OFFSET, PAYLOAD_LEN_LJ_TX); // omit control info
|
||||||
|
instPtr->sysbusLog.svcCnt++;
|
||||||
|
Status = SUCCESS;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CMD_FLJ_POLL:
|
case CMD_FLJ_POLL:
|
||||||
{
|
{
|
||||||
if (data[WD_FLJ_POLL] != FLJ_POLL_CODE)
|
if (msg[WD_FLJ_POLL] != FLJ_POLL_CODE)
|
||||||
{
|
{
|
||||||
DBG_ERROR("SystemBus::Invalid roll call code!\n");
|
DBG_ERROR("SystemBus::Invalid roll call code!\n");
|
||||||
Status = EIGNORE;
|
Status = EIGNORE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
sysbusRsp = malloc(sizeof(SYSBUS_UART_FRAME));
|
Status = SystemBus_GenPollRsp(instPtr, msg);
|
||||||
if (sysbusRsp == NULL) {
|
|
||||||
DBG_ERROR("Failed to allocate memory for FLJ POLL Response!\n");
|
|
||||||
Status = ENOMEM;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
sysbusRsp->len = FLJ_POLL_RESP_LEN;
|
|
||||||
sysbusRsp->data[WD_CMD] = CMD_FLJ_POLL;
|
|
||||||
sysbusRsp->data[WD_PRD] = MY_PRD_ID;
|
|
||||||
uint32_t dataId;
|
|
||||||
SysMonitor_GetRecvPayload(sysbusRsp->data + FLJ_DATA_OFFSET, &dataId, PAYLOAD_LEN_FLJ_RX); // omit control info
|
|
||||||
if (dataId == DATA_ID_NONE)
|
|
||||||
{
|
|
||||||
free(sysbusRsp);
|
|
||||||
DBG_WARNING("SystemBus::no RX data!\n");
|
|
||||||
Status = SUCCESS;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (CircQueuePush(instPtr->txQueue, (void *)sysbusRsp) == false)
|
|
||||||
{
|
|
||||||
free(sysbusRsp);
|
|
||||||
DBG_WARNING("SystemBus::TX Queue overflowed!\n");
|
|
||||||
Status = EQUEUE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
Status = SUCCESS;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CMD_LJ_POLL:
|
case CMD_LJ_POLL:
|
||||||
{
|
{
|
||||||
if (data[WD_LJ_POLL] != LJ_POLL_CODE)
|
if (msg[WD_LJ_POLL] != LJ_POLL_CODE)
|
||||||
{
|
{
|
||||||
DBG_WARNING("SystemBus::Invalid roll call code!\n");
|
DBG_WARNING("SystemBus::Invalid roll call code!\n");
|
||||||
Status = EIGNORE;
|
Status = EIGNORE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
sysbusRsp = malloc(sizeof(SYSBUS_UART_FRAME));
|
Status = SystemBus_GenPollRsp(instPtr, msg);
|
||||||
if (sysbusRsp == NULL) {
|
|
||||||
DBG_ERROR("Failed to allocate memory for LJ POLL Response!\n");
|
|
||||||
Status = ENOMEM;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
sysbusRsp->len = LJ_POLL_RESP_LEN;
|
|
||||||
sysbusRsp->data[WD_CMD] = CMD_LJ_POLL;
|
|
||||||
sysbusRsp->data[WD_PRD] = MY_PRD_ID;
|
|
||||||
uint32_t dataId;
|
|
||||||
SysMonitor_GetRecvPayload(sysbusRsp->data + LJ_DATA_OFFSET, &dataId, PAYLOAD_LEN_LJ_RX); // omit control info
|
|
||||||
if (dataId == DATA_ID_NONE)
|
|
||||||
{
|
|
||||||
free(sysbusRsp);
|
|
||||||
DBG_WARNING("SystemBus::no RX data!\n");
|
|
||||||
Status = SUCCESS;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (CircQueuePush(instPtr->txQueue, (void *)sysbusRsp) == false)
|
|
||||||
{
|
|
||||||
free(sysbusRsp);
|
|
||||||
DBG_WARNING("SystemBus::TX Queue overflowed!\n");
|
|
||||||
Status = EQUEUE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
Status = SUCCESS;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CMD_FLJ_RM_TEST:
|
case CMD_FLJ_RM_TEST:
|
||||||
{
|
{
|
||||||
SYSLOG *sysLogPtr = &(instPtr->sysLog);
|
if (msg[WD_FLJ_RM_TEST] != FLJ_RM_TEST_CODE)
|
||||||
if (data[WD_FLJ_RM_TEST] != FLJ_RM_TEST_CODE)
|
|
||||||
{
|
{
|
||||||
DBG_WARNING("SystemBus::Invalid remote test code!\n");
|
DBG_WARNING("SystemBus::Invalid remote test code!\n");
|
||||||
Status = EIGNORE;
|
Status = EIGNORE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
sysbusRsp = malloc(sizeof(SYSBUS_UART_FRAME));
|
Status = SystemBus_GenRemoteTestRsp(instPtr, msg);
|
||||||
if (sysbusRsp == NULL) {
|
|
||||||
DBG_ERROR("Failed to allocate memory for FLJ REMOTE TEST Response!\n");
|
|
||||||
Status = ENOMEM;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
sysbusRsp = malloc(sizeof(SYSBUS_UART_FRAME));
|
|
||||||
sysbusRsp->len = FLJ_RM_TEST_RESP_LEN;
|
|
||||||
memset(sysbusRsp->data, 0x00, FLJ_RM_TEST_RESP_LEN);
|
|
||||||
sysbusRsp->data[WD_CMD] = CMD_FLJ_RM_TEST;
|
|
||||||
sysbusRsp->data[WD_PRD] = MY_PRD_ID;
|
|
||||||
|
|
||||||
TIME_WORD tmWord;
|
|
||||||
uint64_t time;
|
|
||||||
TimeCtrl_GetCurrentTime(linkInstPtr->config.tmcInstPtr, &tmWord);
|
|
||||||
time = tmWord.int_part * TIME_FRAC_MAX + tmWord.frac_part;
|
|
||||||
memcpy(sysbusRsp->data + WD_FLJ_TIME_STAMP, &time, WD_FLJ_TIME_STAMP_LEN);
|
|
||||||
SysMonitor_GetSyslog(sysLogPtr);
|
|
||||||
memcpy(sysbusRsp->data + WD_FLJ_LINK_LOG, &(sysLogPtr->linkLog), WD_FLJ_LINK_LOG_LEN);
|
|
||||||
memcpy(sysbusRsp->data + WD_FLJ_PHY_LOG, &(sysLogPtr->phyLog), WD_FLJ_PHY_LOG_LEN);
|
|
||||||
memcpy(sysbusRsp->data + WD_FLJ_HARDWARE_ST, &(sysLogPtr->hwState.spPsVolt), WD_FLJ_HARDWARE_ST_LEN);
|
|
||||||
|
|
||||||
if (CircQueuePush(instPtr->txQueue, (void *)sysbusRsp) == false){
|
|
||||||
free(sysbusRsp);
|
|
||||||
DBG_WARNING("SystemBus::TX Queue overflowed!\n");
|
|
||||||
Status = EQUEUE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
Status = SUCCESS;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CMD_LJ_RM_TEST:
|
case CMD_LJ_RM_TEST:
|
||||||
{
|
{
|
||||||
SYSLOG *sysLogPtr = &(instPtr->sysLog);
|
if (msg[WD_LJ_RM_TEST] != LJ_RM_TEST_CODE)
|
||||||
if (data[WD_LJ_RM_TEST] != LJ_RM_TEST_CODE)
|
|
||||||
{
|
{
|
||||||
DBG_WARNING("SystemBus::Invalid remote test code!\n");
|
DBG_WARNING("SystemBus::Invalid remote test code!\n");
|
||||||
Status = EIGNORE;
|
Status = EIGNORE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
sysbusRsp = malloc(sizeof(SYSBUS_UART_FRAME));
|
Status = SystemBus_GenRemoteTestRsp(instPtr, msg);
|
||||||
if (sysbusRsp == NULL) {
|
|
||||||
DBG_ERROR("Failed to allocate memory for LJ REMOTE TEST Response!\n");
|
|
||||||
Status = ENOMEM;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
sysbusRsp = malloc(sizeof(SYSBUS_UART_FRAME));
|
|
||||||
sysbusRsp->len = LJ_RM_TEST_RESP_LEN;
|
|
||||||
memset(sysbusRsp->data, 0x00, LJ_RM_TEST_RESP_LEN);
|
|
||||||
sysbusRsp->data[WD_CMD] = CMD_LJ_RM_TEST;
|
|
||||||
sysbusRsp->data[WD_PRD] = MY_PRD_ID;
|
|
||||||
|
|
||||||
TIME_WORD tmWord;
|
|
||||||
uint64_t time;
|
|
||||||
TimeCtrl_GetCurrentTime(linkInstPtr->config.tmcInstPtr, &tmWord);
|
|
||||||
time = tmWord.int_part * TIME_FRAC_MAX + tmWord.frac_part;
|
|
||||||
memcpy(sysbusRsp->data + WD_LJ_TIME_STAMP, &time, WD_LJ_TIME_STAMP_LEN);
|
|
||||||
SysMonitor_GetSyslog(sysLogPtr);
|
|
||||||
memcpy(sysbusRsp->data + WD_LJ_LINK_LOG, &(sysLogPtr->linkLog), WD_LJ_LINK_LOG_LEN);
|
|
||||||
memcpy(sysbusRsp->data + WD_LJ_PHY_LOG, &(sysLogPtr->phyLog), WD_LJ_PHY_LOG_LEN);
|
|
||||||
memcpy(sysbusRsp->data + WD_LJ_HARDWARE_ST, &(sysLogPtr->hwState.spPsVolt), WD_LJ_HARDWARE_ST_LEN);
|
|
||||||
|
|
||||||
if (CircQueuePush(instPtr->txQueue, (void *)sysbusRsp) == false){
|
|
||||||
free(sysbusRsp);
|
|
||||||
DBG_WARNING("SystemBus::TX Queue overflowed!\n");
|
|
||||||
Status = EQUEUE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
Status = SUCCESS;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
DBG_ERROR("SystemBus::Unknown command code!\n");
|
DBG_ERROR("SystemBus::Unknown command code!\n");
|
||||||
|
Status = FAILURE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -685,10 +728,9 @@ int32_t SystemBus_TxIntrHandler(SYSBUS *instPtr)
|
|||||||
int32_t SystemBus_RxIntrHandler(SYSBUS *instPtr)
|
int32_t SystemBus_RxIntrHandler(SYSBUS *instPtr)
|
||||||
{
|
{
|
||||||
ASSERT(instPtr != NULL);
|
ASSERT(instPtr != NULL);
|
||||||
int32_t Status;
|
|
||||||
SYSBUS_UART_FRAME *sysbusReq;
|
|
||||||
instPtr->isRxDone = true; // whether reception successes or not, receiving procedure ended.
|
instPtr->isRxDone = true; // whether reception successes or not, receiving procedure ended.
|
||||||
sysbusReq = malloc(sizeof(SYSBUS_UART_FRAME));
|
int32_t Status;
|
||||||
|
SYSBUS_UART_FRAME *sysbusReq = malloc(sizeof(SYSBUS_UART_FRAME));
|
||||||
if (sysbusReq == NULL)
|
if (sysbusReq == NULL)
|
||||||
{
|
{
|
||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
|
|||||||
@@ -36,7 +36,10 @@ typedef struct
|
|||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
SYSBUS_CONFIG config;
|
SYSBUS_CONFIG config;
|
||||||
SYSLOG sysLog;
|
SYSBUSLOG sysbusLog; // systembus log
|
||||||
|
LINKLOG linkLog; // Link layer log
|
||||||
|
PHYLOG phyLog; // Physical layer log
|
||||||
|
HWSTATE hwState; // Hardware status
|
||||||
SYSBUS_UART *uartInst;
|
SYSBUS_UART *uartInst;
|
||||||
CIRC_QUEUE *txQueue;
|
CIRC_QUEUE *txQueue;
|
||||||
CIRC_QUEUE *rxQueue;
|
CIRC_QUEUE *rxQueue;
|
||||||
@@ -54,8 +57,8 @@ int32_t SystemBus_MakeResp(SYSBUS *instPtr);
|
|||||||
int32_t SystemBus_TxIntrHandler(SYSBUS *instPtr);
|
int32_t SystemBus_TxIntrHandler(SYSBUS *instPtr);
|
||||||
int32_t SystemBus_RxIntrHandler(SYSBUS *instPtr);
|
int32_t SystemBus_RxIntrHandler(SYSBUS *instPtr);
|
||||||
|
|
||||||
bool SystemBus_IsReqPendding(SYSBUS *instPtr);
|
bool SystemBus_IsReqPending(SYSBUS *instPtr);
|
||||||
bool SystemBus_IsRsqPendding(SYSBUS *instPtr);
|
bool SystemBus_IsRsqPending(SYSBUS *instPtr);
|
||||||
|
|
||||||
bool SystemBus_IsTxBusy(SYSBUS *instPtr);
|
bool SystemBus_IsTxBusy(SYSBUS *instPtr);
|
||||||
bool SystemBus_IsRxBusy(SYSBUS *instPtr);
|
bool SystemBus_IsRxBusy(SYSBUS *instPtr);
|
||||||
|
|||||||
@@ -30,9 +30,9 @@
|
|||||||
#define UART_STATUS_TX_BUSY 0x00010000
|
#define UART_STATUS_TX_BUSY 0x00010000
|
||||||
#define UART_STATUS_RX_BUSY 0x01000000
|
#define UART_STATUS_RX_BUSY 0x01000000
|
||||||
// Data buffer register
|
// Data buffer register
|
||||||
#define UART_TXBUFF_LOW 1024
|
#define UART_TXBUFF_OFFSET 1024
|
||||||
#define UART_TXBUFF_MAX 1024
|
#define UART_TXBUFF_MAX 1024
|
||||||
#define UART_RXBUFF_LOW 2048
|
#define UART_RXBUFF_OFFSET 2048
|
||||||
#define UART_RXBUFF_MAX 1024
|
#define UART_RXBUFF_MAX 1024
|
||||||
|
|
||||||
// Frame Data offsets
|
// Frame Data offsets
|
||||||
@@ -133,7 +133,7 @@ int SysbusUart_Send(SYSBUS_UART *instPtr, SYSBUS_UART_FRAME *frame)
|
|||||||
free(sendBuff);
|
free(sendBuff);
|
||||||
return FAILURE;
|
return FAILURE;
|
||||||
}
|
}
|
||||||
memcpy((void *)(instPtr->config.baseAddr + UART_TXBUFF_LOW), sendBuff, (sendLen + sizeof(uint32_t) - 1) / sizeof(uint32_t) * sizeof(uint32_t));
|
memcpy((void *)(instPtr->config.baseAddr + UART_TXBUFF_OFFSET), sendBuff, (sendLen + sizeof(uint32_t) - 1) / sizeof(uint32_t) * sizeof(uint32_t));
|
||||||
free(sendBuff);
|
free(sendBuff);
|
||||||
// Start Sending
|
// Start Sending
|
||||||
SYSTEMBUS_UART_mWriteReg(instPtr->config.baseAddr, UART_SEND_CMD, sendLen);
|
SYSTEMBUS_UART_mWriteReg(instPtr->config.baseAddr, UART_SEND_CMD, sendLen);
|
||||||
@@ -169,7 +169,7 @@ int SysbusUart_Recv(SYSBUS_UART *instPtr, SYSBUS_UART_FRAME *frame)
|
|||||||
{
|
{
|
||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
}
|
}
|
||||||
memcpy(dBuff, (void *)(instPtr->config.baseAddr + UART_RXBUFF_LOW), sizeof(uint32_t) * dWLen);
|
memcpy(dBuff, (void *)(instPtr->config.baseAddr + UART_RXBUFF_OFFSET), sizeof(uint32_t) * dWLen);
|
||||||
plBuff = dBuff + FRAME_HEAD_LEN;
|
plBuff = dBuff + FRAME_HEAD_LEN;
|
||||||
checkSumCal = 0;
|
checkSumCal = 0;
|
||||||
checkSum = plBuff[dLen + FRAME_DUMMY_LEN];
|
checkSum = plBuff[dLen + FRAME_DUMMY_LEN];
|
||||||
|
|||||||
@@ -73,10 +73,9 @@ typedef struct
|
|||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
uint8_t len;
|
uint16_t len;
|
||||||
uint8_t checkSum;
|
uint8_t checkSum;
|
||||||
uint8_t isValid;
|
uint8_t isValid;
|
||||||
uint8_t dummy;
|
|
||||||
uint8_t data[256];
|
uint8_t data[256];
|
||||||
} SYSBUS_UART_FRAME;
|
} SYSBUS_UART_FRAME;
|
||||||
|
|
||||||
|
|||||||
@@ -10,5 +10,5 @@ cp -rL $PROJECT_DIR/df_datalink_sp/src $DST_DIR/df_datalink_sp
|
|||||||
cp -rL $PROJECT_DIR/df_datalink_ge/src $DST_DIR/df_datalink_ge
|
cp -rL $PROJECT_DIR/df_datalink_ge/src $DST_DIR/df_datalink_ge
|
||||||
|
|
||||||
cd $DST_DIR/df_datalink_ge/networking/phy_layer
|
cd $DST_DIR/df_datalink_ge/networking/phy_layer
|
||||||
sed -i "s/antConfig->rfTxMgc = 0;/antConfig->rfTxMgc = $GE_TXATT;/g" ./phy_antenna.c
|
sed -i'' -e "s/antConfig->rfTxMgc = 0;/antConfig->rfTxMgc = $GE_TXATT;/g" ./phy_antenna.c
|
||||||
sed -i "s/antConfig->rcvMgc = 0;/antConfig->rcvMgc = $GE_RXATT;/g" ./phy_antenna.c
|
sed -i'' -e "s/antConfig->rcvMgc = 0;/antConfig->rcvMgc = $GE_RXATT;/g" ./phy_antenna.c
|
||||||
Reference in New Issue
Block a user