驱动开发时候,尽量选择对应操作系统内核的Linux系统作为上位机平台 下载源码与编译 源码的下载可以从网站:https://mirrors.edge.kernel.org/pub/linux/kernel...#include #include MODULE_LICENSE("Dual BSD/GPL"); static int hello_init...卸载命令为rmmod xxx 模块之间的依赖通信 以下为add_sub.c #include #include #include"add_sub.h...printk(KERN_ALERT, "test_exit"); } module_init(test_init); module_exit(test_exit); module_param(a,long,S_IRUGO...); module_param(b,long,S_IRUGO); module_param(AddOrSub,int,S_IRUGO); MODULE_LICENSE("Dual BSD/GPL");
", S_IRUGO, proc_resctrl_show),#endif ONE("oom_score", S_IRUGO, proc_oom_score), REG("oom_adj",...", S_IRUGO, proc_sessionid_operations),#endif#ifdef CONFIG_FAULT_INJECTION REG("make-it-fail", S_IRUGO...REG("projid_map", S_IRUGO|S_IWUSR, proc_projid_map_operations), REG("setgroups", S_IRUGO|S_IWUSR,...请阅读有关大页的 Linux 内核文档,以获取有关如何保留大页的更多信息。...不用担心交换——在 Linux 中,大页面无论如何都不能被换出。
audio composite驱动unbind回调函数 }; module_usb_composite_driver(audio_driver); // 注册audio_driver [include/linux...[include/linux/device.h] #define module_driver(__driver, __register, __unregister, ...) \ static int...); /* Playback Default 48 KHz */ static int p_srate = UAC2_DEF_PSRATE; module_param(p_srate, uint, S_IRUGO...Playback Default 16bits/sample */ static int p_ssize = UAC2_DEF_PSSIZE; module_param(p_ssize, uint, S_IRUGO..."); /* Capture Default 64 KHz */ static int c_srate = UAC2_DEF_CSRATE; module_param(c_srate, uint, S_IRUGO
示例 mydev.c #include #include #include #include... #include #include #define BUFSIZE 100 MODULE_LICENSE...if (S_ISDIR(mode)) { if ((mode & S_IALLUGO) == 0) mode |= S_IRUGO...mode |= S_IFREG; if ((mode & S_IALLUGO) == 0) mode |= S_IRUGO.../* use proc_mkdir() */ return NULL; } if ((mode & S_IALLUGO) == 0) mode |= S_IRUGO
创建一个目录 dev_dir = proc_mkdir("Tiny4412_leds", NULL); //创建一个文件 dev_version = create_proc_entry("version", S_IRUGO...修改的源码: #include <linux/kernel.h #include <linux/module.h #include <linux/miscdevice.h #include <linux.../fs.h #include <linux/types.h #include <linux/moduleparam.h #include <linux/slab.h #include <linux.../ioctl.h #include <linux/cdev.h #include <linux/delay.h #include <linux/gpio.h #include <mach/gpio.h...dev_dir = proc_mkdir("Tiny4412_leds", NULL); //创建一个文件 dev_version = create_proc_entry("version", S_IRUGO
Linux下读写boot分区 因为boot分区中一般存放的是bootloader或者相关配置参数,这些参数一般是不允许修改的,所以默认情况下是能读boot分区,不能写。...->force_ro.attr); md->force_ro.attr.name = "force_ro"; md->force_ro.attr.mode = S_IRUGO...; else mode = S_IRUGO | S_IWUSR; md->power_ro_lock.show...在Linux下/dev/mmcblk0boot1就表示切换到boot分区了,在uboot下需要先切换到boot分区。...free(addr); return ret; } 至此可以在Linux和Uboot下对boot分区进行操作,进行bootloader烧写或者进行重要数据更新
能产生哪类事件:EV_SW 能产生EV_SW中的哪些事件 headset headphone Lineout 注册input_dev 硬件相关(中断程序) 上报插入事件 上报拔出事件 #include #include #include #include #include #include #include #include static struct input_dev..., code, val); input_sync(g_virtual_input); return count; } static DEVICE_ATTR(test_input, S_IRUGO...switch_set_state(&g_virtual_switch, val); return count; } static DEVICE_ATTR(test_state, S_IRUGO
Linux给应用程序提供了丰富的api,但是有时候我们需要跟硬件交互,访问一些特权级信息,所以可以使用编写内核模块这种方式。...#include //必须包含,定义了动态加载内核模块所需的必要信息 #include //包含了内核常用API,比如内核打印函数printk...sudo rmmod lkm_example.ko dmesg 其他知识点 往内核模块传参数 static int pid = -1; module_param(pid,int,S_IRUGO...); /* 在内核模块中定义一个全局变量,然后用module_param声明一下 参数一:表示参数的名字; 参数二:表示参数的类型; 参数三:表示参数的访问权限,S_IRUGO表示参数可以被所有人读取.../module.h> #include #include extern void fun1(); static int __init
前言 随着计算机技术的飞速发展,Linux操作系统作为开源领域的佼佼者,已经深入到了各个应用场景之中。在Linux系统中,内核与用户空间之间的交互是核心功能之一,而设备驱动则是实现这一交互的关键环节。...本文将深入剖析Linux UIO驱动模型的技术细节,包括其定义、软件架构、必要性、工作原理以及涉及的内核函数等。...一、什么是UIO UIO(Userspace I/O)是Linux内核中的一个轻量级驱动框架,它允许用户空间程序直接访问物理设备资源,如内存、中断和DMA通道等。...fault =uio_vma_fault, }; static struct device_attribute uio_class_attributes[] ={ __ATTR(name,S_IRUGO..., show_name, NULL), __ATTR(version, S_IRUGO, show_version, NULL), __ATTR(event,S_IRUGO, show_event
为试验环境,使用uprobe一般都是编写内核驱动,在模块中定义uprobe_consumer ,然后调用uprobe的API(uprobe_register)来进行注册uprobe #include #include #include #include #include <linux...MODULE_AUTHOR("john doe"); MODULE_LICENSE("GPL v2"); static char *filename; module_param(filename, charp, S_IRUGO...); static long offset; module_param(offset, long, S_IRUGO); static int handler_pre(struct uprobe_consumer
如果设备驱动要创建,需要用到函数宏DEVICE_ATTR; 另外总线对应BUS_ATTR、设备驱动对应DRIVER_ATTR、类(class)对应CLASS_ATTR,均在kernel/include/linux...14 //用DEVICE_ATTR宏创建属性gpio文件,如果show()或是store()没有功能,就以NULL代替 15 static DEVICE_ATTR(gpio, S_IWUSR |S_IRUGO...}; DEVICE_ATTR: DEVICE_ATTR 的定义DEVICE_ATTR(_name,_mode, _show, _store);可知这里gpio是name,mode是S_IWUSR |S_IRUGO...device_attribute *attr, 7 const char *buf, size_t count); 8 }; Mode是权限位,在kernel/include/uapi/linux
一、设置测试系统 我是在虚拟机上进行的开发,查看当前 Linux 系统的内核版本: uname -r 二、Hello World 模块 1、代码详解 hello.c #include 中定义的值 设置为0不会有对应的 sysfs 入口项,否则模块参数会在 /sys/module/(如下所示) S_IRUGO 任何人都可以读取,但不能修改 S_IRUGO | S_IWUSR...hello_cnt = 2; module_param(hello_str, charp, S_IRUGO); module_param(hello_cnt, int, S_IRUGO); static...#include 头文件,包含在建立的内核版本信息。 LINUX_VERSION_CODE 整型宏定义,对 #ifdef 版本依赖有用。
2.基本原理概述 2.1 DEVICE_ATTR() DEVICE_ATTR()定义位于Android/kernel-4.14/include/linux/device.h #define DEVICE_ATTR...device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store) __ATTR()位于Android/kernel-4.14/include/linux...\ } 2.2 device_attribute device_attribute同样定义位于Android/kernel-4.14/include/linux...%s: write permission without 'store'\n", attr->attr.name); WARN(((attr->attr.mode & S_IRUGO
Linux 文件系统 目录 说明 bin 存放二进制可执行文件 sbin 存放二进制可执行文件,只有 root 才能访问 boot 存放用于系统引导时使用的各种文件 dev 用于存放设备文件 etc...是超级管理员 localhost 表示主机名 ~ 表示当前目录(家目录),其中超级管理员家目录为 /root,普通用户家目录为 /home/chan $ 表示普通用户提示符,# 表示超级管理员提示符 Linux...test.tar.gz 文件搜索命令 locate:在后台数据库搜索文件 updatedb:更新后台数据库 whereis:搜索系统命令所在位置 which:搜索命令所在路径及别名 find:搜索文件或文件夹 用户和组 Linux
coresight cpu event_source hid i2c iio mdio_bus mmc platform scsi sdio serio spi usb virtio workqueue 数据结构 linux...always_kmsg_dump console_suspend cpuid ignore_loglevel time 这些属性都是在printk中通过 module_param(ignore_loglevel, bool, S_IRUGO
因为,Linux内核对PCI总线已经有了完美的支持,你所需要做的内容是非常小的一部份。...程序如下(在2.6.31至3.1.4内核都可以运行成功): #include #include #include #include #include #include #include #include... #include #include //设备相关 #define MY_VENDOR_ID 0x168c...MY_DEVICE_ID 0x002a //设备号 #define MY_PCI_NAME "MYPCIE" //自己起的设备名 static int debug = 1; module_param(debug,int,S_IRUGO
Linux文件操作 Linux中,一切皆文件(网络设备除外)。 硬件设备也“是”文件,通过文件来使用设备。 目录(文件夹)也是一种文件。...boot:这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件和镜像文件。...deb:deb是Device(设备)的缩写,该目录下存放的是Linux的外部设备,在Linux中访问设备的方式和访问文件的方式是相同的。...系统会自动识别一些设备,例如U盘、光驱等,当识别后,Linux会把识别的设备挂载到这个目录下。...---- Linux文件的操作方式 文件描述符fd fd是一个大于等于0的整数。 每打开一个文件,就创建一个文件描述符,通过文件描述符来操作文件。
#include #include #include #define MAX_SYMBOL_LEN...= 20,}; static char func_name[NAME_MAX] = "_do_fork";module_param_string(func, func_name, NAME_MAX, S_IRUGO
Linux ESC :wq 和:wq!的区别 Linux ESC:wq 和:wq!...的区别 发布者:IT人在线 | 发表时间:2018-12-4 17:20:43 Linux ESC :wq esc(键退出)->:(符号输入)->wq(保存退出) wq(存盘并退出 write%quite
为了解决内存紧缺的问题,Linux引入了虚拟内存的概念。为了解决快速存取,引入了缓存机制、交换机制等。...要深入了解Linux内存运行机制,需要知道下面提到的几个方面。 首先,Linux系统会不时地进行页面交换操作,以保持尽可能多的空闲物理内存。...其次,Linux进行页面交换是有条件的,不是所有页面在不用时都交换到虚拟内存中,Linux内核根据“最近最经常使用”算法,仅仅将一些不经常使用的页面文件交换到虚拟内存中。...Linux虽然可以在一段时间内自行恢复,但是恢复后的系统已经基本不可用了。...Linux下可以使用文件系统中的一个常规文件或者一个独立分区作为交换空间。同时Linux允许使用多个交换分区或者交换文件。
领取专属 10元无门槛券
手把手带您无忧上云