網上有很多關于pos機的驅動,一個簡單的Linux內核字符驅動程序編寫的知識,也有很多人為大家解答關于pos機的驅動的問題,今天pos機之家(www.tonybus.com)為大家整理了關于這方面的知識,讓我們一起來看下吧!
本文目錄一覽:
1、pos機的驅動
pos機的驅動
一、背景為了了解設備驅動程序的框架,在此編寫一個簡單的字符驅動程序,以此來對驅動程序的框架進行一個簡單的了解。
嵌入式進階教程分門別類整理好了,看的時候十分方便,由于內容較多,這里就截取一部分圖吧。
需要的朋友私信【內核】即可領取。
內核學習地址:Linux內核源碼/內存調優/文件系統/進程管理/設備驅動/網絡協議棧-學習視頻教程-騰訊課堂
所謂設備驅動程序,其實就是計算機硬件與外部設備進行通信的接口。由于硬件設備各式各樣,有了設備驅動程序,應用程序就可以不用在意設備的具體細節,而方便地與外部設備進行通信。從外部設備讀取數據,或是將數據寫入外部設備,即對設備進行控制。
三、設備驅動程序框架設備的種類繁多是可想而知的,所以設備的驅動程序也是各式各樣的。由此需要建立一個統一的規范:SVR4(UNIX System V Rlease 4)提出了DDI/DKI(Driver-Device Interface/Driver-Kernel Interface)規范。這個SVR4是UNIX操作系統的一種內核標準。
規范分為以下三個部分:
1、驅動程序與內核的接口2、驅動程序與設備的接口3、驅動程序與系統引導的接口其中,驅動程序與內核的接口是通過數據結構file_opration完成的。驅動程序與設備的接口描述了驅動程序如何與設備交互,這與具體的設備是密切相關的。驅動程序與系統引導的接口其實就是驅動程序對設備進行初始化。
四、簡單的字符驅動程序我在這里直接將我編寫的字符驅動程序展示出來,然后對其進行分析:
#include<linux/init.h>#include<linux/module.h>#include<linux/types.h>#include<linux/fs.h>#include<linux/mm.h>#include<linux/sched.h>#include<linux/cdev.h>#include<asm/io.h>#include<asm/switch_to.h>#include<asm/uaccess.h>#include<linux/kernel.h>MODULE_LICENSE("GPL");#define MYCDEV_MAJOR 231#define MYCDEV_SIZE 1024static int mycdev_open(struct inode *inode,struct file *fp){ return 0;}static int mycdev_release(struct inode *inode,struct file *fp){ return 0;}static ssize_t mycdev_read(struct file *fp,char __user *buf,size_t size,loff_t *pos){ unsigned long p = *pos; unsigned int count = size; char kernel_buf[MYCDEV_SIZE] = "This is mycdev!"; int i; if(p >= MYCDEV_SIZE) return -1; if(count > MYCDEV_SIZE) count = MYCDEV_SIZE - p; if(copy_to_user(buf,kernel_buf,count) != 0){ printk("read error!\"); return -1; } printk("reader:%d bytes was read...\",count); return count;}static ssize_t mycdev_write(struct file *fp,const char __user *buf,size_t size,loff_t *pos){ return size;}static const struct file_operations mycdev_fops ={ .owner = THIS_MODULE, .read = mycdev_read, .write = mycdev_write, .open = mycdev_open, .release = mycdev_release,};static int __init mycdev_init(void){ int ret; printk("mycdev module is starting..\"); ret = register_chrdev(MYCDEV_MAJOR,"my_cdev",&mycdev_fops); if(ret < 0) { printk("register failed..\"); return 0; } else { printk("register success..\"); } return 0;}static void __exit mycdev_exit(void){ printk("mycdev module is leaving..\"); unregister_chrdev(MYCDEV_MAJOR,"my_cdev");}module_init(mycdev_init);module_exit(mycdev_exit);
首先看一下file_operation結構體,此結構體是該驅動程序的核心。它給出了對文件操作函數的定義。當然,具體的實現函數是留給驅動程序編寫的:
struct file_operations { struct module *owner; loff_t (*llseek) (struct file *, loff_t, int); ssize_t (*read) (struct file *, char __user *, size_t, loff_t *); ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *); ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t); ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t); int (*readdir) (struct file *, void *, filldir_t); unsigned int (*poll) (struct file *, struct poll_table_struct *); long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); long (*compat_ioctl) (struct file *, unsigned int, unsigned long); int (*mmap) (struct file *, struct vm_area_struct *); int (*open) (struct inode *, struct file *); int (*flush) (struct file *, fl_owner_t id); int (*release) (struct inode *, struct file *); int (*fsync) (struct file *, loff_t, loff_t, int datasync); int (*aio_fsync) (struct kiocb *, int datasync); int (*fasync) (int, struct file *, int); int (*lock) (struct file *, int, struct file_lock *); ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int); unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long); int (*check_flags)(int); int (*flock) (struct file *, int, struct file_lock *); ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int); ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int); int (*setlease)(struct file *, long, struct file_lock **); long (*fallocate)(struct file *file, int mode, loff_t offset, loff_t len); int (*show_fdinfo)(struct seq_file *m, struct file *f);};
此結構對文件操作的函數給出了定義。種類繁多。
我們這里的file_operation結構體進行初始化時僅初始化了4個函數。這些使用的函數在程序的前半部分已經給出了定義。
五、調試程序由于編寫的是內核模塊,所以需要用make進行編譯。這個我在之前的博客已經寫過如何編寫Makefile文件。編譯完畢后將模塊插入。
然后,通過cat /proc/devices來看系統中未使用的字符設備主設備號,我這里看到的是my_cdev,對應的是231號。
接下來使用mknod命令創建設備文件結點,然后用chmod命令修改權限為777。此時設備就可以使用了。
這里我們需要注意一下/proc/devices與/dev下的顯示的設備的不同之處。
在/proc/devices下,顯示的是驅動程序生成的設備及其主設備號。其中主設備號可用來讓mknod作為參數。
在/dev下的設備是mknod生成的設備,其中,用戶通過使用/dev下的設備名來使用設備。
六、編寫用戶態測試程序#include<stdio.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<stdlib.h>#include<unistd.h>int main(){ int testdev; int i,ret; char buf[10]; testdev = open("/dev/mycdev",O_RDWR); if(testdev == -1){ printf("connot open file..\"); exit(1); } if((ret = read(testdev,buf,10)) <10){ printf("read error!\"); exit(1); } for(i=0;i<10;i++) printf("%d\",buf[i]); close(testdev); return 0;}
這個程序沒什么好說的。
七、運行結果插入模塊后查看日志信息:
運行測試程序:
這里我們看到,它輸出了數組的前十個字節,對應著:This is my
查看日志信息:
這個我們看到,驅動也打印出了一段文字,十個字節被讀取。
卸載模塊:
八、總結這里只是簡單地介紹了一下設備驅動程序的框架,作為一個對驅動程序的簡單了解。
原文鏈接:https://blog.csdn.net/hty46565/article/details/53053345
收銀機不出小票對機器有沒有影響
不出小票可能是POS機有什么問題,不影響機器使用橋虧拿。
1、檢查電源鍵是否接通。
2、查看一下POS機是否卡紙。
3、查看一下POS機是否進水或者短路。
4、查看一下收銀POS機與電腦數據鏈接線是否正敏搭確。
5、查看POS機的驅動是否正常。
6、檢查空神POS機卷紙滾筒損壞。
7、查看收銀機軟件設置問題。
pos 8015c熱敏打印機驅動怎樣安裝?
安裝打印機一般通過控制面板的添加打印機來操作,具體可以參考如下步驟:
1、首先確定打印機是否能正常使用。
2、將usb數據線聯接電腦和打印機,開始——控制面板——硬件和聲音,點擊“設備和打印機”選項的“添加打印機”。
3、點擊添加本地打印機(第二個不用管他,他是裝無線打印機的一般用不上)選擇打印機的端口類型,一般說明書上有。
在選項列表內選著打印機的品牌和型號,如果你有光盤的話就用隨機附送的光盤直接安裝打印機的驅動系統,如果沒有的話,那就到該品牌的官方網站下載這個型號的打印機驅動就行,按照它的提示一步一步安裝就行了。
以上就是關于pos機的驅動,一個簡單的Linux內核字符驅動程序編寫的知識,后面我們會繼續為大家整理關于pos機的驅動的知識,希望能夠幫助到大家!
