天天看點

osmocom-bb中用osmocon刷入固件指令那些參數你都弄懂了嗎?

首先找到osmocon.c這個源檔案,具體目錄在這裡

編輯器打開,找到help幫助資訊,這裡就解釋了各個參數

但是具體是幹啥用的注釋寫的并不是很清楚,部落客本着研究學習的心态,開始各種嘗試。

先看注釋裡面的三句話

其實這這三句話說了也沒什麼亂用,就是介紹下功能,具體的啥也沒說,看來還是得慢慢折騰。我們接着看代碼,很幸運,我們在下面的代碼中找到了switch,輸入的參數就進到這裡了,看看都是些啥

這麼長,别着急,我們一條條來,研究這東西沒點兒耐心咋行?先看第一個case

p這個參數裡面進行了一個指派操作,我們來找找這兩個變量都代表啥意思。首先找到

看到這句話應該能夠明白serial_dev其實就是代表了序列槽裝置的辨別,這裡的指派操作就是将擷取到的裝置辨別重新指派給serial_dev,如果沒有p參數,預設的裝置辨別就是/dev/ttyUSB1,顯然不太符合我們的要求,因為我們通常看到的序列槽辨別是/dev/ttyUSB0,是以帶上p參數是很有必要的。optarg實際上就是我們輸入的參數名。

好的,接着我們看第二個重要的參數-m參數

看字面上的意思好像是下載下傳模式的意思,我們找找代碼,恩,很快我們就找到了一個switch,看代碼

看樣子已經把dnload.mode傳進去了,再找找,找到這一段

看來刷機模式也隻有這幾種了,我們輸入的是c123xor,使用了parse_mode方法進行了轉換,看下parse_mode具體是怎麼實作的

對,if else很容易了解,程式中預設的刷機模式是MODE_C123,而我們通常使用的是c123xor,轉換一下應該是MODE_C123xor,是以m參數是很有必要的。

接着看第三個參數-s,case是這樣的

又是一個指派操作。而且直接将擷取到的值指派,沒有任何轉換,我們去找找layer2_un_path這個變量,不遠處有一句話

這句話應該很容易看出它的作用,其實就是設定layer2的一個路徑,但是這個path到底用來幹啥的呢,再找代碼,追蹤到這個判斷

這裡有個方法register_tool_server(),這裡應該有個傳回值,我們去找找這個方法

這是個靜态方法,*path形參就是我們上面看到的layer2_un_path。繼續追蹤

在這句之後path就消失了,那我們就去問問strncpy這個方法,它把path搞哪去了,找到strncpy,噢,很遺憾,strncpy這個家夥很狡猾,在這個檔案裡面就隻出現了一次。參考osmocom-bb官網上的例子,發現這個其實就是在緩沖區寫入一個osmocom_l2的檔案,這個檔案到底是作什麼用的目前還沒研究出來。經過仔細翻閱文檔,發現這裡其實就是向/tmp目錄寫入一個空檔案,用于綁定socket,因為後面嗅探到的資料都是通過socket進行傳遞。這個參數對于多個機器同時嗅探很有用,可以同時建立多個socket進行綁定,這樣消息傳送就有多個管道,不會導緻資訊的混亂。

看第四個參數-l參數,這個

看起來跟-s差不多,也是一個關于路徑的。等會兒再看。

看第五個參數-v,這個參數好像很少用的吧。執行了一個

version是版本的意思?

看起來這個好像真的隻是列印一個版本的樣子。繼續看參數-d,這個參數是直接把擷取到的參數值傳到parse_debug方法裡面,看看parse_debug這個方法是幹啥的

這個方法也很容易了解,就是用來調試的,在下載下傳固件的時候dump出tx或者rx的一些資訊。好的繼續看參數-c,這個參數直接執行了指派操作

看了看dnload.do_chainload這個其實是針對一些特殊機型Calypso,預設值為0,我們通常直接使用預設值就可以了,是以不需要加這個參數。

下面要看的是參數-i,這個參數好像也沒看到用過

看到這裡我推測這個應該跟時鐘有關系。好了,指令裡面用到的參數就這些,更加深入的原理部分以及更多研究敬請關注。