Linux驱动开发(2)——驱动编程
1.内核输出接口Linux 内核日志划分17 优先级等级只有日志自身优先级数值低于console_loglevel控制台日志等级阈值时内核打印信息才会输出到串口终端。printk内核最基础的打印接口默认使用 4 级日志优先级。pr 函数族带日志等级分类的标准化打印接口不同函数绑定固定优先级。pr_info固定为6 级普通提示日志多用于打印设备初始化、驱动加载、状态提示等常规非关键信息。2.设备驱动驱动方式字符设备驱动、块设备驱动、网络设备驱动2.1设备号主设备号次设备号主设备号表示设备类型次设备号该类型的第几个设备2.2 自定义设备cdev结构设备cdev结构设备号对设备操作的方法struct cdev{ struct module *owner;//引用计数计数使用cdev的设备个数 const struct file_operations *ops;//对设备操作的方法 dev_t dev;//该类型中第一个设备号 }1.自定义设备函数struct cdev*cdev_alloc(void);功能申请cdev结构返回值cdev结构体函数intalloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name);功能申请设备号内核自动分配主设备号参数dev --- 自动分配的主设备号baseminor --- 次设备号始编号0count --- 申请个数name --- 设备类型名称函数intcdev_add(struct cdev *p, dev_t dev, unsigned count);功能加入到cdev链表中参数p --- cdev结构体dev --- 主设备号count --- 次设备个数函数class_create(owner, name);功能创建设备类型对应的文件系统目录参数owner --- 引入计数name --- 设备类型名函数struct device *device_create(struct class *class,struct device *parent,dev_t devt,void *drvdata,const char *fmt,...);功能创建类型对应的设备参数class --- 设备所属的类parent --- 父设备devt --- 设备号fmt --- 带格式的设备名函数功能cdev_del(struct cdev *p)释放cdev结构体unregister_chrdev_region(dev_t from, unsigned count);释放设备号class_destroy(struct class *cls);销毁设备类device_destroy(struct class *class, dev_t devt);销毁设备2.自定义设备类型的操作方法static struct file_operations fops { .owner THIS_MODULE, .open open, .release close, .read read, .write write, }; //内核层对应接口 int (*open)(struct inode*,struct file*); int (*close)(struct inode*,struct file*); ssize_t (*read)(struct file*,char __user*, size_t, loft_t*); ssize_t (*write)(struct file*,char __user*, size_t, loft_t*);函数unsigner longcopy_from_user(void *to,const void __user *from,unsigned long n);功能内核层从用户层拷贝数据write参数to --- 内核层数据的缓存区from --- 用户层n --- 数据长度函数unsigner longcopy_to_user(void *to,const void __user *from,unsigned long n);功能用户层从内核层拷贝数据read参数to --- 用户层from --- 内核层数据n --- 数据长度2.3 MMU内存映射函数void __iomem *ioremap(phys_addr_t offset, size_t size);功能虚拟地址和实际物理地址的映射参数offset --- 实际的寄存器地址size --- 地址大小4byte函数 voidwritel(u32 b, volatile void __iomem *addr)功能Linux 内核读取寄存器参数b --- 要写入的值addr --- 虚拟地址函数u32readl(const volatile void __iomem *addr)功能Linux 内核写入寄存器readl用于32位寄存器函数voidiounmap(const void __iomem *addr)功能解除映射
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2561940.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!