linux下nrf2401的驱动,主控芯片是友善的tiny core linux4412开发板,为什么不使用spi驱动,而是

【图片】有没有人用友善之臂的tiny4412开发平台?【嵌入式吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:49,469贴子:
有没有人用友善之臂的tiny4412开发平台?收藏
该平台使用三星 Exynos4412,四核1.5GHz处理器(同 三星Galaxy S III ),可惜刚入手不会使用,不知从何处下手。求指教。
无锡嵌入式培训,达内嵌入式培训,历时15年,总监级讲师亲授,8师辅导1学员,40万学员见证!达内嵌入式课程与ARM公司联合教学.毕业获ARM公司颁发的嵌入式工程师国际认证证书.
主板?  ✎﹏₯㎕﹍﹍不要揪不要揪我的小尾巴                揪坏了你负责么 ็็
如果按照文档步骤还不会用就没办法了
太新的架构不敢买 我买的210的
我也是用这个开发板,学习思路是,先搭开发环境,从裸板驱动程序开始学,然后是linux内核模板驱动,把lcd驱动,pci驱动,iic驱动的框架理清楚。往上就可以编写Android底层驱动了。
我博客地址www#cnblogs#com/linrong/category/634984#html (#改成.),里面是tiny4412裸板驱动开发的学习笔记,希望对你有帮助。
在用讯为的4412开发板,资料和服务都挺好
准备买开发板拿来开发硬件部分,还真不知道水有多深
我的是tiny6410
板子不行.超级不稳定.测试的时候是正常的,用了一段时间,问题太多.尼玛一百多张板,全换.浪费钱.技术电话根本打不通.销售像机器一样,喊发邮件,没有想到这样的公司能存活.
我用过tiny4412搞过LCD驱动
我用的这个板子 不过是1506新版本的 好多接口都引出来了
4412有你们说的那么不堪么??
从官方文档下手
u-boot烧到内存卡无法启动驱动装不上怎么回事啊
淘宝一套多少钱
有没有人再用jtag调试的?
登录百度帐号推荐应用SPI驱动之子系统架构及重要数据结构 - CSDN博客
SPI驱动之子系统架构及重要数据结构
据个人所知,Linux下SPI一直是处于被“忽略”的角色,市场上大部分板子在板级文件里面都没有关于SPI的相关代码(例如,mini2440),而大部分讲解驱动的的书籍也没有专门的一章来讲述关于Linux下SPI方面的内容(例如,宋宝华的Linux设备驱动开发详解)。与I2C相比,SPI就是一个不被重视的“家伙”,为什么?我也不甚了解。由于项目需要在UT4412BV01上移植SPI,查阅网络上几乎所有的SPI相关资料,都是对S3C2440和S3C6410的SPI驱动分析,而EXYNOS4412却只字不提,但仔细一想它们彼此之间是相通的,遂研究一番记于此,以便日后查阅之便。
1. SPI子系统架构详解
SPI总线上有两类设备:一类是主控端,通常作为SOC系统的一个子模块出现,比如很多嵌入式MPU中都常常包含SPI模块;一类是受控端,例如一些SPI接口的Flash、传感器等等。主控端是SPI总线的控制者,通过使用SPI协议主动发起SPI总线上的会话,而受控端则被动接受SPI主控端的指令,并作出相应的响应。
图还未画好,之后补上,补上后在一些写分析,哈哈。。。
2. 重要数据结构
(1)spi_master
struct spi_master用来描述一个SPI主控制器,我们一般不需要自己编写spi控制器驱动。
* 结构体master代表一个SPI接口,或者叫一个SPI主机控制器,
* 一个接口对应一条SPI总线,master-&bus_num则记录了这个总线号。
struct spi_master {
struct device
struct list_
* 总线编号,从零开始。
* 系统会用这个值去和系统中board_list链表中加入的每一个boardinfo结构中的每一个spi_board_info中的bus_num进行匹配,
* (每个boardinfo结构都是一个spi_board_info的集合,每一个spi_board_info都是对应一个SPI(从)设备的描述)
* 如果匹配上就说明这个spi_board_info描述的SPI(从)设备是链接在此总线上的,因此就会调用spi_new_device去创建一个spi_device。
/* 支持的片选的数量。从设备的片选号不能大于这个数.该值当然不能为0,否则会注册失败 */
/* some SPI controllers pose alignment requirements on DMAable
* let protocol drivers know about these requirements.
/* spi_device.mode flags understood by this controller driver */
/* other constraints relevant to this driver */
#define SPI_MASTER_HALF_DUPLEX BIT(0)
/* can't do full duplex */
#define SPI_MASTER_NO_RX BIT(1)
/* can't do buffer read */
#define SPI_MASTER_NO_TX BIT(2)
/* can't do buffer write */
/* lock and mutex for SPI bus locking */
spinlock_t
struct mutex
/* flag indicating that the SPI bus is locked for exclusive use */
(*setup)(struct spi_device *spi); //根据spi设备更新硬件配置
* 添加消息到队列的方法。此函数不可睡眠,其作用只是安排需要的传送,
* 并且在适当的时候(传送完成或者失败)调用spi_message中的complete方法,来将结果报告给用户。
(*transfer)(struct spi_device *spi, struct spi_message *mesg);
/*cleanup函数会在spidev_release函数中被调用,spidev_release被登记为spidev的release函数*/
(*cleanup)(struct spi_device *spi);
spi控制器的驱动在kernel3.0.15/arch/arm/mach-exynos/mach-smdk4x12.c中声明和注册一个平台设备,然后在kernel3.0.15/driver/spi下面建立一个平台驱动。spi_master注册过程中会扫描kernel3.0.15/arch/arm/mach-exynos/mach-smdk4x12.c中调用spi_register_board_info注册的信息,为每一个与本总线编号相同的信息建立一个spi_device。根据Linux内核的驱动模型,注册在同一总线下的驱动和设备会进行匹配。spi_bus_type总线匹配的依据是名字,这样当自己编写的spi_driver和spi_device同名的时候,spi_driver的probe方法就会被用,spi_driver就能看到与自己匹配的spi_device了。
(2)spi_device
struct spi_device用来描述一个SPI从设备。
* 该结构体用于描述SPI设备,也就是从设备的相关信息。
* 注意:SPI子系统只支持主模式,也就是说SOC上的SPI只能工作在master模式,
* 外围设备只能为slave模式。
struct spi_device {
struct device
struct spi_master * //对应的控制器指针
max_speed_ //spi传输时钟
chip_ //片选号,用来区分同一主控制器上的设备
//各bit的定义如下,主要是时钟相位/时钟极性
#define SPI_CPHA 0x01
/* clock phase */
#define SPI_CPOL 0x02
/* clock polarity */
#define SPI_MODE_0 (0|0)
/* (original MicroWire) */
#define SPI_MODE_1 (0|SPI_CPHA)
#define SPI_MODE_2 (SPI_CPOL|0)
#define SPI_MODE_3 (SPI_CPOL|SPI_CPHA)
#define SPI_CS_HIGH 0x04
/* chipselect active high? */ //片选电位为高
#define SPI_LSB_FIRST 0x08
/* per-word bits-on-wire */ //先输出低比特位
#define SPI_3WIRE 0x10
/* SI/SO signals shared */ //输入输出共享接口,此时只能做半双工
#define SPI_LOOP 0x20
/* loopback mode */
#define SPI_NO_CS 0x40
/* 1 dev/bus, no chipselect */
#define SPI_READY 0x80
/* slave pulls low to pause */
bits_per_ //每个字长的比特数
//使用到的比特数
*controller_
*controller_
modalias[SPI_NAME_SIZE]; //spi是设备的名字
* likely need more hooks for more protocol options affecting how
* the controller talks to each chip, like:
- memory packing (12 bit samples into low bits, others zeroed)
- priority
- drop chipselect after each word
- chipselect delays
(3)spi_driver
struct spi_driver用于描述SPI从设备驱动。驱动核心将根据driver.name和spi_board_info的modalias进行匹配,如果modalias和name相等,则绑定驱动程序和kernel3.0.5/arch/arm/mach-exynos/mach-smdk4x12.c中调用spi_register_board_info注册的信息对应的spi_device设备。它们的形式和struct platform_driver是一致的。
struct spi_driver {
const struct spi_device_id *id_ //可以驱动的设备表,也就是说该驱动可以驱动一类设备
(*probe)(struct spi_device *spi); //和spi_device匹配成功之后会调用这个方法.因此这个方法需要对设备和私有数据进行初始化
(*remove)(struct spi_device *spi); //解除spi_device和spi_driver的绑定,释放probe申请的资源
(*shutdown)(struct spi_device *spi); //一般牵扯到电源管理会用到,关闭
(*suspend)(struct spi_device *spi, pm_message_t mesg); //一般牵扯到电源管理会用到,挂起
(*resume)(struct spi_device *spi); //一般牵扯到电源管理会用到,恢复
struct device_driver
};(4)spi_transfer
struct spi_transfer是对一次完整的数据传输的描述。每个spi_transfer总是读取和写入同样的长度的比特数,但是可以很容易的使用空指针舍弃读或写,为spi_transfer和spi_message分配的内存应该在消息处理期间保证是完整的。
struct spi_transfer {
/* it's ok if tx_buf == rx_buf (right?)
* for MicroWire, one buffer must be null
* buffers must work with dma_*map_single() calls, unless
spi_message.is_dma_mapped reports a pre-existing mapping
const void *tx_ //要写入设备的数据(必须是dma_safe),或者为NULL
*rx_ //要读取的数据缓冲(必须是dma_safe),或者为NULL
//tx和tr的大小(字节数),这里不是指它的和,而是各自的长度,它们总是相等的
dma_addr_t tx_ //如果spi_message.is_dma_mapped是真,这个是tx的dma地址
dma_addr_t rx_ //如果spi_message.is_dma_mapped是真,这个是rx的dma地址
unsigned cs_change:1; //影响此次传输之后的片选,指示本次transfer结束之后是否要重新片选并调用setup改变设置
bits_per_ //每个字长的比特数,如果是0,使用默认值
delay_ //此次传输结束和片选改变之间的延时,之后就会启动另一个传输或者结束整个消息
speed_ //通信时钟,如果是0,使用默认值
struct list_head transfer_ //用来连接的双向链表节点
(5)spi_message
struct spi_message就是对多个spi_transfer的封装。在消息需要传递的时候,会将spi_transfer通过自己的transfer_list字段挂到spi_message的transfers链表头上。spi_message用来原子的执行spi_transfer表示的一串数组传输请求。这个传输队列是原子的,这意味着在这个消息完成之前不会有其它消息占用总线。消息的执行总是按照FIFO的顺序,向底层提交spi_message的代码要负责管理它的内存空间。未显示初始化的内存需要使用0来初始化。为spi_transfer和spi_message分配的内存应该在消息处理期间保证是完整的。
struct spi_message {
struct list_head
//此次消息的传输队列,一个消息可以包含多个传输段
struct spi_device * //传输的目的设备
is_dma_mapped:1; //如果为真,此次调用提供dma和cpu虚拟地址
/* REVISIT:
we might want a flag affecting the behavior of the
* last transfer ... allowing things like &read 16 bit length L&
* immediately followed by &read L bytes&.
Basically imposing
* a specific message scheduling algorithm.
* Some controller drivers (message-at-a-time queue processing)
* could provide that as their default scheduling algorithm.
* others (with multi-message pipelines) could need a flag to
* tell them about such special cases.
/* completion is reported through a callback */
(*complete)(void *context); //异步调用完成后的回调函数
* //回调函数的参数
actual_ //此次传输的实际长度
//执行的结果,成功被置0,否则是一个负的错误码
/* for optional use by whatever driver currently owns the
* spi_message ...
between calls to spi_async and then later
* complete(), that's the spi_master controller driver.
struct list_head
(6)两个重要的板级结构
两个板级结构,其中spi_board_info用来初始化spi_device,s3c64xx_spi_info用来初始化spi_master。这两个板级的结构需要在移植的时候在kernel3.0.15/arch/arm/mach-exynos/mach-smdk4x12.c中初始化。
spi_board_info(kernel3.0.15/linux/include/spi/spi.h)
/* 该结构也是对SPI从设备(spi_device)的描述,只不过它是板级信息,最终该结构的所有字段都将用于初始化SPI设备结构体spi_device */
struct spi_board_info {
/* the device name and module name are coupled, like platform_
* &modalias& is normally the driver name.
* platform_data goes to spi_device.dev.platform_data,
* controller_data goes to spi_device.controller_data,
* irq is copied too
modalias[SPI_NAME_SIZE]; //spi设备名,会拷贝到spi_device的相应字段中.这是设备spi_device在SPI总线spi_bus_type上匹配驱动的唯一标识
const void *platform_ //平台数据
*controller_
/* slower signaling on noisy or low voltage boards */
max_speed_ //SPI设备工作时的波特率
/* bus_num is board specific and matches the bus_num of some
* spi_master that will probably be registered later.
* chip_select reflects how this chip is
* it's less than num_chipselect.
bus_ //该SPI(从)设备所在总线的总线号,就记录了所属的spi_master之中的bus_num编号.一个spi_master就对应一条总线
chip_ //片选号.该SPI(从)设备在该条SPI总线上的设备号的唯一标识
/* mode becomes spi_device.mode, and is essential for chips
* where the default of SPI_CS_HIGH = 0 is wrong.
//参考spi_device中的成员
/* ... may need additional spi_device chip config data here.
* avoid stuff prot but include stuff
* needed to behave without being bound to a driver:
- quirks like clock rate mattering when not selected
};s3c64xx_spi_info(kernel3.0.15/arch/arm/plat-samsung/include/plat/s3c64xx-spi.h)struct s3c64xx_spi_info {
int src_clk_
char *src_clk_
bool clk_from_
int num_ //总线上的设备数
int (*cfg_gpio)(struct platform_device *pdev);
/* Following two fields are for future compatibility */
int fifo_lvl_
int rx_lvl_
int tx_st_
boardinfo是用来管理spi_board_info的结构,spi_board_info在板级文件中通过spi_register_board_info(struct spi_board_info const *info, unsigned n)交由boardinfo来管理,并挂到board_list链表上。
boardinfo(kernel3.0.15/drivers/spi/spi.c)
struct boardinfo {
struct list_head
//用于挂到链表board_list上
struct spi_board_info board_ //存放结构体spi_board_info
};spi_register_board_info(kernel3.0.15/drivers/spi/spi.c)
int __init
spi_register_board_info(struct spi_board_info const *info, unsigned n)
struct boardinfo *
bi = kzalloc(n * sizeof(*bi), GFP_KERNEL);
return -ENOMEM;
for (i = 0; i & i++, bi++, info++) {
struct spi_master *
memcpy(&bi-&board_info, info, sizeof(*info));
mutex_lock(&board_lock);
list_add_tail(&bi-&list, &board_list);
list_for_each_entry(master, &spi_master_list, list)
spi_match_master_to_boardinfo(master, &bi-&board_info);
mutex_unlock(&board_lock);
本文已收录于以下专栏:
相关文章推荐
以后补上。。。
在内核的drivers/spi/目录下有两个spi主控制器驱动程序:spi_s3c24xx.c和spi_s3c24xx_gpio.c其中spi_s3c24xx.c是基于s3c24xx下相应的spi接口...
最近项目需要,需要在UT4412BV01上移植SPI驱动,板子需要驱动SPI设备,上网找了很多资源,但是很多都是有问题,最终在基本理解驱动结构的前提下,将SPI驱动顺利移植到UT4412BV01。
spidev形式的linux驱动
在没有加上 spi 的设备的时候,Linux 系统中的 spi 相关的“节点”有:
./sys/bus/spi
./sys/bus/spi/devi...
/***************************************************************************************************...
Exynos4412 SPI配置
Linux内核层就不说了,可以参考资料:
http://www.embedu.org/Column/Column367.htm
要说的时关于4412特别的部分,...
开发板:tiny4412SDK + S702 + 4GB Flash
要移植的内核版本:Linux-4.4.0 (支持device tree)
u-boot版本:友善之臂自带的 U-Boo...
Allein.Cao原创作品,转载请注明出处:
http://blog.csdn.net/alleincao/article/details/7525977
内核版本:2.6.32.2
开发板:tiny4412SDK + S702 + 4GB Flash
要移植的内核版本:Linux-4.4.0 (支持device tree)
u-boot版本:友善之臂自带的 U-Boo...
他的最新文章
讲师:宋宝华
讲师:何宇健
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)Linux设备驱动开发——1.tiny4412出厂系统的烧写 - CSDN博客
Linux设备驱动开发——1.tiny4412出厂系统的烧写
本人学习Linux设备驱动的记录,
使用的开发平台:友善支臂的tiny4412开发板
开发板资料文件目录:&E:\driver\A9
一、tiny4412出厂系统的烧写
大致流程为:
SD卡划分保留分区——》烧写到保留分区——》将内核镜像、镜像拷贝到卡里——》插入开发板,卡启动——》切换到eMMC启动
1.SD卡分区工具 :&E:\driver\A9\tools\SD-Flasher.exe&&
2.镜像文件:
& &E:\driver\A9\images\
1.以管理员运行分区卡,把写入划分的保留分区
Bootloader文件是:E:\driver\A9\images\Superboot4412.bin
2.将文件夹复制到卡根目录
image文件夹内容介绍:
Android:安卓系统镜像
Linux: &Linux系统镜像
FriendlyARM.ini:配置文件,通过配置可以选择烧写还是,以及传递给系统的参数,配置文件关键内容如下:
Action = Install
OS = Linux&span style=&white-space:pre&& &/span&#选择系统,Android or Linux
################### Linux ####################
Linux-BootLoader = Superboot4412.bin
Linux-Kernel = Linux/zImage
Linux-CommandLine = root=/dev/mmcblk0p1 rootfstype=ext4 console=ttySAC0,115200 init=/linuxrc ctp=2 skipcali=y ethmac=1C:6F:65:34:51:7E
Linux-RamDisk = Linux/ramdisk-u.img
Linux-RootFs-InstallImage = Linux/rootfs_qtopia_qt4.img
3.SD卡插到开发板,通过拨码开关开关,首先启动方式为SD卡启动,启动之后改为eMMC启动
----&系统启动成功!
4.1&Linux组成:()、内核()、根文件系统()
4.2 我们可以知道友善之臂提供的Superboot4412.bin有如下功能:
SD卡启动时,Superboot4412.bin的功能是:烧写系统到
Superboot4412.bin:包含了、、本身的核心功能(从卡读取配置文件,根据配置文件读取相应的系统镜像文件到,把中的数据写入到存储芯片中)
eMMC启动时,Superboot4412.bin的功能是:引导系统
Superboot4412.bin:包含了、、本身的核心功能(加载到,启动操作系统)
本文已收录于以下专栏:
相关文章推荐
1、制作用于安装系统的SD卡
一般Tiny4412出厂时已经安装好Android4.2.2系统,以后要重新烧写系统,则需要SD卡来烧写系统,无论是通过USB烧写,还是SD卡脱机烧写,都需要使用SD卡...
转自:/pengdonglin137/p/5143516.html
阅读目录(Content)
作者信息平台简介步骤
转自:/pengdonglin137/p/5146791.html
阅读目录(Content)
作者信息平台简介注意
一、设备树反...
另一篇文章讲述了如何解压和生成system.img, 那是针对yaffs2格式的文件系统镜像。
目前越来越多的Android手机放弃了nand, 更多采用了emmc为内部存储设备。
一、VFS 虚拟文件系统基础概念
        Linux 允许众多不同的文件系统共存,并支持跨文件系统的文件操作,这是因为有虚拟文件系统的存在。虚拟文件系统,即VFS(Virtual File S...
/* 代码清单8-2 */
/* 初始化EEPROM驱动程序 */
/* Driver entry points */
static struct file_operation eep_fops = ...
写了好久的字符设备驱动,是时候看下块设备驱动程序设计方法了,块设备驱动和字符设备不同,字符设备是直接和虚拟文件系统进行交互,而块设备驱动则是通过块缓冲/调度层间接和虚拟文件系统交互;块设备驱动数据访问...
本文的主要内容目录:
一、DHT11的工作原理
二、编写DHT11的驱动程序
一、DHT11的工作原理
1、DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传 感器。...
上节,我们讲解了如何写第一个linux字符设备驱动程序,这节,我们将代码做一下修改。如下:#include
他的最新文章
讲师:宋宝华
讲师:何宇健
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)tiny4412驱动开发(31)
前面,我们基本已经学会怎么去编写一个简单的字符设备驱动程序了,这节,我们来看看友善之臂中提供的led驱动。参考之前写的文章,我们已经知道LED的GPIO口,和一些配置信息:http://blog.csdn.net/morixinguan/article/details/在友善之臂提供的内核中,已经有一个文件对这些GPIO做了对应的封装,在drivers/gpio/gpio_dvs/exynos4x12_gpio_dvs.c中:我们打开这个文件,找到LED对应的四个IO口的宏如下:EXYNOS4212_GPM4(0),EXYNOS4212_GPM4(1),EXYNOS4212_GPM4(2),EXYNOS4212_GPM4(3),操作GPIO,我们需要这三个.h的头文件,#include &linux/gpio.h&#include &mach/gpio.h&#include &plat/gpio-cfg.h&这几个头文件有通用的,也有与平台相关的。需要以下几个函数:gpio_requestgpio_set_values3c_gpio_cfgpingpio_set_valuegpio_free接下来看源码的注释分析:#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&
#include &plat/gpio-cfg.h&
#define DEVICE_NAME &leds&
//找到LED管脚对应的宏
static int led_gpios[] = {
EXYNOS4212_GPM4(0),
EXYNOS4212_GPM4(1),
EXYNOS4212_GPM4(2),
EXYNOS4212_GPM4(3),
#define LED_NUM
ARRAY_SIZE(led_gpios)
//操作LED灯
//传入1,亮灯
//传入0,灭灯
static long tiny4412_leds_ioctl(struct file *filp, unsigned int cmd,
unsigned long arg)
switch(cmd) {
if (arg & LED_NUM) {
return -EINVAL;
//LED是低电平点亮的,传入1亮,传入0灭,是因为cmd做了取反的操作
//gpio_set_value这个函数是对IO赋值
gpio_set_value(led_gpios[arg], !cmd);
//printk(DEVICE_NAME&: %d %d\n&, arg, cmd);
return -EINVAL;
//led操作文件结构体
static struct file_operations tiny4412_led_dev_fops = {
= THIS_MODULE,
.unlocked_ioctl = tiny4412_leds_ioctl,
//杂类设备结构体
static struct miscdevice tiny4412_led_dev = {
= MISC_DYNAMIC_MINOR,
= DEVICE_NAME,
= &tiny4412_led_dev_fops,
//led驱动加载
static int __init tiny4412_led_dev_init(void) {
for (i = 0; i & LED_NUM; i++) {
//对GPIO注册与申请内存,并给设备驱动取名为LED
ret = gpio_request(led_gpios[i], &LED&);
if (ret) {
printk(&%s: request GPIO %d for LED failed, ret = %d\n&, DEVICE_NAME,
led_gpios[i], ret);
//调用该函数,将所有的IO设置为输出状态
s3c_gpio_cfgpin(led_gpios[i], S3C_GPIO_OUTPUT);
//默认情况下所有的IO初始化都亮
gpio_set_value(led_gpios[i], 1);
//杂类设备注册
ret = misc_register(&tiny4412_led_dev);
printk(DEVICE_NAME&\tinitialized\n&);
static void __exit tiny4412_led_dev_exit(void) {
for (i = 0; i & LED_NUM; i++) {
//释放申请的IO和内存
gpio_free(led_gpios[i]);
//注销杂类设备驱动
misc_deregister(&tiny4412_led_dev);
module_init(tiny4412_led_dev_init);
module_exit(tiny4412_led_dev_exit);
MODULE_LICENSE(&GPL&);
MODULE_AUTHOR(&FriendlyARM Inc.&);
有了这个框架,我们就可以拿来修改了,我们还可以往tiny4412_led_dev_fops中继续添加read,write,close,lseek函数,来实现LED的其它操作,有兴趣的同学可以试一试,这些驱动在以前我已经测试过了,这里仅仅只是对这些知识点进行再次总结。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:646782次
积分:11397
积分:11397
排名:第1472名
原创:468篇
转载:78篇
评论:190条
文章:35篇
阅读:43234
文章:16篇
阅读:11428
文章:34篇
阅读:28143
文章:23篇
阅读:38944
文章:13篇
阅读:25865
文章:23篇
阅读:16575
文章:43篇
阅读:80780
文章:45篇
阅读:72118
文章:130篇
阅读:238808
(4)(13)(9)(27)(24)(16)(6)(20)(12)(28)(19)(18)(18)(23)(28)(50)(12)(17)(24)(34)(36)(82)(19)(7)(1)
扫一扫关注我的微信公众号

我要回帖

更多关于 友善之臂 tiny4412 的文章

 

随机推荐