Linux驱动之LED驱动编写

您所在的位置:网站首页 hub75驱动程序 Linux驱动之LED驱动编写

Linux驱动之LED驱动编写

2023-12-12 18:32| 来源: 网络整理| 查看: 265

从上到下,一个软件系统可以分为:应用程序、操作系统(内核)、驱动程序。结构图如下:我们需要做的就是写出open、read、write等驱动层的函数。一个LED驱动的步骤如下:

1、查看原理图,确定需要控制的IO端口

2、查看芯片手册,确定IO端口的寄存器地址

3、编写驱动代码

4、确定应用程序功能,编写测试代码。

5、编写Makefile,编译驱动代码与测试代码,在开发板上运行

 

1、查看原理图,确定需要控制的IO端口

打开原理图,确定需要控制的IO端口为GPF4、GPF5、GPF6。

 

 

2、查看芯片手册,确定IO端口的寄存器地址,可以看到它的基地址为0x56000050

 

 

3、编写驱动代码,编写驱动代码的步骤如下:

 1)、编写出口、入口函数。

  a、首先利用register_chrdev函数如果第一个参数为0的话那么会自动分配一个主设备号为Firstmajor ;第二个参数firstled_drv会是这个字符设备的名称可以利用命令cat /proc/devices看到;第三个参数是它的first_drv_fops结构体,这个结构体是字符设备中最主要的,后面再说明。

  b、接着利用class_create函数创建一个firt_drv_class类。它的第一个参数指向这个模块,第二个参数为类的名称。再利用class_device_create创建四个设备节点,第一个参数为类、第三个参数为设备号,第五个参数为设备节点的名称,第六个参数为次设备号。这样的话会在加载驱动之后自动在/dev目录下创建四个设备文件。

  c、ioremap函数重映射函数,将物理地址转换成虚拟地址

  d、a-c为驱动入口函数,在驱动出口函数会将a-c创建的东西全部删除。

  e、module_init与module_exit表示在insmod与rmmod的时候内核会调用first_ledsdrv_init与first_ledsdrv_exit

/* * 执行insmod命令时就会调用这个函数 */ static int __init first_ledsdrv_init(void) { int minor;//次设备号 Firstmajor = register_chrdev(0, "firstled_drv", &first_drv_fops);//注册first_drv_fops结构体到字符设备驱动表,0表示自动分配主设备号 if(Firstmajori_rdev);//取得次设备号,根据次设备号来配置IO端口 switch(minor) { case 0: *gpfcon &= ~((3 f_dentry->d_inode->i_rdev);//根据文件取出次设备号 ret = copy_from_user(&val, buf, count);//ret返回0表示拷贝成功 if(!ret) { switch(minor) { case 0: if(val==1) { *gpfdat &= ~((1 i_rdev);//取得次设备号,根据次设备号来配置IO端口 switch(minor) { case 0: *gpfcon &= ~((3 f_dentry->d_inode->i_rdev);//根据文件取出次设备号 ret = copy_from_user(&val, buf, count);//ret返回0表示拷贝成功 if(!ret) { switch(minor) { case 0: if(val==1) { *gpfdat &= ~((1


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3