LINUX的庫提供的波特率是標準波特率,應用時有時會用到非標準的波特率。以下試驗使用的xilinx的zynq7020,linux內(nèi)核是4.14版本。以增加波特率100k為例??戳艘恍┲苯釉趹枚烁牡囊恍┓椒ǎ呀?jīng)取消了,所以更改了內(nèi)核
第一步,內(nèi)核需要更改兩個地方,一是/drivers/tty/tty_baudrate.c,另一個是/include/uapi/asm-generic/termbits.h
先看第二個,這個CBAUD原來是0010017改為0030017,見圖1,是用來做掩碼計算的。
圖1
這兩個是新加的,如圖2
圖2
這個頭文件一共更改這三個地方。先說為什么增加波特率使用0020001而不在B4000000后面遞增使用0010020,這是因為這個低位的20已經(jīng)被占用了,如下圖3,所以找了沒被占用的位置,0020000的中2這個bit位置在c_cflag中沒被占用(c_cflag是用于設置波特率和其他一些信息的)。第一處的0030017也是這個原因,就是將波特率即可使用的這些宏定義包含進去。
圖3
第二步,更改文件/drivers/tty/tty_baudrate.c,這個文件就是獲取波特率具體數(shù)值的文件,應用端的數(shù)據(jù)傳入到內(nèi)核,內(nèi)核解析并獲得100k波特率這個數(shù)值就是在這個文件,
先在文件頭部的波特率列表中增加所需數(shù)值,如圖4,其中的100000和B100000為新增加。
圖4
修改函數(shù)speed_t tty_termios_baud_rate(struct ktermios *termios),圖5
圖5
其中圈起來的地方是新加的,這就是根據(jù)剛才新加的部分進行波特率修改,新的0020001,與CBAUDEX2進行運算判斷高位位置,之所以cbaud+=30是因為前面已經(jīng)有了30個波特率了,見圖5。這樣內(nèi)核就修改完了。
第三步,應用端的配置,應用端通常使用tcsetattr這個函數(shù)進行配置,在使能之前,對齊c_cflag進行賦值就可
struct termios , termios_new;
termios_new.c_cflag |= 0020001;
(其余配置省略)
tcsetattr(fdcom, TCSANOW, &termios_new);
這樣串口波特率即更改為100k,如需其他波特率在頭文件處增加,應用端賦值對應數(shù)值即可。