Skip to content

Commit 29c2e08

Browse files
95ArnoDingArno Ding(丁嵩)
andauthored
bsp相关资料补全 (#3)
* bsp相关资料补全 * bsp相关资料补全2 --------- Co-authored-by: Arno Ding(丁嵩) <arno.ding@QUECTEL.COM>
1 parent 5cec8fc commit 29c2e08

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+3273
-0
lines changed
1010 KB
Binary file not shown.
1.13 MB
Binary file not shown.

libraries/AW9523B/aw9523.py

Lines changed: 274 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,274 @@
1+
# Copyright (c) Quectel Wireless Solution, Co., Ltd.All Rights Reserved.
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License");
4+
# you may not use this file except in compliance with the License.
5+
# You may obtain a copy of the License at
6+
#
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
# See the License for the specific language governing permissions and
13+
# limitations under the License.
14+
15+
#!/usr/bin/env python
16+
# -*- coding: utf-8 -*-
17+
18+
"""
19+
@file :aw9523.py
20+
@author :Jack Sun (jack.sun@quectel.com)
21+
@brief :<description>
22+
@version :1.0.0
23+
@date :2023-02-01 09:21:44
24+
@copyright :Copyright (c) 2022
25+
"""
26+
27+
from queue import Queue
28+
from machine import ExtInt
29+
from usr.logging import Logger
30+
from usr.common import create_thread
31+
32+
log = Logger(__name__)
33+
34+
35+
_AW9523_DEFAULT_ADDR_KEY = (0x58) # The key drive address is 0x58, and the IO extension address is 0x5B
36+
_AW9523_DEFAULT_ADDR_IO = (0x5B)
37+
_AW9523_REG_CHIPID = (0x10) # Register for hardcode chip ID
38+
_AW9523_REG_SOFTRESET = (0x7F) # Register for soft resetting
39+
_AW9523_REG_INTENABLE0 = (0x06) # Register for enabling interrupt
40+
_AW9523_REG_GCR = (0x11) # Register for general configuration
41+
_AW9523_REG_LEDMODE = (0x12) # Register for configuring current
42+
_AW9523_REG_INPUT0 = (0x00) # Register for reading input values
43+
_AW9523_REG_OUTPUT0 = (0x02) # Register for writing output values
44+
_AW9523_REG_CONFIG0 = (0x04) # Register for configuring direction
45+
46+
47+
class Port():
48+
# 表示两个8位端口之一
49+
def __init__(self, port, aw):
50+
self._port = port & 1 # 0=PortA, 1=PortB
51+
self._aw = aw
52+
53+
def _which_reg(self, reg):
54+
return reg + self._port
55+
56+
def _flip_property_bit(self, reg, condition, bit):
57+
if condition:
58+
setattr(self, reg, getattr(self, reg) | bit)
59+
else:
60+
setattr(self, reg, getattr(self, reg) & ~bit)
61+
62+
def _read(self, reg):
63+
r_data = bytearray(1)
64+
self._aw._i2c.read(self._aw._address, bytearray([self._which_reg(reg)]), 1, r_data, 1, 0)
65+
return list(r_data)[0]
66+
67+
def _write(self, reg, val):
68+
val &= 0xff
69+
self._aw._i2c.write(self._aw._address, bytearray([self._which_reg(reg)]), 1, bytearray([val]), 1)
70+
71+
@property
72+
def mode(self):
73+
return self._read(_AW9523_REG_CONFIG0)
74+
75+
@mode.setter
76+
def mode(self, val):
77+
self._write(_AW9523_REG_CONFIG0, val)
78+
79+
@property
80+
def interrupt_enable(self):
81+
return self._read(_AW9523_REG_INTENABLE0)
82+
83+
@interrupt_enable.setter
84+
def interrupt_enable(self, val):
85+
# log.debug("val:",bin(val))
86+
self._write(_AW9523_REG_INTENABLE0, val)
87+
88+
# read only
89+
@property
90+
def interrupt_flag(self):
91+
return self._read(_AW9523_REG_INPUT0)
92+
93+
@property
94+
def gpio(self):
95+
return self._read(_AW9523_REG_OUTPUT0)
96+
97+
@gpio.setter
98+
def gpio(self, val):
99+
# writing to this register modifies the OLAT register for pins configured as output
100+
self._write(_AW9523_REG_OUTPUT0, val)
101+
102+
103+
class AW9523:
104+
105+
# _pin_to_addr = ([0x24 + pin for pin in range(8)] +
106+
# [0x20 + pin - 8 for pin in range(8, 12)] +
107+
# [0x2C + pin - 12 for pin in range(12, 16)])
108+
109+
def __init__(self, i2c_bus, int_pin=1, int_mode=0, int_callback=None, address=_AW9523_DEFAULT_ADDR_KEY):
110+
self._i2c = i2c_bus
111+
self._int_pin = int_pin
112+
self._int_mode = int_mode
113+
self._address = address
114+
self._int_callback = int_callback
115+
self.__ext_thread_id = None
116+
self.__ext_queue = Queue()
117+
self._ret = 0x001F # 接收电平状态
118+
119+
if self._address == _AW9523_DEFAULT_ADDR_KEY:
120+
self._extint = ExtInt(self._int_pin, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.__extfun)
121+
self._extint.enable()
122+
self.__ext_thread_id = create_thread(self.__extfun_thread, stack_size=0x4000)
123+
124+
# Read device ID. AW9523B ID read default value is 23H
125+
self.read_buf = bytearray(5)
126+
self._i2c.read(address, bytearray((_AW9523_REG_CHIPID, 0xff)), 1, self.read_buf, 1, 20)
127+
# log.debug("read_buff:", self.read_buf)
128+
if (self.read_buf[0] != 0x23):
129+
raise AttributeError("Cannot find a AW9523")
130+
131+
# self.reset()
132+
self.porta = Port(0, self)
133+
self.portb = Port(1, self)
134+
135+
def __extfun(self, args):
136+
self.__ext_queue.put(args)
137+
138+
#执行中断回调
139+
def __extfun_thread(self):
140+
while 1:
141+
args = self.__ext_queue.get()
142+
log.debug('### interrupt {} ###'.format(args))
143+
# 读取两组电平,判断触发了中断的io,中断信号前后电平对比
144+
# status_0 = self._read(_AW9523_REG_INPUT0)
145+
# status_1 = self._read(_AW9523_REG_INPUT0 + 1)
146+
self._i2c.read(_AW9523_DEFAULT_ADDR_KEY, bytearray((_AW9523_REG_INPUT0, 0xff)), 1, self.read_buf, 1, 20)
147+
status_0 = self.read_buf[0]
148+
self._i2c.read(_AW9523_DEFAULT_ADDR_KEY, bytearray((_AW9523_REG_INPUT0 + 1, 0xff)), 1, self.read_buf, 1, 20)
149+
status_1 = self.read_buf[0]
150+
status = (status_1 << 8) | status_0
151+
# log.debug('### io level {} ###'.format(bin(status)))
152+
153+
change = (self._ret ^ status)
154+
if self._int_callback is None:
155+
return
156+
157+
#byte 引脚号 pin_level 电平
158+
if change is not 0:
159+
byte = 0
160+
pin_level = 1
161+
while byte < 16:
162+
if (change & (1 << byte)):
163+
break
164+
else:
165+
byte = byte + 1
166+
167+
if (status & (1 << byte)):
168+
pin_level = 1
169+
else:
170+
pin_level = 0
171+
172+
#判断是否该IO是否中断使能
173+
# flag_0 = self._read(_AW9523_REG_INTENABLE0)
174+
# flag_1 = self._read(_AW9523_REG_INTENABLE0 + 1)
175+
self._i2c.read(_AW9523_DEFAULT_ADDR_KEY, bytearray((_AW9523_REG_INTENABLE0, 0xff)), 1, self.read_buf, 1, 20)
176+
flag_0 = self.read_buf[0]
177+
self._i2c.read(_AW9523_DEFAULT_ADDR_KEY, bytearray((_AW9523_REG_INTENABLE0 + 1, 0xff)), 1, self.read_buf, 1, 20)
178+
flag_1 = self.read_buf[0]
179+
flag = (flag_1 << 8) | flag_0
180+
if flag & (1 << byte) == 0:
181+
list_push = [byte, pin_level]
182+
self._int_callback(list_push)
183+
# log.debug('### io level {} ###'.format(bin(status)))
184+
# 保存上一次电平状态
185+
self._ret = status
186+
187+
def _read(self, addr):
188+
r_data = bytearray(1)
189+
self._i2c.read(self._address, bytearray([addr]), 1, r_data, 1, 20)
190+
return list(r_data)[0]
191+
192+
def _write(self, addr, *vals):
193+
# log.debug("write vals:", vals)
194+
self._i2c.write(self._address, bytearray([addr]), 1, bytearray(list(vals)), len(list(vals)))
195+
196+
def reset(self):
197+
self._write(_AW9523_REG_SOFTRESET, 0x00) # 对该寄存器写 00H 复位 reset
198+
self._write(_AW9523_REG_GCR, 0b00010000) # pushpull output D[4]=0,Open-Drain模式; D[4]=1,Push-Pull模式
199+
self._write(_AW9523_REG_INTENABLE0, 0xff, 0xff) # no IRQ 0-中断使能; 1-中断不使能
200+
self._write(_AW9523_REG_INTENABLE0 + 1, 0xff, 0xff) # no IRQ
201+
# self._write(_AW9523_REG_LEDMODE, 0xff, 0xff) #gpio mode
202+
# self._write(_AW9523_REG_LEDMODE+1, 0xff, 0xff) #gpio mode
203+
204+
# set aw9523 pin
205+
def pin(self, pin, mode=None, value=None, interrupt_enable=None):
206+
assert 0 <= pin <= 15
207+
port = self.portb if pin // 8 else self.porta
208+
bit = (1 << (pin % 8))
209+
if mode is not None:
210+
# 0: Pin is configured as an output
211+
# 1: Pin is configured as an input
212+
port._flip_property_bit('mode', mode & 1, bit)
213+
if value is not None:
214+
# 0: 引脚设置为逻辑低电平
215+
# 1: 引脚设置为逻辑高电平
216+
port._flip_property_bit('gpio', value & 1, bit)
217+
if interrupt_enable is not None:
218+
# 1: Disables GPIO input pin for interrupt-on-change event
219+
# 0: Enables GPIO input pin for interrupt-on-change event
220+
if interrupt_enable == 0:
221+
interrupt_enable = 1
222+
else:
223+
interrupt_enable = 0
224+
port._flip_property_bit('interrupt_enable', interrupt_enable & 1, bit)
225+
if value is None:
226+
return port.gpio & bit == bit
227+
228+
# mode (IODIR register)
229+
@property
230+
def mode(self):
231+
return self.porta.mode | (self.portb.mode << 8)
232+
233+
@mode.setter
234+
def mode(self, val):
235+
self.porta.mode = val
236+
self.portb.mode = (val >> 8)
237+
238+
# interrupt_enable (GPINTEN register)
239+
@property
240+
def interrupt_enable(self):
241+
return self.porta.interrupt_enable | (self.portb.interrupt_enable << 8)
242+
243+
@interrupt_enable.setter
244+
def interrupt_enable(self, val):
245+
self.porta.interrupt_enable = val
246+
self.portb.interrupt_enable = (val >> 8)
247+
248+
# interrupt_flag (INTF register)
249+
# read only
250+
@property
251+
def interrupt_flag(self):
252+
return self.porta.interrupt_flag | (self.portb.interrupt_flag << 8)
253+
254+
# gpio (GPIO register)
255+
@property
256+
def gpio(self):
257+
return self.porta.gpio | (self.portb.gpio << 8)
258+
259+
@gpio.setter
260+
def gpio(self, val):
261+
self.porta.gpio = val
262+
self.portb.gpio = (val >> 8)
263+
264+
# 获取引脚电平,pin为引脚号0~15
265+
def read(self, pin):
266+
status_0 = self._read(_AW9523_REG_INPUT0)
267+
status_1 = self._read(_AW9523_REG_INPUT0 + 1)
268+
status = (status_1 << 8) | status_0
269+
pin_level = 0
270+
if (status & (1 << pin)):
271+
pin_level = 1
272+
else:
273+
pin_level = 0
274+
return pin_level

libraries/BF3901/BF3901CS.pdf

240 KB
Binary file not shown.
577 KB
Binary file not shown.
1.85 MB
Binary file not shown.
607 KB
Binary file not shown.
1.28 MB
Binary file not shown.

libraries/ESP8266/esp8266.py

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
import slip
2+
import dataCall
3+
import utime
4+
import usocket
5+
import checkNet
6+
from machine import UART
7+
from usr.common_except import CustomError
8+
9+
class Esp8266(object):
10+
def __init__(self):
11+
self._wait_datacall_success()
12+
13+
def _wait_datacall_success(self):
14+
print('waiting datacall success...')
15+
while 1:
16+
self.lteInfo = dataCall.getInfo(1, 0)
17+
if self.lteInfo != -1:
18+
break
19+
utime.sleep(2)
20+
print('success get dataCall info: ')
21+
print(self.lteInfo)
22+
23+
class Esp8266_ap(Esp8266):
24+
ESP_SERVER = '172.16.1.5'
25+
ESP_SERVER_PORT = 1000
26+
27+
def __init__(self,uart):
28+
super().__init__()
29+
self.wifi_off()
30+
# 创建slip网卡
31+
ret = slip.construct(uart, slip.SLIP_INNER, 0)
32+
print(ret)
33+
if ret != 0:
34+
raise CustomError("slip netif construct fail")
35+
36+
def _pack_tlv_format(self,head, content):
37+
if len(content) == 0 or len(content) > 9999 or len(head) != 2:
38+
print('illegal tlv content')
39+
return 0
40+
len_str = '%04d' % len(content)
41+
msg = head + len_str + content
42+
return msg
43+
44+
def wifi_on(self):
45+
# 获取slip的网络配置
46+
slipInfo = slip.ipconfig()
47+
print('slip ipconfig: ')
48+
print(slipInfo)
49+
if self.lteInfo != -1:
50+
# 设置默认网卡,当设置slip作为上网卡时不设置该接口,即SLIP_OUTER类型
51+
ret = slip.set_default_netif(self.lteInfo[2][2])
52+
if ret != 0:
53+
print('slip set default netif fail')
54+
return -1
55+
# 添加路由信息,设置网卡转发规则192.168.4.0表示ap的网段,255.255.255.0子网掩码
56+
ret = slip.router_add('192.168.4.0', '255.255.255.0')
57+
if ret != 0:
58+
print('slip add subnet routers fail')
59+
return -1
60+
return 0
61+
62+
def set_ap(self,name=None,pwd=None,project_name='wifi_setap',project_version='1.0.0'):
63+
checknet = checkNet.CheckNetwork(project_name, project_version)
64+
stagecode, subcode = checknet.wait_network_connected(30)
65+
if stagecode != 3 or subcode != 1:
66+
print('fail to set ap. ')
67+
return -1
68+
# 创建一个socket实例
69+
sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM)
70+
# 增加端口复用
71+
sock.setsockopt(usocket.SOL_SOCKET, usocket.SO_REUSEADDR, 1)
72+
# 解析域名
73+
addr = usocket.getaddrinfo(self.ESP_SERVER, self.ESP_SERVER_PORT)
74+
print(addr)
75+
sockaddr = addr[0][-1]
76+
print(sockaddr)
77+
bind_addr = ('172.16.1.2', 10001)
78+
ret = sock.bind(bind_addr)
79+
print('bind success')
80+
print(ret)
81+
# 建立连接
82+
sock.connect(sockaddr)
83+
# 向服务端发送消息
84+
if name == None and pwd == None:
85+
return -1
86+
elif name == None:
87+
msg = self._pack_tlv_format('F1', pwd)
88+
elif pwd == None:
89+
msg = self._pack_tlv_format('F2', name)
90+
else:
91+
msg = self._pack_tlv_format('F3', name+','+pwd)
92+
print(msg)
93+
ret = sock.send(msg)
94+
print('send %d bytes' % ret)
95+
# 接收服务端消息
96+
data = sock.recv(256)
97+
print('recv %s bytes:' % len(data))
98+
print(data.decode())
99+
100+
# 关闭连接
101+
sock.close()
102+
return 0
103+
104+
def wifi_off(self):
105+
slip.destroy()
106+
107+
if __name__=="__main__":
108+
esp8266 = Esp8266_ap(UART.UART2)
109+
esp8266.set_ap(name='大好年华',pwd='11111111')
110+
err = esp8266.wifi_on()
111+
if err == 0:
112+
print('slip network card create success')
113+
else:
114+
print('slip network card create fail')

0 commit comments

Comments
 (0)