资源简介
资源对应博客: 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“);
- 上一篇:茶百科源代码
- 下一篇:网络工程课程设计————参考
相关资源
- STM32 led 时钟
- LED灯串电路图说明
- Micrium.RTOS.1.0.0.pack
- ISE_14.7_license.lic
- stm32f103c8t6 4 oled.rar
- mpu6050+hmc5883L.rar
- 嵌入式图形界面MiniGUI的示例程序9例
-
Cme
taFileDC的使用示例 - 光立方制作(原理图 源程序 LED搭接方
- 使用OpenFileDialog打开文件对话框.rar
- [免费]基于stm32f103ze 的OLED驱动代码
- ARM嵌入式项目实战
- 2410的led测试程序keil可以用
- uCOS编译环境建立 BC45 TASM
- LED背光的设计与优化
- stm32 用SPI 方式读写 SDHC
- 自动售货机的内部嵌入式系统
- 51单片机中使用ucos ii的优缺点
- 嵌入式实时操作系统ucos-II 第二版 源
- 基于串口设备的嵌入式Web服务器系统
- 基于LW IP的嵌入式串口服务器的设计与
- 一种嵌入式串口共享服务器的设计
- 21天学会嵌入式开发STM32.zip
- ChilledWindows.exe(玩笑病毒)
- 玩转Altera FPGA:基于PLL分频计数的LE
- PLL例化配置与LED之PLL的IP核配置
- 大功率LED高频驱动电路设计方案
- 嵌入式智能平台为城市一卡通打造智
- 研祥“EVOC”嵌入式智能平台在
- 基于MCU+FPGA的LED大屏幕控制系统的设计
评论
共有 条评论