Simcom SIM7600G-H alternative modem for L5 tested

A bit of background for testing this: So, I had some time on my hands (which didn’t last long) during spring and wanted to see if the VolTE problems and other modem related inconveniences could be sorted with an alternative modem. The Gemalto option had vanished but I still wondered if an alternative could be found. It turns out: almost…

Technical overview of SIM7600G-H-M.2 B key:
Chip: Qualcom MDM9607 (same in BM818)
Size (mm): 42.0 x 31.4 x 3.8 (BM818: 42.0 x 30.0 x 2.3)
Voltage: 3.0~4.2V (BM818: 3.3~4.2V)
Max DL / UL speeds: 150 / 50 Mbps
GSM: 850/900/1800/1900MHz
LTE-FDD: B1/B2/B3/B4/B5/B7/B8/B12/B13/B18/B19/B20/B25/B26/B28/B66
LTE-TDD: B34/B38/B39/B40/B41
WCDMA: B1/B2/B4/B5/B6/B8/B19

Simcom SIM7600G-H is ALMOST suitable. It’s using the right connector, has all the right features and even a linux driver (with plenty of documentation) in kernel. The main upside, feature-wise, is that it’s a true global modem and covers all regions (except one rare freq), which may become more relevant as traveling increases again. The price is relatively low too (about 35-45€+shipping).

But, as it turned out, there are two reasons for the “almost”. The physical size is a tiny fraction larger than the space made for the BM818. This led to a physical hack to make the Sim7600 fit, as there is plenty of space once you remove a bit of plastic. See pics.

In addition to making the modem slot larger, the extra antenna connector cable needs somewhere to go.

Simple to do as the chassis comes off (it’s nice to have stuff connected with screws and not glue - thanks Purism :slight_smile: ). The good thing is that I can still change the old modem back if needed (although the antenna cable connectors probably won’t take that abuse more than a couple of times).

The modem works well after boot. The linux driver identifies it correctly in settings.

… and then we come to reason number 2. The modem doesn’t do voice calling out of the box (it does however do data very well). I haven’t found out why (is this a Calls thing, something about audio settings or just modem not co-operating - most likely, as it drops 4G to 3G when a connection is made). Unfortunately my skill (and time, which evaporated to other priorities) was not sufficient to get voice working (the features do include audio calls and there are references to that in manuals as well as forums). The calls get through but audio is not heard on either end. SMS is a bit iffy too (didn’t get operator prepaid balance info messages). AT commands seem to work but I wasn’t able to cipher how to use them to get what I want.

Sooo… If someone wants to tinker and hack an optional modem to work, here’s one option for a summer project. It was interesting to test and showed the potential of the L5. If anyone would want to use L5 with data only (SIP/VOIP calls), this is already an option.

For now, I think I’ll put this project on the shelf. I’ll list some of the links to pages (mostly about equivalent Arduino/Pi projects) that had some info and to all the documentation as a starting point for anyone else.

General info and support documentation:

Linux documentation:

Simcom company information:

Supplier examples for private customers, with prices:

And also: Both, BM818 and SIM7600, use the same Qualcom9607 chip, for which CVE vulnerability database has several, even critical level, reports from previous years – although not all may be applicable to L5 or may already be mitigated: (please make a separate thread for this topic area).

(edit to add: the devkit device had an earlier simcom modem sim7100 variant)



It may be a problem with the audio source / sink i.e. modem is expecting audio to be exchanged with the host via one path but the host has a different idea. Just to give the flavour of what I mean: the M.2 interface has some PCM pins but also obviously has USB pins. Which is used for audio?

I wouldn’t know, I never knew to approach this angle. My tries were relatively superficial. Often I got “error: command failed: ‘ Unknown error’”. I think there is some code missing that PureOS has for BM818 but has not been made for 7600. And/Or the audio missing is probably just an indication of modem not being set up properly to make a proper connection or something. This may have multiple problems. I also noticed somewhere that there is a slight chance that this may be using a pre-standardization LTE version so there may be something wonky with it (yet should work).

