1 驅動程序詳細說明
按照硬件相關功能性能需求,在理論和實際應用測試基礎上展開驅動程序詳細說明。
1.1 GPIO與中斷
GPIO與中斷共用同一設備節點,/dev/gpio_sg,通過 IOCTL 對IO和中斷進行訪問、控制。簡單代碼示例如下:
使用時,使用 fd = open(gpiodrv, O_RDWR|O_NOCTTY|O_NDELAY) 打開 /dev/gpio_sg 設備,正常打開后,即可通過 ioctl 進行操作了。其中 gpio_idx 為IO的枚舉序號,具體GPIO和中斷枚舉說明如下:
GPIO枚舉說明
序號 |
GPIO |
枚舉代號 |
枚舉數 |
功能說明 |
1 |
PB09 |
ltepw |
0 |
LTE模塊電源控制,0開,1關 |
2 |
PH17 |
lterst |
1 |
LTE模塊電源控制,0低,1高,常態為高,低電平有效 |
3 |
PH16 |
lteonf |
2 |
LTE模塊ON/OFF控制,0低,1高,常態為高,低電平有效 |
4 |
PH15 |
ltepctrl |
3 |
LTE加熱引腳,0低,1高,常態為低,高電平有效 |
5 |
PB08 |
uart1ms |
4 |
RS232/RS485可切換串口1模式切換IO |
6 |
PG09 |
uart2ms |
5 |
RS232/RS485可切換串口2模式切換IO |
7 |
PF01 |
mcu1rst |
6 |
MCU1重置IO |
8 |
PD06 |
mcu2rst |
7 |
MCU2重置IO |
9 |
PH24 |
plcrst |
8 |
載波模塊重置IO |
10 |
PD02 |
leduartm1 |
9 |
RS232/RS485可切換串口1模式指示燈 |
11 |
PH06 |
leduartm2 |
10 |
RS232/RS485可切換串口2模式指示燈 |
12 |
PB02 |
lte2rst |
11 |
LTE2重置IO |
13 |
PB03 |
lte2onf |
12 |
LTE2 ON/OFF 控制IO |
14 |
PH27 |
plc12v |
13 |
載波12V控制IO |
15 |
PH18 |
usbuartrst |
14 |
USB轉串口重置IO |
16 |
PH19 |
blerst |
15 |
BLE藍牙重置IO |
17 |
PH25 |
encryptrst |
16 |
加密模組重置IO |
18 |
PH23 |
blects |
17 |
BLE藍牙CTS |
19 |
PH21 |
ledrsv1 |
18 |
預留LED1 |
20 |
PH22 |
ledrsv2 |
19 |
預留LED2 |
中斷枚舉說明
序號 |
GPIO |
枚舉代號 |
枚舉數 |
功能說明 |
1 |
PH11 |
uart1msk |
0 |
RS232/RS485可切換串口1模式選擇按鍵中斷 |
2 |
PH10 |
uart2msk |
1 |
RS232/RS485可切換串口2模式選擇按鍵中斷 |
3 |
PH08 |
plcplg |
2 |
載波模塊插入檢測中斷 |
4 |
PH02 |
lteplg |
3 |
4G模塊插入檢測中斷 |
5 |
PH13 |
exethintr |
4 |
外部中斷 |
6 |
PH00 |
pt100intr |
5 |
pt100中斷 |
目前支持的 IOCTL 信號如下:
#define TGPIO_IOC_MAGIC 'T'
#define TGPIO_IOC_GETVAL _IOR(TGPIO_IOC_MAGIC, 1, __u8)
#define TGPIO_IOC_GETSTA _IOR(TGPIO_IOC_MAGIC, 2, __u8)
#define TGPIO_IOC_SETHIGH _IOW(TGPIO_IOC_MAGIC, 2, __u8)
#define TGPIO_IOC_SETLOW _IOW(TGPIO_IOC_MAGIC, 3, __u8)
#define TGPIO_IOC_TOGGLE _IOW(TGPIO_IOC_MAGIC, 4, __u8)
依次為:
1、 獲取GPIO當前值,操作方法:
ret = ioctl(fd, TGPIO_IOC_GETVAL, &gpio_idx)
返回值ret為ioctl的是否成功的標志,返回為0表示設置成功,GPIO當前值將返回到 gpio_idx 變量;
2、 獲取中斷當前狀態,操作方法:
ret = ioctl(fd, TGPIO_IOC_GETSTA, &intr_idx)
返回值ret為ioctl的是否成功的標志,返回為0表示設置成功,GPIO當前值將返回到 intr_idx 變量;
3、 設置IO狀態為高,
ret = ioctl(fd, TGPIO_IOC_SETHIGH, &gpio_idx);
返回值ret為ioctl的是否成功的標志,返回為0表示設置成功。
4、 設置IO狀態為低,
ret = ioctl(fd, TGPIO_IOC_SETLOW, &gpio_idx)
返回值ret為ioctl的是否成功的標志,返回為0表示設置成功。
5、 設置IO狀態反向,
ret = ioctl(fd, TGPIO_IOC_TOGGLE, &tmp)
返回值ret為ioctl的是否成功的標志,返回為0表示設置成功。
同時,中斷通過 FASYNC 信號將發生的中斷通知到應用層,應用層收到SIGIO的信號后,遍歷中斷引腳,以獲取中斷引腳狀態,具體代碼如下:
1.2 加密芯片
TTU目前配備SC1187Y與SC1168Y兩款加密芯片,設備節點分別為/dev/encryption0和/dev/encryption1,通過 ioctl 對加密芯片ESAM進行讀寫操作,使用方法如下:
1、 定義相關結構體:
struct encryption_reg_req {
int buflen;
char* bufdata;
};
2、定義IOCTL相關信號:
#define ESAM_GET_DATA _IOW('E', 0x01, struct encryption_reg_req)
#define ESAM_SET_DATA _IOW('E', 0x02, struct encryption_reg_req)
3、打開加密芯片設備,進行 ioctl 操作,一次寫、讀交互示例如下:
1.3 串口
TTU使用4路UART實現兩路RS485串口、兩路RS232/RS485可切換串口,設備節點與串口對應關系為:
串口與設備節點對應關系
UART |
設備節點 |
對應串口 |
GPIO狀態 |
3 |
/dev/ttySZ3 |
RS485-1 |
- |
4 |
/dev/ttySZ4 |
RS485-2 |
- |
5 |
/dev/ttySZ5 |
RS485-3 |
PB08為高電平 |
6 |
/dev/ttySZ6 |
RS485-4 |
PB09為高電平 |
7 |
/dev/ttySZ5 |
RS232-1 |
PB08為低電平 |
8 |
/dev/ttySZ6 |
RS232-2 |
PB09為低電平 |
串口打開
fd = open( "/dev/ttySZ3", O_RDWR|O_NOCTTY|O_NDELAY)
打開后進行配置,配置無校驗、9600波特率操作如下:
之后,通過 read(fd, buff, len) 和 write(fd, buff, len) 進行讀寫即可。
1.4 PT100 I2C溫度傳感器
Pt100溫度傳感器設備節點為 /dev/pt100-i2c ,打開后直接通過read進行數據讀取,每次讀取4個int長度的數據,,每兩個int型數據為一組,分別為整數部分和小數部分,具體操作如下:
1.5 ledwan驅動說明
ledwan的設備節點是/dev/ledwan,打開后,寫入一個單字節的數值代表,代表讓ledwan燈的亮滅和閃爍。
寫入0代表ledwan燈滅
寫入1代表 ledwan燈亮
寫入2代表ledwan燈閃爍
下圖示例代碼是控制ledwan燈閃爍
1.6 ledctrl驅動說明
ledctl的設備節點是/dev/ledctl,打開后直接,寫入一個單字節的數值代表,代表讓ledctl燈的亮滅和閃爍。
寫入0代表ledctl燈滅
寫入1代表 ledctl燈亮
寫入2代表ledctrl燈閃爍
下圖示例代碼是控制ledctl燈常亮
1.7 di17驅動說明
di17的設備節點是/dev/di17,設備打開后,讀取單個字節的數據,讀取得到的數值為0,或者1
0代表上蓋狀態正常
1代表上蓋被打開
下圖是讀取di17狀態的示例代碼
1.8 di18驅動說明
di18的設備節點是/dev/di18,設備打開后,讀取單個字節的數據,讀取得到的數值為0,或者1
0代表尾蓋狀態正常
1代表尾蓋被打開
下圖是讀取di18狀態的示例代碼
1.9 input_irq驅動說明
input_irq對應設備掉電上電引腳,input_irq驅動的設備節點是/dev/input_irq,設備打開后,注冊設備掉電信號的對應的信號處理函數,然后當前任務和驅動實現掛接,獲取文件標志位flag,為文件flag添加FASYNC選項。
當設備掉電時候,注冊的信號處理函數就會被系統調用。然后在回調函數中,讀取引腳狀態,來獲取是在失電狀態還是在上電狀態。
示例代碼如下:
釘釘群: