Linux设备驱动程序设计(三)----Linux的特殊字符设备:混杂设备,依旧让LED闪烁起来

[Android O] [RK3399] -- Vendor Storage 功能探究 前言: Vendor storage 被设计用来存储 SN,MAC,LAN,BT 等 vendor data。 特征: 唯一的访问 ID; 可靠的数据验证; 掉电不会丢失; 系统启动各个阶段都可访问; PC 端可读写; Kernel 可读写; Linux Application 可读写; 如下图: Data Layout: 也就是说 vendor storage 是从 eMMC 3.5M 之后... 阅读详情

看了上面的文章,大家也会觉得创建字符设备是一件很复杂的事情,步骤太多,对于初学者要摸好长时间才能慢慢熟悉,然后还要创建设备文件,虽然每一步不难,但是组合到一起就显得有些繁琐了,没办法,开发Linux的都是大牛,更多的精力放到了功能上,而忽略了用户体验与操作的便捷性。

Linux针对像LED这样的操作,有一种设备叫做混杂设备:是一种特殊的字符设备,它的主设备号为10,我们重新启动开发板,然后执行命令:cat /proc/devices ,可以看到:

root@at91sam9260ek:/# cat /proc/devices 
Character devices:
  1 mem
  2 pty
  3 ttyp
  4 /dev/vc/0
  4 tty
  4 ttyS
  5 /dev/tty
  5 /dev/console
  5 /dev/ptmx
  7 vcs
 10 misc
 13 input
 14 sound
 90 mtd
116 alsa
128 ptm
136 pts
153 spi
180 usb
189 usb_device
253 usb_endpoint
254 rtc

说明混杂设备早已经存在,是为了给开发者一个叫为简单的操作方式,因为不用再重新申请一个设备号了(misc就是混杂设备的意思),那么它和普通的字符设备有什么不同呢?其实是操作上方便了很多,然我们先看驱动程序,其实改变也不是很大:

#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/miscdevice.h>
#include <linux/types.h>
#include <linux/fs.h>
#include <mach/gpio.h>

//定义命令
#define LED_ON		_IOW('h',0x01,unsigned long)		//LED开的命令
#define LED_OFF		_IOW('h',0x02,unsigned long)		//LED关的命令

int open_state = 0;			//1为打开,0为关闭

/*-----------------------------------------------------------------------------
  函数名:      led_open
  参数:        struct inode *inode,struct file *filp
  返回值:      int
  描述:        open对应的驱动函数
 *-----------------------------------------------------------------------------*/
int led_open(struct inode *inode,struct file *filp )
{
	if(open_state == 0)
	{
		open_state =  1;
		printk("Open file suc!\n");
		return 0;
	}
	else
	{
		printk("The file has opened!\n");
		return -1;
	}
}
/*-----------------------------------------------------------------------------
  函数名:      led_release
  参数:        struct inode *inode,struct file *filp
  返回值:      int
  描述:        open对应的驱动函数
 *-----------------------------------------------------------------------------*/
int led_release(struct inode *inode,struct file *filp )
{
	if(open_state == 1)
	{
		open_state =  0;
		printk("close file suc!\n");
		return 0;
	}
	else
	{
		printk("The file has closed!\n");
		return -1;
	}
}
/*-----------------------------------------------------------------------------
  函数名:      led_ioctl
  参数:        struct inode *inode,struct file *filp,unsigned int cmd,unsigned long arg
  返回值:      int
  描述:        ioctl对应的驱动函数
 *-----------------------------------------------------------------------------*/
int led_ioctl(struct inode *inode,struct file *filp,unsigned int cmd,unsigned long arg)
{
	switch(cmd)
	{
		case LED_ON: printk("ON!\n");
						at91_set_gpio_value(AT91_PIN_PC0, 1); 			//灯亮起来
						break;

		case LED_OFF:printk("OFF\n");
						at91_set_gpio_value(AT91_PIN_PC0, 0); 			//灯灭掉
						break;

		default :printk("Error command!\n");
	}
	return 0;
}

const struct file_operations led_fop =
{
	.owner = THIS_MODULE,
	.open  = led_open,
	.ioctl = led_ioctl,
	.release = led_release,
};

struct miscdevice misc =
{
		.minor = 30,
		.fops = &led_fop,
		.name = "led3"
};
/*-----------------------------------------------------------------------------
  函数名:      gpio_init
  参数:        void
  返回值:      int
  描述:        模块初始化函数,在安装模块时候执行
 *-----------------------------------------------------------------------------*/
static int __init gpio_init(void)  
{
	int ret;

	printk("------GPIO misc test init-----\n");

	/**
	 *  混杂设备主设备号就是10,通过次设备号来区分
	 */
	ret = misc_register(&misc);				//向内核注册设备号
	if(ret < 0)
	{
		printk("Register Error!\n");
		return ret;
	}

	/**
	 * 初始化字符设备
	 */

	at91_set_gpio_output(AT91_PIN_PC0,1);		//设置引脚为输出功能,且为高电平
	return 0;	
}

/*-----------------------------------------------------------------------------
  函数名:      gpio_exit
  参数:        void
  返回值:      void
  描述:        模块卸载函数,在卸载模块时候执行
 *-----------------------------------------------------------------------------*/
static void __exit gpio_exit(void)	
{
	misc_deregister(&misc);
	open_state = 0;
	printk("GPIO test End\n");
}

module_init(gpio_init);
module_exit(gpio_exit);

MODULE_LICENSE("GPL");
从上面可以看到方便了很多,只需要misc_register注册一下,然后在一定一个结构体的时候直接关联file_operations结构即可,不用再申请设备号。

应用程序和上面一样,就是打开的文件变成了led3,这不是重点,重点是看以下操作和运行结果:

root@at91sam9260ek:/mnt/misc_dev# lsmod
Module                  Size  Used by    Not tainted
root@at91sam9260ek:/mnt/misc_dev# ls /dev |grep led          
root@at91sam9260ek:/mnt/misc_dev# insmod misc_dev.ko
------GPIO misc test init-----
root@at91sam9260ek:/mnt/misc_dev# ls /dev |grep led
led3
root@at91sam9260ek:/mnt/misc_dev# ./test
Open file suc!
ON!
OFF
ON!
OFF
ON!
OFF
ON!
OFF
ON!
OFF
ON!
OFF
ON!
OFF
ON!
OFF
ON!
close file suc!
Close the file suc!
root@at91sam9260ek:/mnt/misc_dev# 
可能已经发现了,它会自动生成设备文件,大大方便了我们的操作!

所以建议大家再使用字符设备驱动驱动led的时候,用混杂设备,比重新申请一个字符设备好用很多。

机器学习之性能度量 废话不说,本文分为两个部分: 第一部分,我对周志华教授《机器学习》这本书中性能度量知识点中疑难点的学习感悟;第二部分,我感觉该书2.3节 性能度量 中最后部分的代价曲线表述有误,苦于没找到联系教授的正确方式,故希望与广大网友一起探讨。 阅读详情

相关推荐

避坑指南:AUTOSAR FlashDriver操作DFlash模拟EEPROM时,你最容易忽略的5个细节

本文深入探讨了AUTOSAR FlashDriver在DFlash模拟EEPROM操作中最容易被忽视的五大细节问题,包括地址合法性检查、操作时序控制、并发访问冲突、电源稳定性管理和寿命管理。通过实际项目案例和工程化解决方案,帮助开发者避免常见陷阱,提升汽车电子控制单元(ECU)的可靠性和稳定性。

weixin_42741930的博客 247

构造IOCTL命令的学习心得-----_IO, _IOR, _IOW, _IOWR 幻数的理解

在编写ioctl代码之前,需要选择对应不同命令的编号。为了防止对错误的设备使用正确的命令,命令号应该在系统范围内唯一,这种错误匹配并不是不会发生,程序可能发现自己正在试图对FIFO和audio等这类非串行设备输入流修改波特率,如果每一个ioctl命令都是唯一的,应用程序进行这种操作时就会得到一个EINVAL错误,而不是无意间成功地完成了意想不到的操作。         在驱动程序里, ioc

博客模版 4万+

SAP 配额修改 + 修改记录写入实现

采购配额修改并写入修改记录 cdhdr 和 cdpos

GAVIN 1103

Linux内核字符设备Character Device

上文中我们分析了虚拟文件系统的结构以及常见的文件操作从用户态到虚拟文件系统再到底层实际文件系统的过程。而实际上我们并没有说明实际的文件系统如ext4是如何和磁盘进行交互的,这就是本文和下篇文章的重点:I/O之块设备和字符设备。输入输出设备我们大致可以分为两类:块设备(Block Device)和字符设备(Character Device)。块设备将信息存储在固定大小的块中,每个块都有自己的地址。如硬盘就是常见的块设备。字符设备发送或接收的是字节流,而不用考虑任何块结构,没有办法寻址。

嵌入式Linux内核的博客 1228

保姆级教程:用Zemax 18.9复现单模光纤耦合仿真(附康宁SMF-28e参数)

本文提供了一份详细的Zemax 18.9单模光纤耦合仿真教程,以康宁SMF-28e为例,涵盖从软件设置、材料参数输入到系统构建和优化的全流程。通过光束耦合分析和物理光学传播(POP)技术,帮助用户准确模拟光纤耦合效率,并解决常见问题,适用于光学设计初学者和专业人士。

weixin_27330481的博客 316

手把手教你用组态王KingSCADA 3.53读取S7-1200 PLC数据(保姆级图文教程)

本文提供了一份详细的组态王KingSCADA 3.53读取S7-1200 PLC数据的实战教程,涵盖从硬件连接到软件配置、变量映射到故障排查的全流程。特别针对初学者常见问题提供解决方案,帮助工程师快速实现稳定通信,提升工业自动化系统效率。

weixin_26876073的博客 680

探秘Linux特殊设备文件:(/dev/null,/dev/zero,/dev/random,/dev/urandom等)

探秘Linux特殊设备文件:(/dev/null,/dev/zero,/dev/random,/dev/urandom等)

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 3451

Jetson Orin Nano 平台适配IMX585 camera驱动调试记录

Jetson Orin Nano Devkit适配imx585 camera使用argus_camera捕获流,图片是黑色的用示波器来测量mipi信号,信号正常Jetpack版本: sensor参数: dts配置: 分析log: 如图: EBD有两行修改dts: 测试如下:log: 需要注意极性互换查看相应的原理图设置。可以使用设备树属性lane_polarity在任何lane上配置极性交换。例如, 尝试调整极性出现花屏 根据上述像素时钟配置说明调整为如下配置后,出图正常

jzwjzw19900922的博客 1322

[宏]_IO, _IOR, _IOW, _IOWR 宏的用法与解析

在驱动程序里, ioctl() 函数上传送的变量 cmd 是应用程序用于区别设备驱动程序请求处理内容的值。cmd除了可区别数字外,还包含有助于处理的几种相应信息。 cmd的大小为 32位,共分 4 个域: bit31~bit30 2位为 “区别读写” 区,作用是区分是读取命令还是写入命令。 bit29~bit15 14位为 "数据大小" 区,表示 ioctl() 中的 arg 变量传送

T的博客 2万+

Clawdbot安装教程:从零开始到接入飞书

这几天,Clawdbot把整个科技圈都刷屏了。就是这个胖逼小龙虾🦞。不过现在改名叫Moltbot了。原因很简单:被Anthropic告了。Anthropic觉得Clawdbot这名字太像Claude Code的延伸产品,要求改名。真的,Anthropic你这家伙…更离谱的是,因为Clawdbot太火,Mac Mini都被抢断货了。无数人为了用它,疯狂买Mac Mini。我刚打开美团外卖,发现居然没货了???

Maynor的博客 2179

YOLOv11改进策略【模型轻量化】| 替换骨干网络为 2024轻量化网络MoblieNetV4:移动生态系统的通用模型

一、本文介绍 本文记录的是基于MobileNet V4的YOLOv11目标检测轻量化改进方法研究。MobileNet V4通过整合UIB、Mobile MQA以及优化的NAS策略,能够在在不降低性能指标的前提下,降低计算成本。本文配置了原论文中MNv4-Conv-S、MNv4-Conv-M、MNv4-Conv-L、MNv4-Hybrid-M和MNv4-Hybrid-L五种模型,以满足不同的需求。 模型 参数量 计算量 推理速度 YOLOv11m 20.0M 67.6GFLOPs 3.5ms

Limiiiing的博客 4463

一个简单点亮LED灯的字符设备驱动

前言        后面可能会写一系列的驱动学习的文章,现在就以一个最简单的字符设备驱动开始。我的这个字符设备主要是为了点亮开发板的LED灯。        对于字符设备的文章,网上很多而且也比较简单,所以这篇文章只适合刚学的小白,大神请绕道。   正文 先把代码贴出来再把重点讲一下吧 字符设备驱动程序: #include &lt;linux/module.h&gt; #inclu...

lee_jimmy的博客 1889

Linux字符设备中的两个重要结构体(file、inode)

对于Linux系统中,一般字符设备和驱动之间的函数调用关系如下图所示 上图描述了用户空间应用程序通过系统调用来调用程序的过程。一般而言在驱动程序的设计中,会关系 struct file 和 struct inode 这两个结构体。 用户空间使用open()系统调用函数打开一个字符设备时(int fd = open("dev/demo", O_RDWR))大致有以下过程: ...

weixin_30621919的博客 608

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

linux 驱动开发 --- 字符设备与混杂设备区别

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33857679的博客 305

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

RK3399 Android7.1系统 自定义号码CMEI信息写入vendor_storage

https://blog.youkuaiyun.com/kris_fei/article/details/79580845 以上朋友写了基本概念,我们讨论下具体使用 存储SN, MAC, LAN,BT等data,主要特性是不会丢失以及系统启动各个阶段都可以访问,包括uboot, kernel, linux用户空间以及pc端 通过调用vendor_storage_write_sn()函数将CMEI信...

Eric.Xi 6914

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

linux 驱动笔记(五)

第七章 驱动编译进内核 1 将驱动编译进内核的步骤 将驱动编译成了一个*.ko,独立于zImage的,是一个独立的module,驱动使用的时候就可以安装,不用的时候可以卸载。 将驱动编译进zImage,在zImage启动的过程中,自动的安装该驱动。   1.1 将驱动的原文件,放到内核源码包中去 在drivers/char创建一个目录 led 将led_drv.c拷贝到driv

catemo的博客 1444

一个新的注册设备号方法

利用register_chrdev_region函数实现新的设备号方式

LIYOU0Z0的博客 299

_IOW的意思

§1. Linux驱动程序接口 系统调用是操作系统内核与应用程序之间的接口,设备驱动程序则是操作系统内核与机器硬件的接口。几乎所有的系统操作最终映射到物理设备,除了CPU、内存 和少数其它设备,所有的设备控制操作都由该设备特殊的可执行代码实现,此代码就是设备驱动程序。操作系统内核需要访问两类主要设备:字符设备和块设备。与 此相关主要有两类设备驱动程序,字符设备驱动程序和块设备驱动程序。Li

Lidong_Zhou的专栏 1万+

Linux驱动添加的基本流程

1 按驱动框架编写驱动程序 (例如为字符设备)   文件名为:“HX_at91_led.c”   2 修改在内核源码中添加对驱动的支持修改“Kconfig”文件(/drivers/char/)(字符驱动在此添加,其他驱动在相应的文件目录下添加即可)   在适当的位置添加(加以注释能和原来的区别开来)   menu “Character devices”   ###############

xue806263085的专栏 544

字符设备驱动程序的编写_点亮LED灯

其实程序不是一句一句写的,而是一个函数一个函数写,

菜鸟笔记 1956

wdm设备驱动程序开发pdf_灵动微课堂(第106讲) | MM32 USB功能学习笔记 —— WinUSB设备...

万事大吉 年年有余在上一节我们介绍了MM32 MCU的HID功能,对于HID来说,虽然免驱,但是速度相对慢,有没有更好的选择呢?当然有,那就是WinUSB,速度更快,对于现在的PC来说,基本上都是Win10,WinUSB在Win10免驱,此节我们就介绍如何使用MM32 MCU的WinUSB功能。WinUSB设备是一种通用串行总线(USB)设备,其固...

weixin_39883065的博客 509

segmentation fault----在Linux下真是一个蛋疼的错误,总结一下出现这错误的经历

这真是一个蛋疼的错误!     笔者经历过几次这个错误,一直也没有注意,知道后来经常遇到这个错误,觉得应该总结出来,引以为戒,同时也为各位同仁们,增加错误库,提高解决问题的速度。     这个错误,查一下就知道是段错误,一般是指针出错,或者内容益处,反正就是一些不正常操作,系统无法执行下去了,就会产生这个错误。     废话,这谁都知道,但是要根据具体问题,具体分析,说的那么虚,谁知道到底为

memoryjs的专栏 1万+

Linux下ppp拨号+3G模块(evdo 中兴MC8630模块)

物联网的发展,嵌入式节点具备3G无线上网功能是个必不可少的功能,奈何网上的资料多数以WCDMA为主,电信的evdo资料不是很多,笔者经过一番实验,搜寻了一些网站,终于在开发板上,将EVDO模块(中兴MC8630)成功拨号上网,现分享步骤如下: 3G模块的速度非常快,所以普通的UART串口已经不能满足速度,所以会通过芯片的USB口来进行数据交互。硬件连接这里就忽略了,有兴趣的朋友可以买个usb口的

memoryjs的专栏 1万+

嵌入式中为什么要用Linux操作系统?

其实我一直都很想问这个问题,Linux是个性能非常好的操作系统,但是同时也是一个很蛋疼的系统,不好使用,任何从windows下转过来用Linux的人都会非常不喜欢它的操作,非常麻烦。 带着这个问题,我问了我们的总监,他说:“它免费,而且驱动非常齐全,我要加个功能,只要配置一下就行了?如果在裸机上,我要加个IP网络功能,还要移植一个lwip(小型的协议栈)”。 用了Linux这么长时间,我自己也

memoryjs的专栏 1万+
上一篇: Linux设备驱动总结(二)-----Linux让LED灯闪起来
下一篇: Linux设备程序设计(四)------Linux下串口通讯
memoryjs
博客等级 码龄18年 240粉丝 113原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值