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