18.5. TTY 設(shè)備的 proc 和 sysfs 處理

2018-02-24 15:50 更新

18.5.?TTY 設(shè)備的 proc 和 sysfs 處理

tty 核心提供一個(gè)非常容易的方式給任何 tty 驅(qū)動(dòng)來維護(hù)一個(gè)文件在 /proc/tty/driver 目錄中. 如果驅(qū)動(dòng)定義 read_proc 或者 write_proc 函數(shù), 這個(gè)文件被創(chuàng)建. 接著, 任何在這個(gè)文件上的讀或?qū)懻{(diào)用被發(fā)送給這個(gè)驅(qū)動(dòng). 這些函數(shù)的格式只象標(biāo)準(zhǔn)的 /proc 文件處理函數(shù).

作為一個(gè)例子, 由一個(gè)簡單的 read_proc tty 回調(diào)實(shí)現(xiàn), 只是打印出當(dāng)前注冊的端口號(hào):


static int tiny_read_proc(char *page, char **start, off_t off, int count,
                          int *eof, void *data)
{
        struct tiny_serial *tiny;
        off_t begin = 0;
        int length = 0;
        int i;

        length += sprintf(page, "tinyserinfo:1.0 driver:%s\n", DRIVER_VERSION);
        for (i = 0; i < TINY_TTY_MINORS && length < PAGE_SIZE; ++i) {
                tiny = tiny_table[i];
                if (tiny == NULL)

                        continue;
                length += sprintf(page+length, "%d\n", i);
                if ((length + begin) > (off + count))
                        goto done;

                if ((length + begin) < off) {
                        begin += length;
                        length = 0;

                }
        }
        *eof = 1;
done:
        if (off >= (length + begin))

                return 0;
        *start = page + (off-begin);
        return (count < begin+length-off) ? count : begin + length-off;
}

tty 核心處理所有的 sysfs 目錄和設(shè)備創(chuàng)建, 當(dāng) tty 驅(qū)動(dòng)被注冊時(shí), 或者當(dāng)單個(gè) tty 設(shè)備被創(chuàng)建時(shí), 依賴在 struct tty_driver 中的 TTY_DRIVER_NO_DEVFS 標(biāo)志. 單個(gè)目錄一直包含 dev 文件, 它允許用戶空間工具來決定分配給設(shè)備的主次號(hào). 它還包含一個(gè) device 和 driver 符號(hào)連接, 如果一個(gè)指向有效的 struct device 的指針被傳遞給讀 tty_register_device 的調(diào)用. 除了這 3 個(gè)文件, 對單個(gè) tty 驅(qū)動(dòng)不可能在這個(gè)位置創(chuàng)建新的 sysfs 文件. 這個(gè)會(huì)可能在將來的內(nèi)核發(fā)行中改變.

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)