pos机的驱动,一个简单的Linux内核字符驱动程序编写

 新闻资讯  |   2023-03-29 08:53  |  投稿人:pos机之家

网上有很多关于pos机的驱动,一个简单的Linux内核字符驱动程序编写的知识,也有很多人为大家解答关于pos机的驱动的问题,今天pos机之家(www.poszjia.com)为大家整理了关于这方面的知识,让我们一起来看下吧!

本文目录一览:

1、pos机的驱动

2、收银机不出小票对机器有没有影响

3、pos 8015c热敏打印机驱动怎样安装?

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机的驱动的知识,希望能够帮助到大家!

转发请带上网址:http://www.poszjia.com/news/13111.html

你可能会喜欢:

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 babsan@163.com 举报,一经查实,本站将立刻删除。