About this
Since 2016-2017 when I wrote my first post regarding itbrainpower.net modem(s) integration with the BeagleBone Black, a lot of changes happen in Debian implementation. Most significant was the ones related to cape(s)/overlays manipulation and in config-pin behavior.
Also, the u-GSM modem family [~22 modem types having BBB P9 interface embedded] become commercially available.
Involved parts
- BeagleBone Black
- any u-GSM modem uFL version (excepting BC95G version*) or
- any first version of ITBP modular modem (c-uGSM, h-nanoGSM, d-u3G or l-LTE **), and mandatory one of the following:
- 1pcs. x LiPo battery [3.7V, > 250mA]***, or
- 1pcs. x super-capacitor for itbrainpower.net modems***.
* BC95G (do not be confused with BG95-M2 or BG95-M3) does not have ppp support included.
** first generation itbrainpower modular modems does not have P9 interface integrated, but still can be interfaced with BBB using wires.
I stress you again! LiPo/LiION battery OR super-capacitor are REQUIRED for proper u-GSM functionality! ***
*** for low power LTE u-GSM modems used in LTE-CATM or NBIoT mode only [BG95-M2 and BG96/BG95-M3 having 2G mode restricted], the LiPO battery or the super-capacitor can be safely replaced with 1000-1500uF/6.3V LOW ESR capacitor.
Knowledge and skills required
- BeagleBone Black previous experience
- Python, shell scripting and Linux knowledge
Some BeagleBone Black and u-GSM hardware references
u-GSM BBB embedded P9 interface
BeagleBone Black P8 and P9 interfaces
BBB pins functionality is controlled via PinMUX [mode0 ==> mode7], check:
BBB P9 pins table [pdf] and
BBB P8 pins table [pdf]
In this how to, the BBB pins UART4_RX[P2.5] and UART4_TX[P2.7] are used for Serial communication and GPIO52[P2.10], GPIO60[P2.8] and GPIO57[P2.6] are used as modem control interface.
BeagleBone Black with u-GSM modem + super-capacitor assembly
More BBB u-GSM hardware integration info.
BeagleBone Black with u-GSM modem + LiPO assembly
More BBB u-GSM hardware integration info.
HINT: for low power LTE modems used in LTE-CATM or NBIoT mode only [BG95-M2 and BG96/BG95-M3 having 2G mode restricted], the LiPO battery or the super-capacitor can be safely replaced with 1000-1500uF/6.3V LOW ESR capacitor.
Dedicated hardware information for modem interfacing via ITBPMM interface using wires
This may apply to u-GSM modem SMA version and first version of ITBP modular modems (c-uGSM, h-nanoGSM, d-u3G or l-LTE). You may ignore this if the u-GSM integration it's performed as described above.
Simply connect the wires as shown bellow:
BBB P9.16 [GPIO51]<====> ITBPMM STS
BBB P9.14 [GPIO50]<====> ITBPMM ENA / ITBPMM POW
BBB P9.12 [GPIO60]<====> ITBPMM RST* / ITBPMM RST
BBB P9.13 [GPIO31]<====> ITBPMM TX
BBB P9.11 [GPIO30] <====> ITBPMM RX
BBB P9.01 [GND] <====> ITBPMM GND
BBB P9.05 [5V] <====> ITBPMM Vin
That's all for wire interfacing.
Linux Debian 10 for Beaglebone information and hints
Our tests was made over BeagleBoard.org Debian Buster IoT Image 2020-04-06 (kernel version 4.19.94-ti-r42) - as default image shipped on new BBB boards
HINTS:
- download and install Debian 10 IoT distribution on SD
- default users and passwords: root : root and debian : temppwd. Also, you may like to make sudo no password required
- connect the BBB to the USB. use ssh to connect to BBB (target address 192.168.6.2 or 192.168.7.2)
- BeagleBone overlays and BeagleBone overlays
- BeagleBone capes and config-pin
- and, last but no least: getting started
Debian10 on BeagleBone Black
/boot/uEnv.txt
In order to have access to modem control pins (GPIO52[P2.10], GPIO60[P2.8] and GPIO57[P2.6]) and to serial (later, available as /dev/ttyO4)connection (UART4_RX[P2.5] and UART4_TX[P2.7]), I've done small changes to default /boot/uEnv.txt script. -
add/enable following lines:
disable_uboot_overlay_video=1
disable_uboot_overlay_audio=1
disable_uboot_overlay_wireless=1
disable_uboot_overlay_adc=1
/boot/uEnv.txt
1 | ###U-Boot Overlays### |
2 | ###Documentation: http://elinux.org/Beagleboard:BeagleBoneBlack_Debian#U-Boot_Overlays |
3 | ###Master Enable |
4 | enable_uboot_overlays=1 |
5 | ### |
6 | ###Overide capes with eeprom |
7 | #uboot_overlay_addr0=/lib/firmware/<file0>.dtbo |
8 | #uboot_overlay_addr1=/lib/firmware/<file1>.dtbo |
9 | #uboot_overlay_addr2=/lib/firmware/<file2>.dtbo |
10 | #uboot_overlay_addr3=/lib/firmware/<file3>.dtbo |
11 | ### |
12 | ###Additional custom capes |
13 | #uboot_overlay_addr4=/lib/firmware/<file4>.dtbo |
14 | #uboot_overlay_addr5=/lib/firmware/<file5>.dtbo |
15 | #uboot_overlay_addr6=/lib/firmware/<file6>.dtbo |
16 | #uboot_overlay_addr7=/lib/firmware/<file7>.dtbo |
17 | ### |
18 | ###Custom Cape |
19 | #dtb_overlay=/lib/firmware/<file8>.dtbo |
20 | ### |
21 | ###Disable auto loading of virtual capes (emmc/video/wireless/adc) |
22 | #disable_uboot_overlay_emmc=1 |
23 | #disable_uboot_overlay_video=1 |
24 | #disable_uboot_overlay_audio=1 |
25 | #disable_uboot_overlay_wireless=1 |
26 | #disable_uboot_overlay_adc=1 |
27 | #disable_uboot_overlay_emmc=1 |
28 | disable_uboot_overlay_video=1 |
29 | disable_uboot_overlay_audio=1 |
30 | disable_uboot_overlay_wireless=1 |
31 | disable_uboot_overlay_adc=1 |
32 | ### |
33 | ###PRUSS OPTIONS |
34 | ###pru_rproc (4.14.x-ti kernel) |
35 | #uboot_overlay_pru=/lib/firmware/AM335X-PRU-RPROC-4-14-TI-00A0.dtbo |
36 | ###pru_rproc (4.19.x-ti kernel) |
37 | uboot_overlay_pru=/lib/firmware/AM335X-PRU-RPROC-4-19-TI-00A0.dtbo |
38 | ###pru_uio (4.14.x-ti, 4.19.x-ti & mainline/bone kernel) |
39 | #uboot_overlay_pru=/lib/firmware/AM335X-PRU-UIO-00A0.dtbo |
40 | ### |
41 | ###Cape Universal Enable |
42 | enable_uboot_cape_universal=1 |
43 | ### |
44 | ###Debug: disable uboot autoload of Cape |
45 | #disable_uboot_overlay_addr0=1 |
46 | #disable_uboot_overlay_addr1=1 |
47 | #disable_uboot_overlay_addr2=1 |
48 | #disable_uboot_overlay_addr3=1 |
49 | ### |
50 | ###U-Boot fdt tweaks... (60000 = 384KB) |
51 | #uboot_fdt_buffer=0x60000 |
52 | ###U-Boot Overlays### |
53 | |
54 | cmdline=coherent_pool=1M net.ifnames=0 lpj=1990656 rng_core.default_quality=100 quiet |
55 | |
56 | #In the event of edid real failures, uncomment this next line: |
57 | #cmdline=coherent_pool=1M net.ifnames=0 lpj=1990656 rng_core.default_quality=100 quiet video=HDMI-A-1:1024x768@60e |
58 | |
59 | ##enable Generic eMMC Flasher: |
60 | #cmdline=init=/opt/scripts/tools/eMMC/init-eMMC-flasher-v3.sh |
61 |
HINTS:
- if your application require other cape / overlay(s) loaded, I recommend to you to start as above. Later, after the modem is integrated, you may play with overlays and caps as you like to.
- overlays sources are located in /opt/source/bb.org-overlays/src/arm/.
DEBIAN SETUP [MAINLY BBB PORTS CONFIGURATION, BUT GATHERING SOME PACKAGES TOO]
a. Connect the the BBB ethernet to your lan. Check the connectivity to the internet.
Update Debian
sudo apt-get update
then install additional packages as: ppp, mc, python, python-serial, other
sudo apt-get install ppp python-serial mc mtr
b. add following lines in /etc/rc.local at the bottom of the file, but before exit 0 line
sudo /etc/rc.config-itbp-uGSM-modem > /dev/null 2>&1
#next 3 lines .. to start the modem at boot
#sleep 10 #increase this with ~90-110sec if super-capacitor is used
#sudo /home/debian/poweronGSM.sh
#sudo /home/debian/startPPP.sh
/etc/rc.d related hint:
- by default, Debian 10 Buster does not execute the /etc/rc.local [the /etc/rc.local file is missing]. To solve this, just execute following commands:
echo > /etc/rc.local
chmod +x /etc/rc.local
systemctl daemon-reload
systemctl start rc-local
systemctl status rc-local
or,
b'. feel free to use crond or systemd to start and manage the processes above (...define services, systemctl edit
c. Make/Copy the following file as /etc/rc.config-itbp-uGSM-modem [right click & save as]
/etc/rc.config-itbp-uGSM-modem
1 | #!/bin/sh -e |
2 | # |
3 | # rc.config-itbp-uGSM-modem v0.22 |
4 | # |
5 | # This script configs the BBB ports for usage with the u-GSM modems [https://itbrainpower.net/u-GSM] |
6 | # |
7 | # Tested on BeagleBoard.org Debian Buster IoT Image 2020-04-06, kernel version 4.19.94-ti-r42 - the default image found shipped on new BBB |
8 | # |
9 | # This SOFTWARE is distributed is provide "AS IS" in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied |
10 | # warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
11 | # |
12 | # itbrainpower.net invests significant time and resources providing those how to and in design phase of our IoT products. |
13 | # Support us by purchasing itbrainpower.net modems from https://itbrainpower.net/order#u-GSM |
14 | # |
15 | # Dragos Iosub, Bucharest 2023. |
16 | # http://itbrainpower.net |
17 | # |
18 | |
19 | # next 3 lines, config P9_14, P9_16 and P9_12 as input pins WITHOUT pullings. |
20 | # Those pins will be used as CONTROL interface for the ITBP modular modems. |
21 | sudo /usr/bin/config-pin P9_16 gpio_input #GPIO_51 ==> u-GSM pin STS |
22 | sudo /usr/bin/config-pin P9_14 gpio #GPIO_50 ==> u-GSM pin ENA |
23 | sudo /usr/bin/config-pin P9_12 gpio #GPIO_60 ==> u-GSM pin RST |
24 | |
25 | #next four lines, config the P9_11 and P9_13 ports to be internally connected to UART4 [will be available under linux as /dev/ttyO4] |
26 | cd /sys/devices/platform/ocp/ocp:P9_11_pinmux*/ |
27 | echo uart > state |
28 | cd /sys/devices/platform/ocp/ocp:P9_13_pinmux*/ |
29 | echo uart > state |
30 | |
31 | exit 0 |
32 |
Make /etc/rc.config-itbp-uGSM-modem executable.
c'. alternate and easier, just copy the relevant contents of the above rc.config-itbp-uGSM-modem file in /etc/rc.d.
We are almost there... Just reboot your BeagleBone Black.
Download u-GSM shield BeagleBone Black [Debian10] UTILITIES [u-GSM control scripts and PPP peers files for BeagleBone Black Debian10] from the download page. This package contains both files above. Expand the archive and copy poweronGSM.sh, poweroffGSM.sh, startPPP.sh and stopPPP.sh into the /home/debian folder. Make them executable and check the ownership.
You may start the tests, but not before read the readmefirst.txt! First, run the scripts manually in order to identify and fix any bug. Later, you may link the scripts in order to start the modem and ppp at the boot time.
ppp0 default route and routing issue related hint:
- if you intend to "share" the modem (ppp0) Internet connection with local lan (eth0), you should fix the auto "default route supervisor". To do this, you may like to investigate first the "connmand" daemon behavior and change the configuration.
PYTHON SCRIPTS and ITBP_gpioBBB.py - python GPIO handler for BBB
a. Python ITBP modem and PPP support files was written for RaspberryPI [Debian distribution]. Some patches should be applied in order to run those scripts in BeagleBone Black [Debian]:
- a1. Serial port names. /dev/ttyAMA0 [RPI] ==> /dev/ttyO4 [BBB].
- a2. The RPI.GPIO python class does not exist in BBB python.
- a3. The BBB port addressing it is different from the RPI port addressing under python.
b. Download the u-GSM python and PPP support files from the u-GSM download section (for other modems from download page and select your modem first). Your name, email address and with the IMEI of your modem [the IMEI can be found on the top of the modem, or you may find using AT+CIMI command] will be requested.
c. Decompress the archives. This archive contains, along with other files, the following files: "uGSM2_02_hw_control.py", "uGSM_Serial_Lib.py" and "globalParVar.py", related to python modem control and serial communication.
d. Copy the code bellow and make a file called "ITBP_gpioBBB.py" in the very same folder where the "MyMODEMver_hw_control.py" [in this case "uGSM2_02_hw_control.py"] is located. Alternate, you can
download from here [right click & save as]: ITBP_gpioBBB.py
ITBP_gpioBBB.py : GPIO python helper file for ITBP u-GSM modems and modular modems - BBB[Debian 10] port
1 | ############################################################################################################################################################### |
2 | #ITBP_gpioBBB.py v022 - RPI.GPIO helper file for ITBP u-GSM modems and modular modems - [Debian 10] port |
3 | #COPYRIGHT (c) 2017-2023 Dragos Iosub / R&D Software Solutions srl |
4 | # |
5 | #You are legaly entitled to use this SOFTWARE ONLY IN CONJUNCTION WITH ITBP u-GSM modems or with ITBP MODULAR MODEMS DEVICES USAGE |
6 | #[l-LTE, c-uGSM, h-nanoGSM and d-u3G shileds]. Modifications, derivates and redistribution of this software must include unmodified this COPYRIGHT NOTICE. |
7 | #You can redistribute this SOFTWARE and/or modify it under the terms of this COPYRIGHT NOTICE. Any other usage may be permited only after written |
8 | #notice of Dragos Iosub / R&D Software Solutions srl. |
9 | # |
10 | #This SOFTWARE is distributed is provide "AS IS" in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied |
11 | #warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
12 | # |
13 | #Dragos Iosub, Bucharest 2023. |
14 | #http://itbrainpower.net |
15 | ############################################################################################################################################################### |
16 | |
17 | ############################################################################################################################################################### |
18 | #next, configs required for u-GSM modems (uFL) connected via u-GSM BBB interface [https://itbrainpower.net/images/u-GSM-top-03-pinout_1200px.jpg] |
19 | #or, u-GSM SMA version / ITBP MODULAR MODEMS conected via ITBPMM using wires [https://itbrainpower.net/a-gsm/BBB_u-GSM_Debian10_notes#wires] |
20 | ############################################################################################################################################################### |
21 | # Edit the "uGSM2_19_hw_control.py" - "*********_hw_control.py" for other modems - file [mcedit uGSM2_19_hw_control.py] and replace the line 17": |
22 | # import RPi.GPIO as GPIO with: |
23 | # import ITBP_gpioBBB as GPIO |
24 | # |
25 | # Edit the "globalParVar.py" file [mcedit globalParVar.py] and set the "CONTROL interface for the ITBP modems" as bellow: |
26 | # RESET = "P9_14" |
27 | # POWER = "P9_16" |
28 | # STATUS = "P9_12" |
29 | # |
30 | # Edit the "globalParVar.py" file [mcedit globalParVar.py] and replace the line |
31 | # SERIALPORT = "/dev/ttyAMA0" with |
32 | # SERIALPORT = "/dev/ttyO4" |
33 | # |
34 | # If previous line not found (for older version of python support files - mainly for ITBP MODULAR MODEMS, edit the "******GSM_Serial_Lib.py" file |
35 | # [mcedit ******GSM_Serial_Lib.py] and replace the line": |
36 | # agsm = serial.Serial("/dev/ttyAMA0", serialSpeed, timeout=1) with: |
37 | # agsm = serial.Serial("/dev/ttyO4", serialSpeed, timeout=1) |
38 | # |
39 | ############################################################################################################################################################### |
40 | |
41 | import subprocess |
42 | ports = ['P9_12','P9_14','P9_16','P9_18'] |
43 | mapping = {'P9_12':'gpio60','P9_14':'gpio50','P9_16':'gpio51','P9_18':'gpio4'} |
44 | gpioPath = '/sys/class/gpio/' |
45 | configPin = '/usr/bin/config-pin' |
46 | |
47 | #some definitions, do not change |
48 | |
49 | OUT ='out' |
50 | IN ='in' |
51 | HIGH = 1 |
52 | LOW = 0 |
53 | BOARD = 1 #just 4 compatibility with RPi.GPIO |
54 | dirmap = {'out':1,'in':0} |
55 | |
56 | def output(port, value): |
57 | p = subprocess.Popen('echo '+str(value)+' > '+gpioPath+mapping[port]+'/value', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) |
58 | out, err = p.communicate() |
59 | #print str(out) |
60 | #print str(err) |
61 | |
62 | def setup(port, direction, initial=-100): |
63 | p = subprocess.Popen(configPin+' '+str(port)+' '+str(direction), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) |
64 | out, err = p.communicate() |
65 | #print out |
66 | #print err |
67 | if (initial > -100): |
68 | output(port, initial) #write initial state |
69 | |
70 | def input(port): |
71 | p = subprocess.Popen(['cat',gpioPath+mapping[port]+'/value'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) |
72 | out, err = p.communicate() |
73 | #print out |
74 | #print err |
75 | try: |
76 | return int(out) |
77 | except: |
78 | return -100 |
79 | #print str(out) |
80 | #print str(err) |
81 | |
82 | def cleanup(): |
83 | global ports |
84 | for port in ports: |
85 | setup(port, 'in', -101)# input float |
86 | |
87 | |
88 | #just 4 compatibility with RPi.GPIO |
89 | def setmode(whatever): |
90 | return |
91 | |
92 | #just 4 compatibility with RPi.GPIO |
93 | def setwarnings(whatever): |
94 | return |
95 | |
96 |
e. Fixing a1, a2 and a3 differences
e1. Edit the "uGSM2_19_hw_control.py" file ["*********_hw_control.py" for other modems] and replace the line 17":
import RPi.GPIO as GPIO with:
import ITBP_gpioBBB as GPIO
e2. Edit the "globalParVar.py" file and set the "CONTROL interface for the ITBP modems" as bellow:
RESET = "P9_14"
POWER = "P9_16"
STATUS = "P9_18"
e3. Edit the "globalParVar.py" file [mcedit globalParVar.py] and replace the line:
SERIALPORT = "/dev/ttyAMA0" with
SERIALPORT = "/dev/ttyO4"
If SERIALPORT variable is missing in "globalParVar.py" (for older version of python support files - mainly for ITBP MODULAR MODEMS, edit the "******GSM_Serial_Lib.py" file and replace the line 40":
agsm = serial.Serial("/dev/ttyAMA0", serialSpeed, timeout=1) with:
agsm = serial.Serial("/dev/ttyO4", serialSpeed, timeout=1)
TEST THE SETUP
You may run any ITBP modem python example file [Eg. python sendSMS.py].
Ready. Enjoy!
Additional BeagleBone Black references.
- https://github.com/cdsteinkuehler/beaglebone-universal-io
- http://www.armhf.com/using-beaglebone-black-gpios/
- http://derekmolloy.ie/gpios-on-the-beaglebone-black-using-device-tree-overlays/
- CAPE, what's about: http://elinux.org/Capemgr
- BBB pins definition: https://github.com/jadonk/bonescript/blob/master/src/bone.js
- and last, but not least http://www.ti.com/product/am3359
Keep calm, understand what's under the BBB blanket, follow the principles presented above and maybe write your own overlay!?
TUTORIAL & SOFTWARE ARE PROVIDED WITHOUT ANY WARRANTY!!! USE IT AT YOUR OWN RISK!!!!