gpio导出,以及模块之间变量可见模块驱动实例
来源:互联网 发布:单片机控制24v继电器 编辑:程序博客网 时间:2024/05/22 02:00
一 驱动实例
#include <linux/delay.h>#include <linux/if_arp.h>#include <linux/if_ether.h>#include <linux/interrupt.h>#include <linux/io.h>#include <linux/kernel.h>#include <linux/list.h>#include <linux/module.h>#include <linux/of.h>#include <linux/of_device.h>#include <linux/platform_device.h>#include <linux/gpio.h>#include <linux/irq.h>#include <linux/miscdevice.h>#include <linux/suspend.h>#include <linux/poll.h>/*GPIO3_3:用于检测串口是否出现overrun状态*/#define SERIAL_STATES_GPIO 67/*导出符号让其他内核模块可见,然后还需要在相应的.h文件中声明(extern volatile unsigned long serial_states;)*/volatile unsigned long serial_states;EXPORT_SYMBOL_GPL(serial_states);static int serial_states_open(struct inode *inode, struct file *file){ return 0;}static int serial_states_release(struct inode *inode, struct file *file){ /*note: releasing the wdt in NOWAYOUT-mode does not stop it */ return 0;}static int serial_states_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos){ if (!buf || count < 1) return 0; if (count > 4) count = 4; serial_states = 1; if (copy_to_user(buf, (void*)&serial_states, count)) { printk(KERN_ERR"serial_states copy_to_user failed."); return -EFAULT; } return count;}static int serial_states_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos){ serial_states = 0; return count;}static const struct file_operations serial_states_fops = { .owner = THIS_MODULE, .open = serial_states_open, .release = serial_states_release, .read = serial_states_read, .write = serial_states_write,};static struct miscdevice serial_states_device = { .minor = MISC_DYNAMIC_MINOR, .name = "serial_states", .fops = &serial_states_fops,};static int __init u9500_init(void){ int ret = -1; /*注册misc设备*/ ret = misc_register(&serial_states_device); if (ret != 0) { printk(KERN_ERR "register serial_states_device miscdevice error"); goto err1; } /*判断该gpio是否有效*/ ret = gpio_is_valid(SERIAL_STATES_GPIO); if (0 == ret) { printk(KERN_ERR "serial states gpio is invalid!\n"); goto err2; } /*请求gpio:其他地方就不能用了*/ ret = gpio_request(SERIAL_STATES_GPIO, "serial_states_gpio"); if (0 != ret) goto err2; /*设置gpio方向,以及设置输出值*/ ret = gpio_direction_output(SERIAL_STATES_GPIO, 0); if (0 != ret) goto err3; /*设置gpio输出值*/ gpio_set_value(SERIAL_STATES_GPIO, 0); printk("serial states module probe sucsecc!\n"); return 0;err3: gpio_free(SERIAL_STATES_GPIO);err2: misc_deregister(&serial_states_device);err1: return ret;}module_init(u9500_init);static void __exit u9500_exit(void){ int ret = -1; ret = gpio_is_valid(SERIAL_STATES_GPIO); if (0 == ret) gpio_free(SERIAL_STATES_GPIO); misc_deregister(&serial_states_device);}module_exit(u9500_exit);MODULE_AUTHOR("vector");MODULE_LICENSE("GPL v2");MODULE_DESCRIPTION("serial_states driver");
二 Makefile 实例
serialstates-objs := serial_states.oobj-m := serialstates.o PWD := $(shell pwd)KDIR := /home/vec/mydisk1/soure/kernel/objall: $(MAKE) -C $(KDIR) M=$(PWD) clean: rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions modules.order Module.symvers
阅读全文
0 0
- gpio导出,以及模块之间变量可见模块驱动实例
- 模块与变量导出
- Banana Pi的GPIO应用以及驱动HC-SR04超声波测距模块
- 内核模块共享变量实例
- 驱动模块的介绍 参数 导出符号
- 如何查看gpio 使用状态,以及被那些模块request
- DSP28335 GPIO模块
- 28377 GPIO模块
- 设计软件模块以及模块之间的通信
- python tornado主要模块以及模块之间的关系
- Android平台驱动模块编写实例
- 模块实例
- RPi.GPIO 模块使用基础
- linux驱动中使用其它模块导出的符号
- Linux 驱动之模块参数和符号导出
- Linux 驱动之模块参数和符号导出
- linux驱动入门——模块参数和导出符号
- 16 驱动模块的符号表与符号导出
- thinkphp(3.2)及laravel(5.4)框架的增删改查总结
- LeetCode300. Longest Increasing Subsequence
- 数据流图的画法
- yaf简单入门总结
- Spring Cloud 基础教程
- gpio导出,以及模块之间变量可见模块驱动实例
- win 10 的 slmgr 命令激活
- 为什么说虚函数效率比较低
- C/C++ 之 多级指针
- 如何设计一个网页版音乐播放器
- ES6(二: 变量作用域)
- hdu 1421(dp)
- 日期操作
- 奇异值分解(SVD) --- 几何意义