linux4.10.8 内核移植(四)---字符设备驱动_led驱动程序

一、字符设备驱动程序介绍

  

  app里面用 open、read、write等等函数出来操作底层硬件。驱动程序中也有对应的xxx_open等函数。怎么找到驱动程序中的函数依赖于驱动程序框架。

二、搭建驱动程序框架

2.1 初步框架

2.1.1 Makefile

  

2.1.2 jz2440_led.c

 1 #include <linux/module.h>
 2 #include <linux/of.h>
 3 #include <linux/of_device.h>
 4 #include <linux/regmap.h>
 5 #include <linux/fs.h>
 6
 7 #define JZ2440_LEDS_MAJOR     111    /* 主设备号 */
 8
 9
10 static int jz2440_drv_open(struct inode *inode, struct file *file)
11 {
12     printk("jz2440_drv_open");
13     return 0;
14 }
15
16 static int jz2440_drv_close(struct inode *inode, struct file *file)
17 {
18     printk("jz2440_drv_close");
19     return 0;
20 }
21
22 static ssize_t jz2440__drv_read(struct file *file, char __user * buf, size_t count, loff_t * ppos)
23 {
24     printk("jz2440__drv_read");
25     return 0;
26 }
27
28 static ssize_t jz2440_drv_write(struct file *file, const char __user * buf, size_t count, loff_t * ppos)
29 {
30     printk("jz2440_drv_write");
31     return 0;
32 }
33
34 static struct file_operations jz2440_leds_ops = {
35     .owner = THIS_MODULE,
36     .read = jz2440__drv_read,
37     .open = jz2440_drv_open,
38     .write = jz2440_drv_write,
39     .release = jz2440_drv_close,
40 };
41
42 static int __init jz2440_drv_leds_init(void)
43 {
44     register_chrdev(JZ2440_LEDS_MAJOR,"jz2440_drv_leds",&jz2440_leds_ops);//注册驱动程序,即告诉内核
45     return 0;
46 }
47
48 static void __exit jz2440_drv_leds_exit(void)
49 {
50     unregister_chrdev(JZ2440_LEDS_MAJOR,"jz2440_drv_leds");
51 }
52
53 //指向入口函数 jz2440_drv_leds_init
54 module_init(jz2440_drv_leds_init);
55 //出口函数 卸载驱动
56 module_exit(jz2440_drv_leds_exit);
57
58 MODULE_LICENSE("GPL");
59 MODULE_DESCRIPTION("jz2440 leds driver");

  编译:

  

  烧写运行:

  

  

  进入开发板u-boot界面:

  设置命令行启动参数

  set bootargs noinitrd root=/dev/nfs nfsroot=192.168.0.192:/home/ubuntu/work/nfs_root/fs_mini ip=192.168.0.191:192.168.0.192:192.168.0.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0,115200

  启动内核:boot

  

  nfs目录挂载成功。

  查看proc目录:

  

  设备号可用。

  加载模块:

  

  查看是否加载进去:

  

  测试程序

 1 #include <sys/types.h>
 2 #include <sys/stat.h>
 3 #include <fcntl.h>
 4 #include <stdio.h>
 5 #include <unistd.h>
 6
 7 int main(int argc, char **argv)
 8 {
 9     int fd;
10     int val = 1;
11
12     fd = open("/dev/xxx", O_RDWR);
13     if(fd < 0)
14     {
15         printf("can‘t open !\n");
16     }
17
18     write(fd, &val, 4);
19     return 0;
20 }

  编译烧写进板子,执行

  

  创建设备节点;

  

  执行 a.out

  

  

  

  

时间: 2024-10-10 23:02:37

linux4.10.8 内核移植(四)---字符设备驱动_led驱动程序的相关文章

linux4.10.8 内核移植(三)---裁剪内核

一.裁剪内核 1.1 第一次修改 现在的内核大小为2.8M左右,要裁剪到2.0M以下,毕竟给内核分区就只有2.0M. 这两个设备我们没有,裁剪掉. 进入make menuconfig中,搜索mousedev: 进入里面按需要进行裁剪. 搜索 lp: hostname修改: 文件系统再此修改: 去掉如下选项: 再次进入device driver,->input device->touch creen 配置上 去掉: 修改完后,保存.然后编译执行,查看uImage的大小 裁剪出来的大小为2.66M

linux4.10.8 内核移植(一)---环境搭建及适配单板。

