新聞中心
隨著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


咨詢
建站咨詢
