Кровавый, ещё ASM может потребоваться и знание низкоуровневых функций и вызовов ядра Linux.
A.J, на питоне системный софт нельзя писать. Топать надо в сторону изучения C. Потом тебе потребуется промониторить USB, т.е. собрать кучу статистики о том, как родная программа для модема работает с ним и разобраться в том, какие команды модем может принимать и получать, а также догадаться, что они обозначают. Это самая сложная часть работы (реверс-инженеринг). Так как маловероятно, что производители модема поделятся с тобой этой информацией. Для собирания информации можно пойти двумя путями, подробно расписывать не буду, найдешь в гугле сам.
1) Можно поставить винду в виртуалку, настроить проброс портов USB, подключить модем, и собирать статистику этого проброса (тогда гарантированно ты получишь все данные, как бы не старался защитить это производитель). А второй вариант заключаетя в том, что в винду устанавливается такая программа, которая собирает эту статистику (в 99% случаев этого достаточно). После того, как ты разобрался, что к чему надо приступать к кодингу. Пример реверс-инженеринга и разработки простого драйвера можешь поглядеть
тут.