日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

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

新聞中心

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

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

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

1. 寄存器初始化

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

“`c

#define MCR 0x20

#define LSR 0x26

#define DLL 0x24

#define RBR 0x26


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

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

```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è)備

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

“`c

int com_init(void)

{

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

com_write(DLL+1, 0x3);

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

return 0;

}


4.設(shè)備文件和驅(qū)動(dòng)文件編寫

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

```c
#include
#include
#include //字符設(shè)備操作接口
#include
static dev_t dev; //字符設(shè)備號(hào)

static struct cdev com_dev;

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

5. 注冊(cè)驅(qū)動(dòng)

完成上面的內(nèi)容之后,就可以注冊(cè)驅(qū)動(dòng),通過(guò)添加設(shè)備的方式進(jìn)行注冊(cè),我們?cè)谶@里就可以開(kāi)發(fā)寫驅(qū)動(dòng)了,最后供能夠空間代碼調(diào)用,如下:

“`c

static struct platform_driver com_driver = {

.driver = {

.name = “com_drv”,

.of_match_table = com_match,

},

.probe = com_probe,

.remove = com_remove,

};

//com_probe用于加載設(shè)備

int com_probe(struct platform_device* pdev)

{

int ret;

ret = com_init();

if(ret)

return -1;

return 0;

}

//com_remove用于卸載設(shè)備

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、云計(jì)算及IT信息化服務(wù)領(lǐng)域的服務(wù)供應(yīng)商,業(yè)務(wù)涵蓋IDC(互聯(lián)網(wǎng)數(shù)據(jù)中心)服務(wù)、云計(jì)算服務(wù)、IT信息化、AI算力租賃平臺(tái)(智算云),軟件開(kāi)發(fā),網(wǎng)站建設(shè),咨詢熱線:028-86922220


網(wǎng)站欄目:Linux串口驅(qū)動(dòng)編寫詳解(linux串口驅(qū)動(dòng)編寫)
轉(zhuǎn)載注明:http://www.dlmjj.cn/article/djecceh.html