新聞中心
隨著Linux操作系統(tǒng)的發(fā)展,它在嵌入式領(lǐng)域的應用越來越廣泛。在很多嵌入式應用中需要使用并口(parallel port)來實現(xiàn)數(shù)據(jù)的輸入、輸出等功能。為了正確地控制并口,用戶需要編寫并口設(shè)備驅(qū)動程序,本文將介紹如何在Linux下編寫并口設(shè)備驅(qū)動程序。

成都創(chuàng)新互聯(lián)自2013年起,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目成都網(wǎng)站制作、成都網(wǎng)站設(shè)計、外貿(mào)營銷網(wǎng)站建設(shè)網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元梅江做網(wǎng)站,已為上家服務(wù),為梅江各地企業(yè)和個人服務(wù),聯(lián)系電話:13518219792
1. 并口設(shè)備驅(qū)動程序的實現(xiàn)方法
在Linux中,實現(xiàn)并口設(shè)備驅(qū)動程序有兩種方法:一是通過內(nèi)核模塊的方式,該方式需要手動進行加載和卸載;另一種是將驅(qū)動程序編譯進內(nèi)核中,該方式不需要手動操作。
一般而言,編寫并口設(shè)備驅(qū)動程序時,都會選擇之一種方式,因為在嵌入式系統(tǒng)中,很多硬件設(shè)備只能通過加載內(nèi)核模塊的方式進行驅(qū)動,如USB外設(shè)等。
2. 并口設(shè)備的使用方法
在講述如何編寫并口設(shè)備驅(qū)動程序之前,我們需要了解一下并口設(shè)備的使用方法。在Linux中,通過并口設(shè)備驅(qū)動程序可以完成以下操作:
(1)對并口進行初始化配置和打開;
(2)向并口中寫數(shù)據(jù);
(3)從并口中讀取數(shù)據(jù);
(4)關(guān)閉并口。
3. 實現(xiàn)并口設(shè)備驅(qū)動程序的步驟
接下來我們就介紹一下如何在Linux中編寫并口設(shè)備驅(qū)動程序。
(1)定義并口設(shè)備結(jié)構(gòu)體
我們需要定義一個并口設(shè)備結(jié)構(gòu)體,來保存硬件設(shè)備的相關(guān)信息,如并口地址、并口狀態(tài)等。
typedef struct {
unsigned char *base_addr; // 并口地址
unsigned int status; // 并口狀態(tài)
} my_parport_device;
注:base_addr 是并口的基地址,status 存儲的是并口的狀態(tài)信息。
(2)注冊并口設(shè)備
在將并口設(shè)備注冊進內(nèi)核之前,需要完成以下步驟:分配內(nèi)存空間、對內(nèi)存空間進行清零和設(shè)置地址,并將并口注冊進內(nèi)核。
// 分配內(nèi)存空間
my_parport_device *my_parport_dev;
alloc_chrdev_region(&dev, 0, 1, “my_parport_dev”);
my_parport_dev = kmalloc(sizeof(my_parport_device), GFP_KERNEL);
if (!my_parport_dev) {
printk(KERN_ALERT “Memory allocation fled!\n”);
return -EFAULT;
}
// 對內(nèi)存空間進行清零和設(shè)置基地址
memset(my_parport_dev, 0, sizeof(my_parport_device));
my_parport_dev->base_addr = (unsigned char *) 0x378;
// 將并口設(shè)備注冊進內(nèi)核
cdev_init(&my_parport_dev->cdev, &my_parport_fops);
my_parport_dev->cdev.owner = THIS_MODULE;
my_parport_dev->cdev.ops = &my_parport_fops;
ret = cdev_add(&my_parport_dev->cdev, dev, 1);
if (ret) {
printk(KERN_ALERT “Can’t add cdev\n”);
return ret;
}
注:第2步中的 alloc_chrdev_region() 函數(shù)用于分配主設(shè)備號和從設(shè)備號,這里我們只需要用到主設(shè)備號;第5步中的 my_parport_fops 是并口設(shè)備的操作函數(shù)集,需要在驅(qū)動程序中實現(xiàn)。
(3)編寫并口操作函數(shù)
下面我們來編寫一些基本的并口操作函數(shù),包括 open()、release()、write() 和 read()。
static int my_parport_open(struct inode *inode, struct file *filp) {
my_parport_dev->status &= ~PARPORT_STATUS_ERROR;
return 0;
}
static int my_parport_release(struct inode *inode, struct file *filp) {
return 0;
}
static ssize_t my_parport_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos) {
int written_count = 0;
int i = 0;
unsigned char data = 0;
char *out_buffer;
out_buffer = kmalloc(count, GFP_KERNEL);
if (copy_from_user(out_buffer, buf, count)) {
printk(KERN_ALERT “my_parport_write: copy_from_user fled!\n”);
return -EFAULT;
}
for (i = 0; i
data = out_buffer[i];
outb(data, my_parport_dev->base_addr);
written_count++;
}
kfree(out_buffer);
return written_count;
}
static ssize_t my_parport_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos) {
unsigned char data = inb(my_parport_dev->base_addr);
if (copy_to_user(buf, &data, 1)) {
printk(KERN_ALERT “my_parport_read: copy_to_user fled!\n”);
return -EFAULT;
}
return 1;
}
(4)編寫并口設(shè)備驅(qū)動程序
我們將以上所述的內(nèi)容編寫成并口設(shè)備驅(qū)動程序:
#include
#include
#include
#include
#include
#include
#include
#include
#define PARPORT_STATUS_ERROR 0x08
#define MY_PARPORT_MAJOR 241
#define MY_PARPORT_NAME “my_parport_dev”
typedef struct {
unsigned char *base_addr;
unsigned int status;
struct cdev cdev;
} my_parport_device;
static int my_parport_open(struct inode *inode, struct file *filp) {
my_parport_dev->status &= ~PARPORT_STATUS_ERROR;
return 0;
}
static int my_parport_release(struct inode *inode, struct file *filp) {
return 0;
}
static ssize_t my_parport_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos) {
int written_count = 0;
int i = 0;
unsigned char data = 0;
char *out_buffer;
out_buffer = kmalloc(count, GFP_KERNEL);
if (copy_from_user(out_buffer, buf, count)) {
printk(KERN_ALERT “my_parport_write: copy_from_user fled!\n”);
return -EFAULT;
}
for (i = 0; i
data = out_buffer[i];
outb(data, my_parport_dev->base_addr);
written_count++;
}
kfree(out_buffer);
return written_count;
}
static ssize_t my_parport_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos) {
unsigned char data = inb(my_parport_dev->base_addr);
if (copy_to_user(buf, &data, 1)) {
printk(KERN_ALERT “my_parport_read: copy_to_user fled!\n”);
return -EFAULT;
}
return 1;
}
static struct file_operations my_parport_fops = {
.owner = THIS_MODULE,
.read = my_parport_read,
.write = my_parport_write,
.open = my_parport_open,
.release = my_parport_release,
};
static dev_t dev;
my_parport_device *my_parport_dev;
static int __init my_parport_init(void) {
int ret;
// 分配設(shè)備號
if ((ret = alloc_chrdev_region(&dev, 0, 1, “my_parport_dev”))
printk(KERN_ALERT “Fled to allocate chrdev region\n”);
return ret;
}
// 分配設(shè)備結(jié)構(gòu)體
my_parport_dev = kmalloc(sizeof(my_parport_device), GFP_KERNEL);
if (!my_parport_dev) {
printk(KERN_ALERT “Memory allocation fled!\n”);
return -EFAULT;
}
// 對設(shè)備結(jié)構(gòu)體進行初始化
memset(my_parport_dev, 0, sizeof(my_parport_device));
my_parport_dev->base_addr = (unsigned char *) 0x378;
// 添加并注冊設(shè)備
cdev_init(&my_parport_dev->cdev, &my_parport_fops);
my_parport_dev->cdev.owner = THIS_MODULE;
my_parport_dev->cdev.ops = &my_parport_fops;
ret = cdev_add(&my_parport_dev->cdev, dev, 1);
if (ret != 0) {
printk(KERN_ALERT “Fled to add cdev \n”);
return ret;
}
printk(KERN_INFO “my_parport_dev installed successfully\n”);
return 0;
}
static void __exit my_parport_exit(void) {
// 移除并釋放設(shè)備
cdev_del(&my_parport_dev->cdev);
kfree(my_parport_dev);
unregister_chrdev_region(dev, 1);
printk(KERN_INFO “my_parport_dev removed successfully\n”);
}
module_init(my_parport_init);
module_exit(my_parport_exit);
MODULE_AUTHOR(“Liam”);
MODULE_LICENSE(“GPL”);
MODULE_DESCRIPTION(“Parallel Port Device Driver for Linux”);
至此,我們已經(jīng)完成了一個最簡單的并口設(shè)備驅(qū)動程序的編寫。無論是寫數(shù)據(jù)還是讀數(shù)據(jù),Linux內(nèi)核驅(qū)動程序都可以正常地與硬件設(shè)備進行通信,實現(xiàn)了對并口的完整控制。
4.
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián),建站經(jīng)驗豐富以策略為先導10多年以來專注數(shù)字化網(wǎng)站建設(shè),提供企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計,響應式網(wǎng)站制作,設(shè)計師量身打造品牌風格,熱線:028-86922220在linux添加一個并口磁盤,怎樣添加
1、fdisk -l 檢查硬盤列表
并口之一塊硬盤一般是/dev/hda
第二塊為/dev/hdb
依次類推
3、先給硬盤分區(qū)
用fdisk /dev/hda或者cfdisk /dev/hda
推薦用cfdisk
4、格式化分區(qū)
分區(qū)后再察簡fdisk -l你就看到/悔沒或dev/hda1之類的
mke2fs -jv /dev/hda1
5、格式化后mount
mkdir /data1
mount /dev/碧伍hda1 /data1
關(guān)于并口設(shè)備驅(qū)動 linux的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
成都創(chuàng)新互聯(lián)科技有限公司,經(jīng)過多年的不懈努力,公司現(xiàn)已經(jīng)成為一家專業(yè)從事IT產(chǎn)品開發(fā)和營銷公司。廣泛應用于計算機網(wǎng)絡(luò)、設(shè)計、SEO優(yōu)化、關(guān)鍵詞排名等多種行業(yè)!
分享題目:Linux下如何編寫并口設(shè)備驅(qū)動程序(并口設(shè)備驅(qū)動linux)
本文鏈接:http://www.dlmjj.cn/article/dpesijo.html


咨詢
建站咨詢