Really cool work!

It would be really nice to see the Pinephones modem work in the L5 since the firmware has been liberated in great parts. If I remember correctly it recently started supporting audio over usb which would solve the problem of the missing audio connection…


Isn’t it soldered down / a BGA or LGA chip / definitely can’t be inserted in the Librem 5?

1 Like

One extra piece of information that might be of interest:

The Quectel EG25-G modem is also available in a card form factor - but sadly afaik only in Mini PCIe, not m.2.
(If it were available in an m.2 form factor, I would have gotten one already :slight_smile: )


Ay, finding a suitable m.2 modem in general, and in the right size etc. was a bit of a happenstance. I’m certainly not convinced that there couldn’t be others.

1 Like

Adding a couple of useful links and sources:


Has anyone come across a good primer/manual on passing configuration settings to kernel from console? I want to modify driver temporarily (without creating a special kernel and driver). Has anyone done something like this?

Do you want to

  • change the source of a module
  • pass parameters to the kernel command line
  • automatically set parameters in sysfs


Something needs to change in driver file [linux-src]/drivers/usb/serial/option.c … Not sure if it’s “change whole line” or “change specific string”

Clone the repo in, change the file, wait for the automatic build :upside_down_face:

Would not know where to start (or rather, would start and end up in the deep end for months) --> hence the request for detailed instructions for something very like this.

That being said, isn’t that overkill? Or is the temporary setting of config not possible?

1 Like

That question is not complete as you ask it :wink: . The kernel is configured through various interfaces:

  • kernel command line: parameters given to the kernel when loaded e.g. by the boot-loader or kexec
  • runtime configuration
    • /sys
    • options when a module is loaded (modinfo <module>, man, kernel docs)
    • /proc (sysctl)
  • compile time configuration

You need to know where to change something and then you can decide whether you need to compile anything.

This sounds very much like you want to change something that needs to be compiled and the most simple way is to do that in a repo, let build the package and install it (or get the module(s) from the resulting package and load them with your running kernel).

  • if you do not have an account to - open one and inform, the forum here, some purism people on a matrix channel about that you wait to be approved
  • log in once approved and go to
  • click on the fork button in the upper right corner (might need some time)
  • select branch pureos/byzantium in Repository/Files (you should have gotten that page after the forking succeeded)
  • click on the + beside pureos/byzantium and select new branch
  • give the branch some name and make sure it says Create from pureos/byzantium (please correct me @dos if that is not the right branch of the actual kernel :slight_smile: ) - click Create branch
  • now that created branch should be shown in the ‘click open list’ for branches/tags
  • navigate to the file you’d like to change
  • click the list beside Open in Web IDE open and select whatever you’ll like better (edit for me so far), click edit or Open in Web IDE to edit the file
  • scroll down the page to find the commit changes button (don’t forget to comment :slight_smile: )
  • in the menu to the left click on CI/CD/Pipelines - you should see a pipeline running for the changes you made
  • wait it to finish - use the time to configure your forked repository so that others might look at it if you want to share what you’re doing Settings/General/Visibility, project features, permissions: set Project visibility to public (like I did to let people without accounts to look at the repo) or Internal to share only with people logged in to - scroll down and save changes
  • once the pipeline finished running, you can use the download button in the right column to get the result

Just to give you an example - while I wrote this I did this:

Pipeline is still running for the non-sense change and if there’ll not be an error you can download the new kernel package(s). From the package you’ll be able to extract the module to test it (if the kernel source had been exactly the one of the kernel you’re running) or you could just install the package if you’re sure it’ll not break you’re boot process (but that you could fix probably by using jumpdrive to re-install the original kernel package).

All new to you? Yes, for me it has been, too, two or three month ago. All the people on the matrix channels have been very kind and helpful and pointed me to the right resources. If you’re not on room: on matrix come and visit :slight_smile: .

1 Like

Thanks, this gets me started. May take a week or two but I’ll get back how this goes (failure is an option).