资源简介
资源对应博客: https://blog.csdn.net/Ningjianwen/article/details/87923875
代码片段和文件信息
#include //定义了THIS_MODULE宏
#include //定义了file_operations结构体
#include //定义了copy_to_user函数
#include //定义了ioremap 与iounremap函数
#include //定义了class_create/device_create/class_destory/device_destory函数
//定义了class 与 class_device结构体
#include //包含了GPIO相关宏
#include //包含了s3c2410_gpio_cfgpin等io操作函数
#define LED_NUM 3
static struct class *leddrv_class;
static struct class_device *leddrv_class_dev;
/**应用程序的open函数时最终会调用该函数配置LED控制引脚为输出*/
static int led_drv_open(struct inode *inode struct file *file)
{
s3c2410_gpio_cfgpin(S3C2410_GPF(4)S3C2410_GPIO_OUTPUT);
s3c2410_gpio_cfgpin(S3C2410_GPF(5)S3C2410_GPIO_OUTPUT);
s3c2410_gpio_cfgpin(S3C2410_GPF(6)S3C2410_GPIO_OUTPUT);
return 0;
}
/**应用程序的read函数时最终会调用该函数*/
ssize_t led_drv_read(struct file *file char __user *buf size_t size loff_t *ppos)
{
unsigned char led_vals[LED_NUM];
if (size > LED_NUM || size < 0)
return -EINVAL;
led_vals[0] = s3c2410_gpio_getpin(S3C2410_GPF(4));
led_vals[1] = s3c2410_gpio_getpin(S3C2410_GPF(5));
led_vals[2] = s3c2410_gpio_getpin(S3C2410_GPF(6));
copy_to_user(buf led_vals size);
return size;
}
/**
* 应用程序的write函数时最终会调用该函数调用一次只能控制一个led灯的两灭
* buf:第一个byte表示控制第几个led灯范围0~3(0表示控制所有灯) 第2个byte取值1=亮灯0=灭灯
* size:只能等于2
*/
ssize_t led_drv_write(struct file *file const char __user *buf size_t size loff_t *ppos)
{
unsigned char led_vals[2];
unsigned char value = 0led_num;
if ( size != 2)//
return -EINVAL;
copy_from_user(led_vals buf size);
value = led_vals[1] ? 0: 1;
led_num = led_vals[0];
if(led_num == 0){//同时控制所有led
s3c2410_gpio_setpin(S3C2410_GPF(4)value);
s3c2410_gpio_setpin(S3C2410_GPF(5)value);
s3c2410_gpio_setpin(S3C2410_GPF(6)value);
}else{//单独控制单个led
s3c2410_gpio_setpin(S3C2410_GPF(3+led_num)value);
}
return 0;
}
static struct file_operations led_drv_fops = {
.owner = THIS_MODULE
.open = led_drv_open
.read = led_drv_read
.write = led_drv_write
};
int major;
dev_t led_dev;
/**
*初始化函数在加载该模块时就会调用
*注册设备
*/
static int led_drv_init(void)
{
// alloc_chrdev_region()
major = register_chrdev(0 “led_drv“ &led_drv_fops);
leddrv_class = class_create(THIS_MODULE “led_drv“);
if(IS_ERR(leddrv_class))
return PTR_ERR(leddrv_class);
/* 加载模块后/dev目录下会新增 leds */
leddrv_class_dev = device_create(leddrv_class NULL MKDEV(major 0) NULL “leds“);
if(unlikely(IS_ERR(leddrv_class_dev)))
return PTR_ERR(leddrv_class_dev);
printk(“led_drv_init\n“);
return 0;
}
static void led_drv_exit(void)
{
unregister_chrdev(major “led_drv“);
device_destroy(leddrv_class MKDEV(major 0));//卸载设备
class_destroy(leddrv_class);//删除class类
}
module_init(led_drv_init);
module_exit(led_drv_exit);
MODULE_LICENSE(“GPL“);
- 上一篇:茶百科源代码
- 下一篇:网络工程课程设计————参考
相关资源
- 采用LNK454DG设计的1.1W非隔离式LED驱动
- rtthread stm32f1xx hal bsp 偏移地址0x4000
- Computer science distilled: learn the art of s
- STM32F4 7针0.96寸oled驱动.rar
- STM32单片机嵌入式实战教程四章讲义
- 《嵌入式VxWorks系统开发与应用》电子
- 计算机与通信专业英语(第四版)
- as608在oled上移植
- 本科毕业论文 基于QT的嵌入式终端应
- XT60 altium designer封装
- DSP281x官方头文件及例程
- OLED驱动库、例程、取字软件与资料
- 计算机系统实验设计设计一台嵌入式
- 计算机系统实验设计设计一台嵌入式
- 基于STM32开发板的呼吸灯流水灯控制
- TheLENAns-3LTEModuleDocumentationReleasev8.pdf
- ARM9嵌入式系统设计基础教程(与教材
- 基于S3C2410嵌入式keil开发实验与实践
- 嵌入式课程设计《数字相框》工程文
- TE2440-II全部用户手册.rar
- 大规模概念图谱构建与应用_复旦大学
- 嵌入式系统PPT
- 0.96寸OLED显示屏资料
- Qt4 图形设计与嵌入式开发 高清完整版
- IAR EWARM V5嵌入式系统应用编程与开发
- openwrtLede深入学习笔记v2.0.pdf
- stm32LED显示
- 蓝桥杯嵌入式CT117E程序
- 实时UML——开发嵌入式系统高效对象
- ARM嵌入式WINCE实践教程.pdf
评论
共有 条评论