一.环境搭建 源码包下载:git clone https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.10.8.tar.gz 或者直接去kernel.org上面进行下载. 交叉编译工具链制作: 这个已经在u-boot移植中已经做过了:http://www.cnblogs.com/kele-dad/p/6910040.html 二.内核启动过程 2.1 Windows 和 Linux 系统的启动区别 由bootloader确定启动哪块单板. 2.2

linux4.10.8 内核移植(二)---初步裁剪、分区修改和文件系统

一.初步裁剪 在内核根目录下 执行: make menuconfig 1.1 system type裁剪 选择 SAMSUNG S3C24XX SoCs Support 进入其中,这里是配置我们的单板,取消与2440无关的配置: 1.2 文件系统裁剪 以模块加入的可以保留,其他的看情况进行裁剪. 1.3 device driver裁剪 里面有些驱动不是我们所需要的,我们的目标板根本不支持那些的功能就可以裁剪掉: 1.3.1 Network device support USB适配器我们并不支持,

linux字符设备驱动--基本知识介绍

一.设备驱动的分类 1.字符设备 字符设备是指那些能一个字节一个字节读取数据的设备,如LED灯.键盘.鼠标等.字符设备一般需要在驱动层实现open().close().read().write().ioctl()等函数. 2.块设备 块设备与字符设备类似,一般是像磁盘一样的设备.在块设备中还可以容纳文件系统,并存储大量的信息.在linux系统中,进行块设备读写时,每次只能传输一个或者多个块.linux也可以让应用程序像访问字符设备一样访问块设备,一次只读取一个字节. 3.网络设备 网络设备主要负

驱动学习之字符设备驱动的原理

1:嵌入式系统的整体工作原理 应用层->API->设备驱动->硬件 比如,在应用层,现在使用read函数去读取一个设备文件,这个read函数是属于应用层的,它不能直接读取设备文件,而是通过内核层的函数(其实就是和file_operations结构体中read这个函数指针相绑定的函数,这个函数才是真正操作硬件的函数)来实现读取文件, 2:file_operations结构体 (1)这个结构体里面存放的是一个驱动里面操作文件的各种函数指针,比如,现有一个驱动,它可以打开一个文件,那么这个驱动

Linux内核分析(五)----字符设备驱动实现

原文:Linux内核分析(五)----字符设备驱动实现 Linux内核分析(五) 昨天我们对linux内核的子系统进行简单的认识,今天我们正式进入驱动的开发,我们今后的学习为了避免大家没有硬件的缺陷,我们都会以虚拟的设备为例进行学习,所以大家不必害怕没有硬件的问题. 今天我们会分析到以下内容: 1.      字符设备驱动基础 2.      简单字符设备驱动实现 3.      驱动测试 l  字符设备基础 1.       字符设备描述结构 在linux2.6内核中,使用cdev结构体描述一

从Linux内核LED驱动来理解字符设备驱动开发流程

目录 博客说明 开发环境 1. Linux字符设备驱动的组成 1.1 字符设备驱动模块加载与卸载函数 1.2 字符设备驱动的file_operations 结构体中的成员函数 2. 字符设备驱动--设备号注册卸载 2.1 设备号注册 2.2 设备号注销 3. 字符设备驱动--文件操作 参考资料 示例代码 @(从Linux内核LED驱动来理解字符设备驱动开发流程) 博客说明 撰写日期 2018.12.08 完稿日期 2019.10.06 最近维护 暂无 本文作者 multimicro 联系方式 [

(57)Linux驱动开发之三Linux字符设备驱动

1.一般情况下,对每一种设备驱动都会定义一个软件模块,这个工程模块包含.h和.c文件,前者定义该设备驱动的数据结构并声明外部函数,后者进行设备驱动的具体实现. 2.典型的无操作系统下的逻辑开发程序是:这种三层的裸机驱动模型是足够满足低耦合.高内聚的特点的. 3.当有操作系统存在时,设备驱动成为了连接硬件和内核的桥梁,这时候的设备驱动对外表现为操作系统的API,与直接裸机开发不同,裸机开发时的设备驱动是应用工程师的API.如果设备驱动都按照操作系统给出的独立于设备的接口而设计,应用程序将可以使用统

register_chrdev_region/alloc_chrdev_region和cdev注册字符设备驱动

内核提供了三个函数来注册一组字符设备编号,这三个函数分别是 register_chrdev_region().alloc_chrdev_region() 和 register_chrdev(). (1)register_chrdev  比较老的内核注册的形式   早期的驱动(2)register_chrdev_region/alloc_chrdev_region + cdev  新的驱动形式 (3)register_chrdev()函数是老版本里面的设备号注册函数,可以实现静态和动态注册两种方法