日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Linux串口驅動編寫詳解(linux串口驅動編寫)

隨著linux內核的普及,越來越多的設備開始移植到Linux操作系統(tǒng)中,其中也包括串口設備,為了滿足串口設備在Linux系統(tǒng)中的運行,必須要有一個串口驅動,下面,給大家講解一下怎么編寫一個驅動。

鳳翔網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設計、網(wǎng)站建設、微信開發(fā)、APP開發(fā)、自適應網(wǎng)站建設等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)成立與2013年到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設就選創(chuàng)新互聯(lián)

1. 寄存器初始化

在編寫驅動之前,就要先準備好串口設備的寄存器地址,根據(jù)串口設備摸板上芯片版,去官網(wǎng)查芯片寄存器地址,常用的包括模式寄存器(MCR)、發(fā)送寄存器(LSR)等,然后將這些寄存器地址定義出來,然后就可以進行下一步的操作,如下段代碼:

“`c

#define MCR 0x20

#define LSR 0x26

#define DLL 0x24

#define RBR 0x26


2.編寫IO操作函數(shù)

根據(jù)上面定義的寄存器,我們可以進行基本的IO操作,在編寫串口驅動的時候,我們要對寄存器進行編寫,可以實現(xiàn)對寄存器的操作,如下:

```c
//讀
static uint8_t com_read(uint32_t addr)
{
uint32_t data = 0;
data = *(volatile uint8_t *)(addr);
return data;
}

//寫
static void com_write(uint32_t addr, uint8_t data)
{
*(volatile uint8_t *)(addr) = data;
}

3. 初始化設備

當完成上面的操作之后,就可以給設備進行初始化,初始化設備的操作包括:設置波特率、數(shù)據(jù)位(7/8)、停止位(1/2)、校驗位(N/E/O)等,最后需要通過上面的IO操作函數(shù)讀取、寫入寄存器,從而實現(xiàn)初始化,如下:

“`c

int com_init(void)

{

com_write(DLL, 0x80); //DLL和DLH寄存器用于配置波特率

com_write(DLL+1, 0x3);

com_write(MCR, 0x03); //設置RTS和DTR為功能位

return 0;

}


4.設備文件和驅動文件編寫

現(xiàn)在我們可以給設備初始化之后,就可以開始編寫設備文件和驅動文件,文件的編寫可以參照Linux內核源碼,驅動文件可以定義操作接口供用戶空間調用,簡單的操作有open、write、read等;而設備文件主要是定義字符設備的設備號和初始化函數(shù),這部分的編寫也可以參照Linux內核源碼:

```c
#include
#include
#include //字符設備操作接口
#include
static dev_t dev; //字符設備號

static struct cdev com_dev;

static int com_init(void)
{
int ret;
//分配字符設備號
ret = alloc_chrdev_region(&dev,0,1,"COM_DEBUG");
if(ret
return -1;
//初始化cdev,將cdev綁定設備號
cdev_init(&com_dev,&fops);
ret = cdev_add(&com_dev,dev,1);
if(ret)
return -1;
return 0;
}

5. 注冊驅動

完成上面的內容之后,就可以注冊驅動,通過添加設備的方式進行注冊,我們在這里就可以開發(fā)寫驅動了,最后供能夠空間代碼調用,如下:

“`c

static struct platform_driver com_driver = {

.driver = {

.name = “com_drv”,

.of_match_table = com_match,

},

.probe = com_probe,

.remove = com_remove,

};

//com_probe用于加載設備

int com_probe(struct platform_device* pdev)

{

int ret;

ret = com_init();

if(ret)

return -1;

return 0;

}

//com_remove用于卸載設備

static void com_remove(struct platform_device *pdev)

{

cdev_del(&com_dev);

unregister_chrdev_region(dev,1);

}

static int __init com_init_driver(void)

{

return platform_driver_register(&com_driver);

創(chuàng)新互聯(lián)-老牌IDC、云計算及IT信息化服務領域的服務供應商,業(yè)務涵蓋IDC(互聯(lián)網(wǎng)數(shù)據(jù)中心)服務、云計算服務、IT信息化、AI算力租賃平臺(智算云),軟件開發(fā),網(wǎng)站建設,咨詢熱線:028-86922220


名稱欄目:Linux串口驅動編寫詳解(linux串口驅動編寫)
本文來源:http://www.5511xx.com/article/djecceh.html