导航:首页 > 编程系统 > linuxled驱动

linuxled驱动

发布时间:2023-08-06 23:50:35

1. 嵌入式需要学什么嵌入式需要学哪些课程和内容

1.1 有哪些设备使用单片机或linux

所有的电子产品,所用技术都可以认为要么是单片机,要么是Linux;GUI方面主要是QT/Android,它们都是运行于Linux之上的。我们说的单片机不使用操作系统,但是使用单片机设备肯定远远超过Linux。很多人也是先学习单片机,从单片机进入电子工程师行业,日常生活中,有哪些产品使用单片机、Linux呢?下面举一些例子:

  • 下面我们用类比和逻辑推导出嵌入式Linux系统的组成,没错,“推导”。
    从上图可以知道:

  • 组成:嵌入式Linux系统= bootloader + linux内核 + 根文件系统(里面含有APP)。

  • bootloader:它的目的是启动内核,去哪等读内核?读到哪里?去Flash等外设读内核,存到内存里去。所以需要有Flash里外设的驱动能力,为了调试方便还会有网络功能。所以,可以认为 booloader = 裸机集合,它就是一个复杂的单片机程序

  • Linux内核:Linux内核的最主要目的是去启动APP,APP保存在哪里?保存在“根文件系统”里。“根文件系统”又保存在哪里?在Flash、SD卡等设备里,甚至可能在网络上。所以Linux内核要有这些Flash、SD卡里设备的驱动能力。

  • 不仅如此,Linux内核还有进程调度能力、内存管理等功能。

  • 所以:Linux内核 = 驱动集合 + 进程调度 + 内存管理等。

  • 2.3 要学习bootloader吗

  • Bootloader有很多种,常用的叫u-boot。

  • 在实际工作中,对于u-boot基本上是修修改改,甚至不改。但是u-boot本身是很复杂的,比如为了便于调试,它支持网络功能;有些内核是保存在FAT32分区里,于是它要能解析FAT32分区,读FAT32分区的文件。

  • 花那么多精力去学习u-boot,但是工作中基本用不到,这对初学者很不友善。

  • 所以,对于初学者,我建议:理解u-boot的作用、会使用u-boot的命令,这就可以了。

  • 如果你的工作就是修改、完善bootloader,那么再去研究它吧。

  • 2.4 要学习Linux内核、要学习驱动程序吗

  • 之前我们说过Linux内核 = 驱动集合 + 进程调度 + 内存管理等,如果要学习Linux内核,从驱动程序入手是一个好办法。

  • 但是人人都要学习Linux内核、人人都要学习Linux驱动吗?显然不是。

  • 作为初学者,懂几个简单的驱动程序,有利于工作交流;理解中断、进程、线程的概念,无论是对驱动开发、应用程序开发,都是很有好处的。

  • 所以对于初学者,建议前期只学习这几个驱动:LED、按键、中断。

  • LED驱动程序:这是最简单的驱动程序。

  • 按键驱动程序:它也比较简单,从它引入“中断”。

  • 中断:从“中断”它可以引入:休眠-唤醒、进程/线程、POLL机制、异步通知等概念。这些概念无论是对驱动开发,还是对应用开发,都很重要。

  • 所以,对于初学者,我建议必须学习这几个驱动:LED、按键、中断。

  • 入门之后,如果你想从事内核开发、驱动开发,那么可以去钻研几个驱动程序(输入系统、I2C总线、SPI总线等),掌握若干个大型驱动程序后,你对内核的套路就有所了解了,再去研究其他部分(比如进程管理、文件系统)时你会发现套路是如此通用。

  • 摄像头(VL42)、声卡ALSA驱动是Linux中比较复杂的2类驱动,它们是很难的,如果工作与此相关再去研究。

  • 2.5,要学习Linux应用程序吗?先学一些基础技能

  • 要学,即使以后你只想研究内核,一些基本的应用开发编写能力也是需要的:

  • 基本设备的访问,比如LCD、输入设备

  • 进程、线程、进程通信、线程同步与互斥

  • 休眠-唤醒、POLL机制、信号

  • 网络编程

  • ①②③部分的知识,跟驱动有密切的关系,它们是相辅相承的。

  • 掌握了基本驱动开发能力、基本应用开发能力之后,在工作中你就可以跟别人友好沟通了,不至于一脸懵逼。

  • 2.6,应用程序是怎么启动的?要了解一下根文件系统

  • 你辛辛苦苦写出了应用程序,怎么把它放到板子上,让它开机就自动启动?

  • 你写的程序,它依赖于哪些库,这些库放到板子上哪个目录?

  • 怎么做一个可升级的系统?即使升级中途断电了,也要保证程序至少还可以运行老的版本

  • 这些都需要我们了解一下根文件系统。

  • 先了解一下init进程:它要读取配置文件,根据配置文件启动各个APP。

  • 了解了init进程,你就了解了根文件系统的组成,就可以随心所欲裁剪系统,为你的项目制作出最精简的系统。

  • 第3章 学习方法

    3.1 先不要打破砂锅问到底

  • 嵌入式涉及的东西太多太杂了,如果心里没有主线,碰到什么都要去研究个透彻,最终反而忘记自己要学什么了。

  • 嵌入式涉及硬件知识、软件知识,软件里涉及汇编、ARM架构、C语言、Makefile、Shell;又分为bootloader、内核、驱动、基本的APP、GUI。

  • 比如我们会用到Makefile,了解它的基本规则,会用我们提供的Makefile就可以。

  • 不需要深入研究那些make函数,因为在工作中都有现成的Makefile给你使用,不需要自己去编写一套Makefile。何必花上好几天去深入研究它呢?

  • 比如我们会用到bootloader,难道又要花上几个月来深入研究u-boot吗?工作中基本不需要改u-boot,会用那几个命令就可以。

  • 甚至有些学员先去买本shell的书来学习shell命令,何必?我们在视频中用到什么命令,你不懂时再去网络一下这些命令就可以了。

  • 不要脱离初学者的主线:应用基础、驱动基础。有了这2个基础后,你想深入研究某部分时,再去花时间吧。

  • 3.2 思路要清晰,不怕抄代码

  • 视频里的代码,请你一定要自己去写一次、写多次。为什么我现在写驱动那么熟?我2009年在华清远见上课时,

  • 每次上课我都要给学生写一次那些驱动,十几次下来闭着眼睛都知道内核的套路了。

  • 记不住那些函数?我也记不住,我都是去参考同类的驱动程序,这又不是闭卷考试。

  • 但是要理清楚思路,你写这个程序要完成什么功能、怎么实现这些功能?这个要弄清楚。

  • 有了思路后再写代码,不知道怎么写?没关系,看看视频,看看示例,然后关闭视频看看能否自己写出来。

  • 3.3 对自己的方向很了解,我只能带你到这里了

  • 我的专长是操作系统,是快速地带领大家掌握一些项目开发的基础知识。

  • 如果你决定深入研究某方面时,我并不能带你多久。你要去看源码,去看这方面的专业书籍。

  • 比如想深入钻研内核的内存管理时,它有页表映射(你需要阅读ARM架构的手册)、SLAB分配器、vmalloc/malloc实现、mmap实现、缺页中断、父进程子进程之间的页面管理等等,内容非常多。有时候连书籍都没有,你需要直接啃代码。

  • 当你想从事某个行业时,就需要深入研究行业相关的知识。

  • 比如CAN总线,它可以写成一本书:CAN协议、CAN报文、Socket CAN、车身网络拓扑结构,CAN应用报文,CAN网络管理报文,CAN诊断报文。

  • 想做物联网网关,需要深入研究MQTT,MQTT协议相对简单,但是MQTT英文原版协议有130多页,中文版有近100页,是一本小书了。

  • 每个行业都有自己的业务逻辑,在掌握基本的编程能力之一,你需要结合具体的业务去深入学习。

  • 2. ARM linux设备驱动,写的驱动必须在编译内核的时候添加到内核才能用吗比如led驱动,我生成

    linux2.6以后的内核在加载驱动的时候是可以动态添加的,不用每次添加之后都make zImage,
    你只用专先编译一边,然后就可以一属直用这个做驱动的开发喽,
    只要生成了led.ko,然后insmod led.ko,就可以了,至于是不是用应用层,我觉得你还是先学一下应用层的东西吧,比如nuix系统高级编程之内的书,

    3. linux系统编写驱动时,怎样用C语言去访问硬件

    在linux系统上编写驱动要访问硬件,首先要地址映射,因为有了linux系统后程序中所使用是地址都是虚拟地址,所以需要经过ioremap重映射后得到需要的虚拟地址,然后用ioread32和iowrite32就可以进行读写操作了。如下是led的操作:
    int init_led_device(struct led_dev_t *l)
    {
    l->phys = 0x7F008000;
    l->virt = ioremap(l->phys, SZ_4K);

    l->gpmcon = l->virt + 0x820;
    l->gpmdat = l->virt + 0x824;
    return 0;
    }
    void led_config(struct led_dev_t *l)
    {
    l->reg = ioread32(l->gpmcon);
    l->reg &= ~(0xf << 0);
    l->reg |= (0x1 << 0);
    iowrite32(l->reg, l->gpmcon);
    }

    4. linux驱动编写过程中遇到的几个问题及解决

    1、显示错误:unknown field 'ioctl' specified in initializer
    解决办法,查看内核include/linux/fs.h文件,发现里边定义的struct file_operations中没有ioctl,这里我们用.unlocked_ioctl取代,形参去掉 struct inode*。
    2、在应用程序中,将ioctl替换为unlocked_ioctl后,会出现以下错误:undefined reference to `unlocked_ioctl'。因为系统调用ioctl是没有改变的,还是原来的系统调用接口,只是系统调用的实现中,ioctl()变成了unlocked_ioctl,在应用层你根本不用关注内核中的这些实现上的改变,你只需要按照系统调用的用法用就可以了。所以把应用程序里的unlocked_ioctl改为ioctl,编译,OK,通过。
    3、驱动编译完成,在开发板上insmod,出现以下错误:
    WARNING: at lib/kobject.c:595 kobject_put+0x50/0x64()
    kobject: '扑' (cbc60a00): is not initialized, yet kobject_put() is being called.
    ---[ end trace da227214a82491b9 ]---
    insmod: cannot insert 'led_dev.ko': Cannot allocate memory
    原来是忘了写内存申请的代码,添加kmalloc和memset。
    4、再次insmod,出现下列错误代码:
    Unable to handle kernel paging request at virtual address 7f008820
    pgd = cbc70000
    [7f008820] *pgd=00000000
    Internal error: Oops: 5 [#1]
    Moles linked in: led_dev(+)
    CPU: 0 Tainted: G W (3.0.1 #439)
    PC is at led_init+0xa8/0x108 [led_dev]
    LR is at kobj_map+0x144/0x154
    pc : [<bf0020a8>] lr : [<c0246e70>] psr: 60000013
    sp : cbc6bf10 ip : cbc6beb0 fp : cbc6bf24
    r10: 00000000 r9 : bf002000 r8 : cbc6a000
    r7 : 00000000 r6 : bf0002bc r5 : 00000000 r4 : 00000000
    r3 : 00000000 r2 : 00000000 r1 : 7f008000 r0 : 00000000
    Flags: nZCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment user
    Control: 00c5387d Table: 5bc70008 DAC: 00000015
    Process insmod (pid: 112, stack limit = 0xcbc6a268)
    Stack: (0xcbc6bf10 to 0xcbc6c000)
    bf00: 00000000 c07463c0 cbc6bf7c cbc6bf28
    bf20: c00343c8 bf00200c cbc6bf64 cbc6bf38 c0073e24 00000000 00000000 00000000
    bf40: 00000000 0000ef52 000d5bf9 bf0002bc 00000000 0000ef52 000d5bf9 bf0002bc
    bf60: 00000000 c0034ce8 cbc6a000 00000000 cbc6bfa4 cbc6bf80 c0085960 c0034398
    bf80: c00e8738 c00e8610 402004a8 000dfcf8 00000000 00000080 00000000 cbc6bfa8
    bfa0: c0034b40 c00858e0 402004a8 000dfcf8 00b5d038 0000ef52 000d5bf9 ffff5f01
    bfc0: 402004a8 000dfcf8 00000000 00000080 00000069 00000001 be9c2e64 be9c2e68
    bfe0: be9c2e68 be9c2b14 00021cfc 402c1d74 60000010 00b5d038 5fffe821 5fffec21
    [<bf0020a8>] (led_init+0xa8/0x108 [led_dev]) from [<c00343c8>] (do_one_initcall+0x3c/0x188)
    [<c00343c8>] (do_one_initcall+0x3c/0x188) from [<c0085960>] (sys_init_mole+0x8c/0x1a4)
    [<c0085960>] (sys_init_mole+0x8c/0x1a4) from [<c0034b40>] (ret_fast_syscall+0x0/0x30)
    Code: e59f0060 eb52980e ea00000b e59f1058 (e5910820)
    ---[ end trace da227214a82491b9 ]---
    Segmentation fault
    最后是各种网络,各种谷歌,参考别人的驱动,发现它们的开发板硬件地址并不是自己写的头文件,而是调用mach中已经定义好的头文件,好吧,寻找相应开发板,相应端口的地址头文件,在驱动文件中添加以下头文件:
    #include <mach/map.h>
    #include <mach/regs-gpio.h>
    #include <mach/gpio-bank-m.h>
    Ok,打完收工,开发板,测试。运行无阻。完成。
    5、在做到DS18B20温度测试模块驱动的时候,看到网上的代码有些函数可以直接对引脚的功能进行设置,比如:s3c2410_gpio_cfgpin(DQ_PIN, DQ_PIN_OUTP); 但是对应于我的s3c6410的开发板就不知道用什么函数了,网上找了半天,发现以上函数是在#include <plat/gpio-cfg.h>中,6410中对应的函数为:extern int s3c_gpio_cfgpin(unsigned int pin, unsigned int to);
    6、最近学习移植linux内核,移植了新的linux内核以及挂载了新的NFS之后, 重新测试led驱动,发现安装模块以后,运行测试程序会出现以下错误:
    -/bin/sh: ./main: not found(main为主机上编译好的测试程序)
    原因:
    编译busybox的时候选择了静态编译:
    Build Options->
    Build BusyBox as a static binary (no shared libs)
    Build with Large File Support (for accessing file>2GB)
    如果选择 Build BusyBox as a static binary (no shared libs) 方式进行编译时,所需的库已经与程序静态地链接在一起,这些程序不需要额外的库就可以单独运行,但是自己编写的程序在文件系统上运行必须采用静态编译,否则会报诸如:bin/sh: main :not found的错误。
    静态编译如:
    arm-linux-gcc –static main.c –o main
    7.按照普通方法安装配置tftp,并且关闭了防火墙,但是在开发板上tftp主机,总会报错:
    tftp: server error: (0) Permission denied

    解决办法:
    修改文件 /etc/sysconfig/selinux,设定其中的
    SELINUX=disabled
    然后重启电脑即可

    5. 嵌入式Linux设备驱动开发详解的目录

    第1章嵌入式系统与驱动程序1
    本章目标1
    1.1嵌入式系统概述1
    1.1.1嵌入式系统的概念1
    1.1.2嵌入式系统的特点2
    1.1.3嵌入式系统的体系结构2
    1.2嵌入式处理器介绍4
    1.2.1嵌入式处理器分类4
    1.2.2ARM概述5
    1.2.3ARM系列芯片简介5
    1.3嵌入式操作系统介绍7
    1.3.1主流嵌入式操作系统7
    1.3.2嵌入式系统的发展状况8
    1.3.3嵌入式Linux介绍8
    1.3.4嵌入式系统开发环境的建立9
    1.3.5嵌入式软件开发10
    1.4嵌入式Linux驱动程序12
    1.4.1嵌入式Linux的内核空间和用户空间12
    1.4.2嵌入式Linux的文件系统12
    1.4.3嵌入式Linux的设备管理14
    1.4.4嵌入式Linux的驱动程序16
    1.5知识索引20
    1.6思考与练习21
    第2章简单的字符设备驱动程序23
    本章目标23
    2.1嵌入式Linux字符设备的驱动程序结构23
    2.1.1嵌入式Linux驱动程序常用的头文件24
    2.1.2File_operations结构体24
    2.1.3字符设备驱动程序的入口25
    2.1.4驱动程序的设备注册26
    2.2设备驱动程序中的具体问题27
    2.2.1I/O端口28
    2.2.2内存操作29
    2.2.3中断处理29
    2.3LED的驱动程序实例及测试30
    2.3.1LED I/O端口设置30
    2.3.2LED硬件电路设计32
    2.3.3LED驱动程序设计33
    2.3.4LED测试程序设计36
    2.4嵌入式Linux中断处理驱动程序及测试37
    2.4.1中断处理过程37
    2.4.2中断向量表39
    2.4.3中断的处理模式39
    2.4.4中断的优先级40
    2.4.5中断的嵌套40
    2.4.6中断源的扩展40
    2.4.7中断控制寄存器的设置41
    2.5按键中断的驱动程序实例45
    2.5.1按键中断的电路设计45
    2.5.2按键中断的驱动程序设计45
    2.6知识索引48
    2.7思考与练习49
    第3章数字显示驱动程序50
    本章目标50
    3.1数字显示器50
    3.1.1数码管简介50
    3.1.2数码管的分类51
    3.1.3数码管显示原理51
    3.2数码管显示电路的硬件设计52
    3.2.1译码器的使用52
    3.2.2数码管的驱动方式53
    3.2.3串/并变换的译码设计55
    3.3数码管驱动程序实例56
    3.3.1驱动程序的初始化和卸载模块56
    3.3.2文件操作结构模块57
    3.3.3数码管的打开模块57
    3.3.4数码管的读写模块58
    3.3.5数码管的I/O控制模块58
    3.3.6数码管的退出模块58
    3.3.7驱动程序的模块加载和卸载59
    3.4数码管显示电路测试程序设计60
    3.4.1数码管测试设计60
    3.4.2数码管测试程序60
    3.4.3数码管测试效果61
    3.5知识索引61
    3.6思考与练习62
    第4章键盘驱动程序63
    本章目标63
    4.1键盘接口概述63
    4.1.1键盘的分类63
    4.1.2键盘的防抖65
    4.1.3键盘的扫描65
    4.1.4键盘的缓冲算法67
    4.2键盘的驱动设计实例67
    4.2.1锁存器和缓冲器扩展键盘67
    4.2.2锁存器和缓冲器的接口68
    4.2.3锁存器和缓冲器扩展键盘驱动程序设计69
    4.2.4锁存器和缓冲器扩展键盘测试程序设计71
    4.3智能控制芯片HD7279扩展键盘72
    4.3.1HD7279的电路设计72
    4.3.2HD7279的指令介绍73
    4.3.3HD7279的串行接口74
    4.3.4HD7279的驱动程序设计75
    4.3.5HD7279的测试程序设计84
    4.4知识索引85
    4.5思考与练习85
    第5章A/D驱动程序86
    本章目标86
    5.1A/D转换的过程86
    5.1.1采样和保持86
    5.1.2量化和编码88
    5.1.3ADC的分类89
    5.2A/D转换器的基本原理89
    5.2.1逐次逼近型A/D转换器89
    5.2.2双积分型A/D转换器90
    5.2.3V/F和F/V型转换器93
    5.2.4其他A/D转换器95
    5.3A/D转换器接口技术97
    5.3.1ADC的主要参数及意义97
    5.3.2ADC的电路选择方法98
    5.3.3ADC实际应用中的问题99
    5.4S3C2410 A/D转换驱动设计实例99
    5.4.1S3C2410的A/D转换电路99
    5.4.2S3C2410X的A/D转换控制寄存器100
    5.4.3S3C2410X的A/D转换数据寄存器101
    5.4.4S3C2410X中A/D转换驱动程序的设计102
    5.4.5S3C2410X中A/D转换测试程序的设计105
    5.5知识索引106
    5.6思考与练习107
    第6章D/A驱动程序108
    本章目标108
    6.1D/A的原理介绍108
    6.1.1D/A转换的概念及基本原理108
    6.1.2电子模拟开关109
    6.1.3D/A转换器的基本结构110
    6.1.4D/A转换的静态参数114
    6.1.5D/A转换的动态参数115
    6.2D/A转换的硬件电路设计116
    6.2.1D/A转换的接口技术116
    6.2.2D/A转换芯片介绍117
    6.2.3D/A转换的电路设计118
    6.3D/A转换器的驱动程序实例118
    6.3.1D/A驱动程序中的宏定义118
    6.3.2D/A的模块加载118
    6.3.3D/A转换器的文件操作模块119
    6.3.4D/A转换器的读写控制模块120
    6.3.5D/A转换器的打开、退出模块120
    6.4测试程序的设计120
    6.4.1D/A测试程序中的宏定义121
    6.4.2D/A测试程序的主函数121
    6.4.3D/A测试程序中的功能函数122
    6.4.4D/A测试程序中的功能打印函数123
    6.4.5D/A测试程序中的波形生成函数123
    6.4.6D/A测试程序的效果124
    6.5知识索引125
    6.6思考与练习125
    第7章LCD驱动程序126
    本章目标126
    7.1LCD显示器概述126
    7.1.1液晶126
    7.1.2LCD显示屏的背光127
    7.1.3LCD显示器的分类127
    7.1.4LCD的显示原理127
    7.1.5LCD的驱动方式130
    7.1.6LCD的常用指标131
    7.2LCD的显示接口131
    7.2.1灰度STN的时序132
    7.2.2彩色STN的时序133
    7.2.3TFT的时序134
    7.3嵌入式处理器的LCD控制器136
    7.3.1LCD控制器136
    7.3.2LCD控制器的设置137
    7.3.3LCD的字符显示缓存139
    7.4LCD的驱动程序设计140
    7.4.1LCD驱动程序相关的宏定义140
    7.4.2LCD驱动程序的底层操作函数142
    7.4.3LCD驱动程序提供的API145
    7.4.4LCD驱动程序的模块化加载151
    7.4.5LCD的测试程序152
    7.5基于Framebuffer的LCD驱动程序实例155
    7.5.1Framebuffer概述155
    7.5.2LCD的电路连接155
    7.5.3Framebuffer设备驱动程序的结构156
    7.5.4Framebuffer设备驱动程序的设计159
    7.5.5Framebuffer设备测试程序的设计164
    7.5.6嵌入式Linux常用的GUI166
    7.6知识索引166
    7.7思考与练习167
    第8章触摸屏驱动程序168
    本章目标168
    8.1触摸屏概述168
    8.2触摸屏的分类168
    8.2.1电阻技术触摸屏168
    8.2.2表面声波技术触摸屏169
    8.2.3电容电感技术触摸屏170
    8.2.4红外线技术触摸屏170
    8.3触摸屏的特性171
    8.3.1透明度和色彩失真171
    8.3.2反光性171
    8.3.3清晰度171
    8.3.4漂移172
    8.3.5检测和定位172
    8.4触摸屏的硬件电路设计172
    8.4.1电阻式触摸屏的电路原理172
    8.4.2电阻式触摸屏原点的定位173
    8.4.3电阻式触摸屏的电路连接174
    8.5触摸屏的驱动程序实例176
    8.5.1触摸屏接口的模式176
    8.5.2A/D转换和触摸屏寄存器的设置177
    8.5.3触摸屏的坐标179
    8.5.4触摸屏的电路连接180
    8.5.5触摸屏的驱动程序接口181
    8.6测试程序的设计182
    8.6.1触摸屏的数据定义183
    8.6.2触摸屏的数据处理183
    8.6.3触摸屏的运行测试185
    8.7知识索引186
    8.8思考与练习187
    第9章CAN总线驱动程序188
    本章目标188
    9.1CAN总线接口设计188
    9.1.1CAN总线概述188
    9.1.2CAN的工作特点及主要优点189
    9.1.3CAN总线的电气特征和MAC帧结构189
    9.2嵌入式处理器上CAN总线接口的扩展190
    9.2.1SJA1000简介190
    9.2.2SJA1000扩展191
    9.3SJA1000扩展CAN总线接口的设计192
    9.3.1CAN 控制器SJA1000的操作模式192
    9.3.2CAN控制器SJA1000的特征功能193
    9.3.3CAN 控制器SJA1000的Basic CAN模式设置194
    9.4SJA1000扩展CAN总线接口的通信196
    9.4.1通过CAN总线建立通信的步骤196
    9.4.2SJA1000的初始化196
    9.4.3驱动程序的结构设计198
    9.4.4驱动程序init、exit、open、close函数的实现200
    9.4.5驱动程序read、write函数的实现201
    9.4.6驱动程序interrupt、ioctl函数实现202
    9.4.7测试程序的编写202
    9.5驱动程序的加载204
    9.6知识索引204
    9.7思考与练习205
    第10章IIC总线驱动程序206
    本章目标206
    10.1IIC总线概述206
    10.1.1IIC总线介绍206
    10.1.2IIC总线引入的原因206
    10.1.3IIC总线的特点206
    10.1.4IIC总线的基本结构207
    10.1.5IIC总线的术语207
    10.1.6IIC总线的工作208
    10.1.7IIC总线的竞争仲裁209
    10.1.8IIC总线的工作流程210
    10.2嵌入式处理器的IIC接口211
    10.2.1IIC总线控制寄存器212
    10.2.2IIC总线控制/状态寄存器213
    10.2.3IIC总线地址寄存器214
    10.2.4IIC总线移位数据寄存器214
    10.2.5S3C2410中与IIC对应的I/O端口215
    10.3基于IIC的键盘芯片应用216
    10.3.1ZLG7290的功能217
    10.3.2ZLG7290的控制方式218
    10.3.3ZLG7290的寄存器218
    10.3.4ZLG7290的通信接口219
    10.3.5ZLG7290的指令介绍219
    10.4IIC总线驱动程序实例221
    10.4.1ZLG7290的电路连接221
    10.4.2ZLG7290的通信流程223
    10.4.3ZLG7290驱动中变量的定义225
    10.4.4ZLG7290驱动中实时时钟的改变226
    10.4.5ZLG7290和IIC寄存器的初始化227
    10.4.6ZLG7290驱动程序的模块化228
    10.4.7ZLG7290的文件操作结构228
    10.5IIC总线的测试程序230
    10.6知识索引231
    10.7思考与练习231
    第11章音频总线驱动程序232
    本章目标232
    11.1音频总线接口概述232
    11.1.1音频的采样精度233
    11.1.2音频编码233
    11.2IIS音频总线接口233
    11.2.1IIS总线的物理连接233
    11.2.2IIS的总线协议234
    11.2.3IIS总线的硬件设计235
    11.2.4IIS总线的寄存器236
    11.3AC97音频总线接口239
    11.4IIS总线的驱动程序设计240
    11.4.1音频设备基础知识240
    11.4.2音频设备文件241
    11.4.3WAV声音文件243
    11.4.4音频设备和驱动程序的通信243
    11.4.5设备的初始化和加载244
    11.4.6DMA的操作和宏定义246
    11.4.7audio设备文件的操作248
    11.4.8mixer设备文件的操作260
    11.5音频驱动程序的测试262
    11.6知识索引262
    11.7思考与练习263
    第12章IDE接口驱动程序264
    本章目标264
    12.1IDE接口概述264
    12.1.1硬盘知识介绍264
    12.1.2IDE接口标准267
    12.1.3IDE接口的传输模式269
    12.1.4IDE接口寄存器269
    12.2IDE接口驱动程序的移植271
    12.2.1嵌入式Linux下IDE驱动程序接口271
    12.2.2嵌入式Linux下IDE驱动程序272
    12.2.3IDE硬盘的读/写操作274
    12.3IDE驱动程序测试282
    12.3.1磁盘文件系统简介283
    12.3.2IDE分区测试283
    12.4知识索引285
    12.5思考与练习285
    第13章闪存芯片的驱动程序286
    本章目标286
    13.1闪存芯片概述286
    13.1.1闪存芯片的物理特性286
    13.1.2嵌入式文件系统概述289
    13.1.3MTD体系介绍289
    13.1.4Flash专有名词291
    13.2NAND Flash291
    13.2.1NAND Flash的结构291
    13.2.2NAND Flash的操作292
    13.2.3NAND Flash控制器294
    13.2.4NAND Flash的时序296
    13.2.5NAND Flash的驱动程序实例297
    13.3NOR Flash301
    13.3.1NOR Flash的结构301
    13.3.2NOR Flash的操作302
    13.3.3NOR Flash的驱动程序实例303
    13.4基于闪存的文件系统307
    13.5知识索引309
    13.6思考与练习310
    第14章USB 设备驱动程序311
    本章目标311
    14.1USB接口概述311
    14.1.1USB系统311
    14.1.2USB的电气特性312
    14.1.3USB总线的拓扑结构313
    14.1.4USB的通信协议313
    14.2嵌入式系统中USB的使用315
    14.2.1OHCI概述315
    14.2.2Host接口硬件设计316
    14.3嵌入式系统中USB设备的驱动程序设计316
    14.3.1

    6. 嵌入式linux设备驱动,无法打开设备文件

    1. ls /dev/* 看看有没有你的LED节点
    2.cat /proc/devices 看看有没有相关LED驱动信息。

    ===============================
    static const struct file_operations fops_led =
    {
    .owner = THIS_MODULE,
    //.open = open_led,
    .unlocked_ioctl = unlocked_ioctl_led,
    };

    都屏蔽了open函数,内怎么打开容?

    7. 我在ubuntu9。04下,用arm-linux-gcc 交叉编译了一个led驱动程序。引用的内核源码放在/usr/src/linux2.6

    如果你要编译一个 驱动 首先你那个 linux内核事编译好的。makefile 里面耀指向你的linux内核目录
    你在试试

    阅读全文

    与linuxled驱动相关的资料

    热点内容
    恋舞最新升级奖励表 浏览:149
    四川语音交友恋爱app有哪些 浏览:528
    iphone6美国卖多少 浏览:887
    圆弧刀东槽如何编程 浏览:870
    js怎么单击改变标签里的文字 浏览:760
    实例配置文件里的sid是什么 浏览:43
    ps文件模糊 浏览:192
    叶檀财经推出过什么购物APP 浏览:875
    linux硬盘检测 浏览:431
    如何用路由器降低网络延迟 浏览:601
    aix分区root密码 浏览:439
    运动鞋买鞋上什么app 浏览:904
    NSA工具下载 浏览:918
    函数代码在哪个文件夹 浏览:213
    微信应用怎么代码添加快捷方式 浏览:371
    用数据说话是最有力的什么 浏览:27
    图片文件被锁定无法打开 浏览:768
    wr886nv2升级 浏览:490
    移动硬盘视频文件无法删除 浏览:417
    如何查看网络监控 浏览:132

    友情链接