LED驱动程序外部框架

简介: LED驱动程序外部框架

led驱动程序外部框架

1.为led编写入口函数和出口函数

入口函数

static int __init led_init(void)
{
  printk("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);
  major = register_chrdev(0, "100ask_led", &led_fops);
  /* ioremap */
  led_class = class_create(THIS_MODULE, "myled");
  device_create(led_class, NULL, MKDEV(major, 0), NULL, "myled"); /* /dev/myled */
  return 0;
}

入口函数所做工作有:

1.打印内核消息

2.为file_operations注册设备,并返回系统随机分配的主设备号

4.还要根据硬件设备地址为物理地址分配虚拟地址

3.创建led_class和device_class让系统自动创建设备节点

出口函数

static void __exit led_exit(void)
{
  device_destroy(led_class, MKDEV(major, 0));
  class_destroy(led_class);
  unregister_chrdev(major, "100ask_led");
}
module_init(led_init);
module_exit(led_exit);
MODULE_LICENSE("GPL");

出口函数所做工作:

1.销毁设备和类

2.注销设备节点

3.解除物理地址到虚拟地址的映射

最后三行作用分别是将led_init和led_exit修饰为入口函数和出口函数。并遵守GPL协议。

2.编写file_operations结构体

static struct file_operations led_fops = {
  .owner    = THIS_MODULE,
  .write    = led_write,
  .open   = led_open,
};

3.实现file_operations结构体内部函数

static int led_open(struct inode *inode, struct file *filp)
{
  /* enable gpio
   * configure pin as gpio
   * configure gpio as output 
   */
  return 0;
}

open函数作用:

1.使能相应引脚

2.给相应引脚设置模式

3.给相应引脚设置输出或者是输入

以上都是通过查看芯片手册获得数据。然后再通过地址映射ioremap得到虚拟地址,再对虚拟地址进行操作。

static ssize_t led_write(struct file *filp, const char __user *buf,
       size_t count, loff_t *ppos)
{
  char val;
  int ret;
  /* copy_from_user : get data from app */
  ret = copy_from_user(&val, buf, 1);
  /* to set gpio register: out 1/0 */
  if (val)
  {
    /* set gpio to let led on */
  }
  else
  {
    /* set gpio to let led off */
  }
  return 1;
}
目录
相关文章
|
7月前
|
传感器 Linux API
如何实现 MCU软件中多个模块初始化函数的优雅调用
如何实现 MCU软件中多个模块初始化函数的优雅调用
|
传感器
STM32:红外传感器代码部分(内含实物图+外部信号流程,编写代码思路+代码+解析代码和扩展应用)
STM32:红外传感器代码部分(内含实物图+外部信号流程,编写代码思路+代码+解析代码和扩展应用)
3951 1
STM32:红外传感器代码部分(内含实物图+外部信号流程,编写代码思路+代码+解析代码和扩展应用)
|
6月前
技术心得记录:单片机开发过程中使用结构体简化程序
技术心得记录:单片机开发过程中使用结构体简化程序
38 0
【STM32】详解独立看门狗的本质和使用步骤&代码
【STM32】详解独立看门狗的本质和使用步骤&代码
|
7月前
|
存储 编解码 C++
LabVIEW编程LabVIEW控制C-863.12 水星控制器例程与相关资料
LabVIEW编程LabVIEW控制C-863.12 水星控制器例程与相关资料
43 2
|
7月前
|
JavaScript C#
【傻瓜级JS-DLL-WINCC-PLC交互】6.​向PLC里面装载数据变量
【傻瓜级JS-DLL-WINCC-PLC交互】6.​向PLC里面装载数据变量
73 0
单片机外围模块漫谈之五,USB开发,这个错误你犯了吗?
单片机外围模块漫谈之五,USB开发,这个错误你犯了吗?
|
设计模式 传感器 API
在编写RTOS代码时,如何设计一个简单、优雅、可拓展的任务初始化结构?
在编写RTOS代码时,如何设计一个简单、优雅、可拓展的任务初始化结构?
151 0
|
存储 Unix Linux
Linux设备驱动程序(二)——建立和运行模块
本章介绍所有的关于模块和内核编程的关键概念,通过一个 hello world 模块来认识驱动加载的流程及相关细节。
142 0
|
Linux 芯片
LED驱动程序--可拓展的LED驱动程序
LED驱动程序--可拓展的LED驱动程序
122 0