精华内容
下载资源
问答
  • 详细讲解Linux驱动程序
    千次阅读
    2021-05-08 23:40:04

    一 ?编写Linux驱动程序

    1.建立Linux驱动骨架

    ? Linux内核在使用驱动时需要装载与卸载驱动

    ?装载驱动:建立设备文件、分配内存地址空间等;module_init 函数处理驱动初始化

    ?卸载驱动:删除设备文件、释放内存地址空间等;module_exit函数处理退出

    包含这两个函数的两个宏的C程序文件也可看做是Linux驱动的骨架

    2.注册和注销设备文件

    任何一个Linux驱动都需要有一个设备文件,否则应用程序将无法与驱动程序交互。

    建立设备文件:在第一步编写的处理Linux初始化工作的函数中完成。misc_register函数

    删除设备文件:在第一步编写的处理Linux退出工作的函数中完成。misc_deregister函数

    3.指定与驱动相关的信息

    驱动程序是自描述的,驱动程序的作者姓名、使用的开源协议、别名、驱动描述等信息。这些信息都需要在驱动源代码中指定。

    MODULE_AUTHOR、MODULE_LICENSE、MODULE_ALLS、MODULE_DESCRIPION等宏可以指定与驱动相关的信息

    4.指定回调函数

    一个驱动程序并不一定要指定所有的回调函数,回调函数会通过相关机制进行注册

    5.编写业务逻辑

    具体的业务逻辑与驱动的功能有关,业务逻辑可能由多个函数、多个文件甚至是多个Linux驱动模块组成

    6.编写Makefile文件

    Linux内核源代码的编译规则是通过Makefile文件定义的。因此编写一个新的Linux驱动程序必须有一个Makefile文件

    7.编译Linux驱动程序

    可以直接编译进内核,也可以作为模块单独编译

    8.安装和卸载Linux驱动

    若将Linux驱动编译进内核,只要Linux使用该内核,驱动程序就会自动转载

    若Linux驱动程序以模块单独存在,需使用insmod或modprode命令装载Linux驱动模块,rmmod命令卸载Linux驱动模块

    二 ?第一个Linux驱动,以word_count为例

    (一)基础编写代码

    #mkdir -p ?/root/drivers/ch06/word_count ? ?建立目录存放Linux驱动程序

    #cd /root/drivers/ch06/word_count

    #echo '' > word_count.c ?建立驱动源代码文件

    #echo 'obj-m := word_count.o' > Makefile ?编写一个Makefile文件 make命令会吧Linux驱动源代码目录中的word_count.c或 word_count.s文件编译成word_count.o文件

    obj-m 表示将Linux驱动作为模块(.ko文件)编译,word_count.o会被连接进word_count.ko文件,然后使用insmod或modprode命令装载word_count.ko

    obj-y ?表示将Linux驱动编译进Linux内核,word_count.o会被连接进built-in.o 文件,最终会被连接进内核

    Linux系统将内存分为了用户空间和内核空间,两者空间的程序不能直接访问,printk函数运行在内核空间,printf函数运行在用户空间,因此属于内核程序的Linux驱动是不能直接访问printf函数的。

    #make -C /usr/src/linux-headers-3.0.0-15-generic ?M=/root/driver/ch06/word_count ? ?编译Linux驱动源代码

    # insmod word_count.ko ?装载驱动

    # lsmod | grep word_count ? 查看word_count是否安装成功

    # rmmod word_count ? 卸载Linux驱动

    #dmesg | grep word_count | tail -n 2 ? ?查看有Linux驱动输出的日志信息

    (二)加入有关指定的信息的代码

    模块作者:MODULE_AUTHOR("lining");

    模块描述:MODULE_DESCRPTION("statistics of word count .");

    模块别名:MODULE_ALIAS("word count module.");

    开源协议: MODULE_LICENSE("GPL");

    ?

    #define DEVICE_NAME "wordcount" ? ?//定义设备文件名

    //描述与设备文件触发的事件对应的回调函数指针

    //owner:设备事件回调幻术应用于哪些驱动模块,THIS_MODULE表示应用于当前驱动模块

    static struct file_operations dev_fops={.owner = THIS_MODULE};

    //描述设备文件的信息

    //minor:次设备号 MISC_DYNAMIC_MINOR,:动态生成次设备号 ?name : ?设备文件名称

    //fops : file_operations 结构体变量指针

    static struct miscdevice misc={.minor = MISC_DYNAMIC_MINOR, .name=DEVICE_NAME,.fops = &dev_fops};

    //初始化Linux驱动

    static ?int word_count_init(void)

    { int ret;

    ? ?ret = misc_register(&misc);

    ? printk("word_count_init_success

    ");

    ?return ret;

    }

    // 卸载Linux驱动

    static void word_count_exit(void)

    ?{ ?misc_deregister(&misc);

    ? ? printk("word_inti_exit_success

    ");

    }

    ?

    由于内核空间的程序不能直接访问用户空间中的数据,因此,需要在word_count_read(从设备文件读数据)和word_count_write(向设备文件写数据) 函数中分别使用copy_to_user和copy_from_user函数将数据从内核空间复制到用户空间或从用户空间复制到内核空间

    (三)装载与卸载驱动

    检查word_count驱动工作是否完全正常

    #dmesg | tail -n 1

    #modinfo word_count.ko

    检测Linux驱动模块的依赖关系

    #depmod /root/drivers/ch06/word_count/word_count.ko

    调用命令装载Linux驱动

    #modprode word_count

    注:insmod 和 modprode 命令都是加载驱动,后者可以检查驱动模块的依赖性

    三 多种方法测试Linux驱动

    (一)使用Ubuntu Linux 测试Linux驱动

    需要编写专门用于测试的程序,例如test_word_count.c

    #gcc test_word_count.c -o test_word_count

    #test_word_count

    #test_word_count "I love you."

    输出结果: String:I love you.

    ? ? ? ? ? ? ? ?word byte display:0,0,0,3

    ? ? ? ? ? ? ? ?word count:3

    ?(二)在android模拟器上通过原生C程序测试Linux驱动

    #cd ~/kernel/goldfish

    #make menuconfig

    aHR0cHM6Ly9pbWFnZXMyMDE1LmNuYmxvZ3MuY29tL2Jsb2cvOTM2MTgwLzIwMTYwNS85MzYxODAtMjAxNjA1MjYxNjA5NTg2NjMtNDc5MjYyNTE3LmpwZw? ? ?

    aHR0cHM6Ly9pbWFnZXMyMDE1LmNuYmxvZ3MuY29tL2Jsb2cvOTM2MTgwLzIwMTYwNS85MzYxODAtMjAxNjA1MjYxNjEwMjI1MDYtMTI0OTAwNTQwNC5qcGc

    ?

    按照如图所示进行设置,之后重新编译Linux内核,成功编译内核后,android模拟器可以使用性生成的zImage内核文件动态装载Linux驱动模块。

    两个条件满足可以直接运行普通的Linux程序:android模拟器、开发板或手机需要有root权限;可执行文件需要使用交叉编译器来编译test_word_count.c文件,建立Android.mk设置编译参数,并使用make命令进行编译

    #mm ? 编译.c文件,在相应目录下

    #adb push ?./emulator/test_word_count ?/data/local ? ?上传到Android模拟器

    执行下面命令测试驱动

    #chmod 777 /data/local/test_word_count ? 设置可执行权限

    #/data/local/test_word_count

    #/data/local/test_word_count ?'a bb ccc ddd eee'

    输出结果:5,表示测试成功

    (三)使用Android NDK测试

    (四)使用开发板测试

    (五)将驱动编译进Linux内核进行测试

    ?

    四 在eclipse中开发Linux驱动程序

    第一步:建立C工程

    第二步:建立C源代码文件链接 ? ? New>Source Folder ? Folder name 输入 src,导入word_count.c文件

    第三步:设置include路径 ? 单击菜单项properties,C/C++General > Paths and Symbols ,选中Include的GNU C项,Add添加两个路径:/root/kernel/goldfish/include和/root/kernel/goldfish/arch/arm/include

    第四步:编译Linux驱动

    ?

    测试Linux驱动

    第一步:导入test_word_count.c文件

    第二步:设置include路径

    第三步:建立Target ? ? ?Make Target > Create ,在Target name 文本框中输入word_count_eclipse_test,点击OK

    第四步:Build工程 ? ?Make Target > Build,选中第三步中建立的文件,然后点击Build

    第五步:运行测试程序 ? Run As > Local C/C++ ?Application

    更多相关内容
  • 程序的执行可以看成对CPU,内存,IO资源一次占用 现代操作系统支持多任务,可以分时复用上述资源. 1. 为什么采用事件驱动模型? 事件驱动模型也就是我们常说的观察者,或者发布-订阅模型;理解...

    事件驱动

    基本概念

    • 窗口/组件

    • 事件

    • 消息(队列)

    • 事件响应(服务处理程序)

    • 调度算法

    • 进程/线程

    • 非阻塞I/O

    • 程序的执行可以看成对CPU,内存,IO资源一次占用

    • 现代操作系统支持多任务,可以分时复用上述资源.

    1. 为什么采用事件驱动模型?

    事件驱动模型也就是我们常说的观察者,或者发布-订阅模型;理解它的几个关键点:

    • 首先是一种对象间的一对多的关系;最简单的如交通信号灯,信号灯是目标(一方),行人注视着信号灯(多方);

    • 当目标发送改变(发布),观察者(订阅者)就可以接收到改变;

    • 观察者如何处理(如行人如何走,是快走/慢走/不走,目标不会管的),目标无需干涉;所以就松散耦合了它们之间的关系。

    2. 代码执行流程

    在传统的或“过程化”的应用程序中,应用程序自身控制了执行哪一部分代码和按何种顺序执行代码。从第一行代码执行程序并按应用程序中预定的路径执行,必要时调用过程。
    在事件驱动的应用程序中,代码不是按照预定的路径执行-而是在响应不同的事件时执行不同的代码片段。事件可以由用户操作触发、也可以由来自操作系统或其它应用程序调度算法的消息触发、甚至由应用程序本身的消息触发。这些事件的顺序决定了代码执行的顺序,因此应用程序每次运行时所经过的代码的路径都是不同的。

    3. 事件驱动模型

    在UI编程中,常常要对鼠标点击进行相应,首先如何获得鼠标点击呢?

    方式一:创建一个线程,该线程一直循环检测是否有鼠标点击,那么这个方式有以下几个缺点:

    1. CPU资源浪费,可能鼠标点击的频率非常小,但是扫描线程还是会一直循环检测,这会造成很多的CPU资源浪费;如果扫描鼠标点击的接口是阻塞的呢?
    2. 如果是堵塞的,又会出现下面这样的问题,如果我们不但要扫描鼠标点击,还要扫描键盘是否按下,由于扫描鼠标时被堵塞了,那么可能永远不会去扫描键盘;
    3. 如果一个循环需要扫描的设备非常多,这又会引来响应时间的问题;所以,该方式是非常不好的。

    方式二:就是事件驱动模型目前大部分的UI编程都是事件驱动模型,如很多UI平台都会提供onClick()事件,这个事件就代表鼠标按下事件。事件驱动模型大体思路如下:

    1. 有一个事件(消息)队列;

    2. 鼠标按下时,往这个队列中增加一个点击事件(消息);

    3. 有个循环,不断从队列取出事件,根据不同的事件,调用不同的函数,如onClick()、onKeyDown()等;

    4. 事件(消息)一般都各自保存各自的处理函数指针,这样,每个消息都有独立的处理函数;如图:

     

    4. 事件驱动处理库

    • select

    • poll

    • epoll

    • libev

    5.效率比较 

    让我们用例子来比较和对比一下单线程、多线程以及事件驱动编程模型。下图展示了随着时间的推移,这三种模式下程序所做的工作。这个程序有3个任务需要完成,每个任务都在等待I/O操作时阻塞自身。阻塞在I/O操作上所花费的时间已经用灰色框标示出来了。

     

    在单线程同步模型中,任务按照顺序执行。如果某个任务因为I/O而阻塞,其他所有的任务都必须等待,直到它完成之后它们才能依次执行。这种明确的执行顺序和串行化处理的行为是很容易推断得出的。如果任务之间并没有互相依赖的关系,但仍然需要互相等待的话这就使得程序不必要的降低了运行速度。

    在多线程版本中,这3个任务分别在独立的线程中执行。这些线程由操作系统来管理,在多处理器系统上可以并行处理,或者在单处理器系统上交错执行。这使得当某个线程阻塞在某个资源的同时其他线程得以继续执行。与完成类似功能的同步程序相比,这种方式更有效率,但程序员必须写代码来保护共享资源,防止其被多个线程同时访问。多线程程序更加难以推断,因为这类程序不得不通过线程同步机制如锁、可重入函数、线程局部存储或者其他机制来处理线程安全问题,如果实现不当就会导致出现微妙且令人痛不欲生的bug。

    在事件驱动版本的程序中,3个任务交错执行,但仍然在一个单独的线程控制中。当处理I/O或者其他昂贵的操作时,注册一个回调到事件循环中,然后当I/O操作完成时继续执行。回调描述了该如何处理某个事件。事件循环轮询所有的事件,当事件到来时将它们分配给等待处理事件的回调函数。这种方式让程序尽可能的得以执行而不需要用到额外的线程。事件驱动型程序比多线程程序更容易推断出行为,因为程序员不需要关心线程安全问题。

    当我们面对如下的环境时,事件驱动模型通常是一个好的选择:

    程序中有许多任务,而且…
    任务之间高度独立(因此它们不需要互相通信,或者等待彼此)而且…
    在等待事件到来时,某些任务会阻塞。
    当应用程序需要在任务间共享可变的数据时,这也是一个不错的选择,因为这里不需要采用同步处理。

    网络应用程序通常都有上述这些特点,这使得它们能够很好的契合事件驱动编程模型。

    事件驱动机制跟消息驱动机制相比

    消息驱动和事件驱动很类似,都是先有一个事件,然后产生一个相应的消息,再把消息放入消息队列,由需要的项目获取。他们的区别是消息是谁产生的

    消息驱动:鼠标管自己点击不需要和系统有过多的交互,消息由系统(第三方)循环检测,来捕获并放入消息队列。消息对于点击事件来说是被动产生的,高内聚。

    事件驱动:鼠标点击产生点击事件后要向系统发送消息“我点击了”的消息,消息是主动产生的。再发送到消息队列中。

     

    事件:按下鼠标,按下键盘,按下游戏手柄,将U盘插入USB接口,都将产生事件。比如说按下鼠标左键,将产生鼠标左键被按下的事件。

    消息:当鼠标被按下,产生了鼠标按下事件,windows侦测到这一事件的发生,随即发出鼠标被按下的消息到消息队列中,这消息附带了一系列相关的事件信息,比如鼠标哪个键被按了,在哪个窗口被按的,按下点的坐标是多少?如此等等。

    注意:

    1. 要理解事件驱动和程序,就需要与非事件驱动的程序进行比较。实际上,现代的程序大多是事件驱动的,比如多线程的程序,肯定是事件驱动的。早期则存在许多非事件驱动的程序,这样的程序,在需要等待某个条件触发时,会不断地检查这个条件,直到条件满足,这是很浪费cpu时间的。而事件驱动的程序,则有机会释放cpu从而进入睡眠态(注意是有机会,当然程序也可自行决定不释放cpu),当事件触发时被操作系统唤醒,这样就能更加有效地使用cpu.
    2. 再说什么是事件驱动的程序。一个典型的事件驱动的程序,就是一个死循环,并以一个线程的形式存在,这个死循环包括两个部分,第一个部分是按照一定的条件接收并选择一个要处理的事件,第二个部分就是事件的处理过程。程序的执行过程就是选择事件和处理事件,而当没有任何事件触发时,程序会因查询事件队列失败而进入睡眠状态,从而释放cpu。
    3. 事件驱动的程序,必定会直接或者间接拥有一个事件队列,用于存储未能及时处理的事件。
    4. 事件驱动的程序的行为,完全受外部输入的事件控制,所以,事件驱动的系统中,存在大量这种程序,并以事件作为主要的通信方式。
    5. 事件驱动的程序,还有一个最大的好处,就是可以按照一定的顺序处理队列中的事件,而这个顺序则是由事件的触发顺序决定的,这一特性往往被用于保证某些过程的原子化。
    6. 目前windows,linux,nucleus,vxworks都是事件驱动的,只有一些单片机可能是非事件驱动的。


    事件模式耦合高,同模块内好用;消息模式耦合低,跨模块好用。事件模式集成其它语言比较繁琐,消息模式集成其他语言比较轻松。事件是侵入式设计,霸占你的主循环;消息是非侵入式设计,将主循环该怎样设计的自由留给用户。如果你在设计一个东西举棋不定,那么你可以参考win32的GetMessage,本身就是一个藕合度极低的接口,又足够自由,接口任何语言都很方便,具体应用场景再在其基础上封装成事件并不是难事,接口耦合较低,即便哪天事件框架调整,修改外层即可,不会伤经动骨。而如果直接实现成事件,那就完全反过来了。

     

    什么是数据驱动编程

    正题

    作者在介绍Unix设计原则时,其中有一条为“表示原则:把知识叠入数据以求逻辑质朴而健壮”。结合之前自己的一些经验,我对这个原则很有共鸣,所以先学习了数据驱动编程相关的内容,这里和大家分享出来和大家一起讨论。

    核心

    数据驱动编程的核心出发点是相对于程序逻辑,人类更擅长于处理数据。数据比程序逻辑更容易驾驭,所以我们应该尽可能的将设计的复杂度从程序代码转移至数据。

    真的是这样吗?让我们来看一个示例。假设有一个程序,需要处理其他程序发送的消息,消息类型是字符串,每个消息都需要一个函数进行处理。第一印象,我们可能会这样处理: 

    void msg_proc(const char *msg_type, const char *msg_buf) 
    { 
        if (0 == strcmp(msg_type, "inivite")) 
        { 
            inivite_fun(msg_buf); 
        } 
        else if (0 == strcmp(msg_type, "tring_100")) 
        { 
            tring_fun(msg_buf); 
        } 
        else if (0 == strcmp(msg_type, "ring_180")) 
        { 
            ring_180_fun(msg_buf); 
        } 
        else if (0 == strcmp(msg_type, "ring_181")) 
        { 
            ring_181_fun(msg_buf); 
        } 
        else if (0 == strcmp(msg_type, "ring_182")) 
        { 
            ring_182_fun(msg_buf); 
        } 
        else if (0 == strcmp(msg_type, "ring_183")) 
        { 
            ring_183_fun(msg_buf); 
        } 
        else if (0 == strcmp(msg_type, "ok_200")) 
        { 
            ok_200_fun(msg_buf); 
        }
    
        。。。。。。 
        else if (0 == strcmp(msg_type, "fail_486")) 
        { 
            fail_486_fun(msg_buf); 
        } 
        else 
        { 
            log("未识别的消息类型%s\n", msg_type); 
        } 
    } 


    上面的消息类型取自sip协议(不完全相同,sip协议借鉴了http协议),消息类型可能还会增加。看着常常的流程可能有点累,检测一下中间某个消息有没有处理也比较费劲,而且,没增加一个消息,就要增加一个流程分支。

    按照数据驱动编程的思路,可能会这样设计: 

    typedef void (*SIP_MSG_FUN)(const char *);
    
    typedef struct __msg_fun_st 
    { 
        const char *msg_type;//消息类型 
        SIP_MSG_FUN fun_ptr;//函数指针 
    }msg_fun_st;
    
    msg_fun_st msg_flow[] = 
    { 
            {"inivite", inivite_fun}, 
            {"tring_100", tring_fun}, 
            {"ring_180", ring_180_fun}, 
            {"ring_181", ring_181_fun}, 
            {"ring_182", ring_182_fun}, 
            {"ring_183", ring_183_fun}, 
            {"ok_200", ok_200_fun},
    
            。。。。。。 
            {"fail_486", fail_486_fun} 
    };
    
    void msg_proc(const char *msg_type, const char *msg_buf) 
    { 
        int type_num = sizeof(msg_flow) / sizeof(msg_fun_st); 
        int i = 0;
    
        for (i = 0; i < type_num; i++) 
        { 
            if (0 == strcmp(msg_flow[i].msg_type, msg_type)) 
            { 
                msg_flow[i].fun_ptr(msg_buf); 
                return ; 
            } 
        } 
        log("未识别的消息类型%s\n", msg_type); 
    } 

     

    数据驱动优势

    1、可读性更强,消息处理流程一目了然。

    2、更容易修改,要增加新的消息,只要修改数据即可,不需要修改流程。

    3、重用,第一种方案的很多的else if其实只是消息类型和处理函数不同,但是逻辑是一样的。下面的这种方案就是将这种相同的逻辑提取出来,而把容易发生变化的部分提到外面。

    隐含在背后的思想

    很多设计思路背后的原理其实都是相通的,隐含在数据驱动编程背后的实现思想包括:

    1、控制复杂度。通过把程序逻辑的复杂度转移到人类更容易处理的数据中来,从而达到控制复杂度的目标。

    2、隔离变化。像上面的例子,每个消息处理的逻辑是不变的,但是消息可能是变化的,那就把容易变化的消息和不容易变化的逻辑分离。

    3、机制和策略的分离。和第二点很像,本书中很多地方提到了机制和策略。上例中,我的理解,机制就是消息的处理逻辑,策略就是不同的消息处理(后面想专门写一篇文章介绍下机制和策略)。

    数据驱动可以用来做什么:

    如上例所示,它可以应用在函数级的设计中。

    同时,它也可以应用在程序级的设计中,典型的比如用表驱动法实现一个状态机(后面写篇文章专门介绍)。

    也可以用在系统级的设计中,比如DSL(这方面我经验有些欠缺,目前不是非常确定)。

    它不是什么:

    1、 它不是一个全新的编程模型:它只是一种设计思路,而且历史悠久,在unix/linux社区应用很多;

    2、它不同于面向对象设计中的数据:“数据驱动编程中,数据不但表示了某个对象的状态,实际上还定义了程序的流程;OO看重的是封装,而数据驱动编程看重的是编写尽可能少的代码。”

    书中的值得思考的话:

    数据压倒一切。如果选择了正确的数据结构并把一切组织的井井有条,正确的算法就不言自明。编程的核心是数据结构,而不是算法。——Rob Pike

    程序员束手无策。。。。。只有跳脱代码,直起腰,仔细思考数据才是最好的行动。表达式编程的精髓。——Fred Brooks

    数据比程序逻辑更易驾驭。尽可能把设计的复杂度从代码转移至数据是个好实践。——《unix编程艺术》作者。

     

    转载自:学时网 » 事件驱动编程、消息驱动编程、数据驱动编程

    展开全文
  • 可以看到你的显卡信息,比如我的就是 product: GF108GL[Quadro 600] 看configurure字段有木有driver字样,若有内容,则表示对应的工作站显卡驱动装好了。 2.查找你的显卡的驱动 去NVDIA driver search page搜索你...

    1.查看显卡型号

    输入如下命令:

    lshw -c video
    

    结果显示:
    在这里插入图片描述可以看到你的显卡信息,比如我的就是 product: GF108GL[Quadro 600]

    2.查找你的显卡的驱动

    NVDIA driver search page搜索你的显卡需要的驱动型号并下载(如图)。
    在这里插入图片描述
    下面是我的电脑对应的驱动版本:
    在这里插入图片描述
    从搜索的结果页面看到,我的驱动版本应该是390.67.
    为了再次确认一遍,你还可以使用这个命令查看你可以使用的驱动:

    ubuntu-drivers devices
    

    结果显示:
    在这里插入图片描述
    如果结果显示和搜索到的驱动版本一样,推荐也是390.67,那我们可以安心安装390.67版本。但是结果显示的并没有390.67,为了避免出错,建议选择结果显示中的版本号,如361。

    3.安装显卡驱动

    1. 禁用nouveau。

    打开终端,输入:

    sudo gedit /etc/modprobe.d/blacklist.conf
    

    在blacklist.conf文件末尾加上这两行,并保存:

    blacklist nouveau
    options nouveau modeset=0
    

    然后执行命令:

    sudo update-initramfs -u  //应用更改
    

    重启系统,验证是否禁用nouveau:

    lsmod | grep nouveau
    

    没有信息返回说明已禁用(如图)
    在这里插入图片描述
    2. 安装NVIDIA驱动。
    方法一:
    打开系统设置->软件和更新->附加驱动->选择NVIDIA驱动->应用更改(如图)
    在这里插入图片描述
    方法二:
    进入命令行界面:

    Ctrl+Alt+F1  //(深坑:笔记本的F键有小键盘,需加上Fn),之后输入用户名和密码登录即可。
    

    关闭图形界面:

    sudo service lightdm stop
    

    卸载旧版本nvidia驱动:

    sudo apt-get remove --purge nvidia*
    

    给驱动run文件赋予执行权限:

    sudo chmod  a+x NVIDIA-Linux-x86_64-396.18.run //对应自己下载的驱动名称
    

    安装nvidia驱动:

    sudo ./NVIDIA-Linux-x86_64-396.18.run -no-x-check -no-nouveau-check -no-opengl-files //只有禁用opengl这样安装才不会出现循环登陆的问题
    

    -no-x-check:安装驱动时关闭X服务
    -no-nouveau-check:安装驱动时禁用nouveau
    -no-opengl-files:只安装驱动文件,不安装OpenGL文件

    安装过程中的选项:

    The distribution-provided pre-install script failed! Are you sure you want to continue? 选择 yes 继续。
    Would you like to register the kernel module souces with DKMS? This will allow DKMS to automatically build a new module, if you install a different kernel later?  选择 No 继续。
    问题没记住,选项是:install without signing
    问题大概是:Nvidia's 32-bit compatibility libraries? 选择 No 继续。
    Would you like to run the nvidia-xconfigutility to automatically update your x configuration so that the NVIDIA x driver will be used when you restart x? Any pre-existing x confile will be backed up.  选择 Yes
    

    这些选项如果选择错误可能会导致安装失败,没关系,只要前面不出错,多尝试几次就好。

    打开图形界面:

    sudo service lightdm start
    
    1. 查看NVIDIA版本检验是否安装完成
    nvidia-smi
    

    参考1:https://blog.csdn.net/ghw15221836342/article/details/79571559
    参考2:https://blog.csdn.net/xunan003/article/details/81665835
    参考3:简单版

    展开全文
  • 2. PC端驱动安装 2.1 查看驱动是否已经自动安装 2.1 驱动类型 2.2 安装(WIN10 64位) 1. 概述 FTDI公司全称是Future Technology Devices International,FTDI是一家是无晶圆且总部设在英国格拉斯哥的半导体...

    目录

    1. 概述

    2. PC端驱动安装

    2.1 查看驱动是否已经自动安装

    2.1 驱动类型

    2.2 安装(WIN10 64位)


    1. 概述

    FTDI公司全称是Future Technology Devices International,FTDI是一家是无晶圆且总部设在英国格拉斯哥的半导体公司,FTDI公司是无晶圆半导体公司,总部设在英国格拉斯哥,在格拉斯哥、新加坡和台北(中国台湾)设有研发机构,在格拉斯哥、台北、波特兰(美国俄勒冈)和上海(中国)有区域销售和技术支持部门。FTDI公司最广受欢迎的USB转串行转换器IC(如FT232、FT245、FT2232系列)是世界上知名度最高的产品,为RS232/RS422/RS485/SPI/IIC等接口提供USB连接能力,FTDI公司所有设备均随附FTDI适用于Windows、Apple MAC OSX、Linux和Android操作系统的免费USB驱动程序,形成一整套可以缩短产品上市时间、节省开发成本的即时可用式USB解决方案。

    总之,该公司生产的转USB芯片可以很方便的把你的其他类型的接口转换为USB接口,进而连接到PC上,这些芯片自带USB协议,不需要在编程,例如本人板卡端只需要编写好SPI的读写程序,PC端安装好官方驱动,那么打开串口软件就能收发数据了(转USB就是在PC端虚拟出一个COM口,当然必须正确安装了电脑端的驱动了)。


    2. PC端驱动安装

    2.1 查看驱动是否已经自动安装

    一般USB插入PC能够自动识别到转换接口,查看PC端设备管理器如下:

    如果不能识别到,就需要安装官方驱动,FTDI官网:http://www.ftdichip.cn/index.html

    2.1 驱动类型

    在官网下既有相关驱动和安装手册,这里简单介绍安装过程,指出可能遇到的问题。可以看到驱动包括:VCP、D2XX、D3XX

    • 虚拟COM端口(VCP)驱动程序使USB设备显示为PC可用的附加COM端口。
    • D2XX驱动程序允许通过DLL直接访问USB设备。应用程序软件可以通过一系列DLL函数调用来访问USB设备。
    • D3XX其范围主要面向超高速USB芯片,如的FT60x。D3XX实现了不同于D2XX的协议,最大化USB 3.0带宽。应用程序软件可以通过一系列DLL函数调用来访问USB设备。

    2.2 安装(WIN10 64位)

    由于板卡没有USB接口,本人目的是SPI转为USB,进而连接到PC端显示数据,直接用VCP就可以了,虚拟出串口就可以了。

    (1)下载VCP驱动 

    前一个箭头指向的是驱动包,手动搜索安装,后一个箭头是exe的可执行安装程序,下载其中之一,安装。具体安装包也可以在这下:安装包安装程序,安装过程可以参考安装指导文件:FTDI驱动安装过程

    安装成功显示如下:

    【注】如果只有下面的USB串口标识,没有上面的COM口标识,说明虚拟串口没加载,可以勾选如下选项卡下的选项,并重新插拔USB。

     

     

     

    展开全文
  • DDD领域驱动设计详解

    万次阅读 2021-06-04 16:32:17
    DDD领域驱动设计1. 领域驱动设计1.1 什么是领域驱动设计1.2 为什么用领域驱动设计2. DDD核心知识体系2.1 DDD核心概念2.2 DDD战略战术设计2.2.1 DDD战略设计2.2.1 DDD战术设计3. DDD微服务架构模型3.1 基本架构3.1.1 ...
  • 一文搞懂步进电机特性、原理及驱动器设计

    万次阅读 多人点赞 2020-11-20 19:01:30
    当步进驱动器接收到一个脉冲信号时,它就可以驱动步进电机按设定的方向转动一个固定的角度,称为“步距角”。 步进电机的旋转是以固定的角度一步一步运行的,可以通过控制脉冲个数来控制角位移量,从而达到准确定位...
  • 1、多设备管理 2、文件传输 3、安全密码 4、远程打印 5、远程开机 6、代理服务器
  • 12月14日,火绒安全团队发现”驱动人生”旗下多款软件携带后门病毒DTStealer,仅半天时间感染了数万台电脑。该病毒进入电脑后,继续通过”永恒之蓝”高危漏洞进行全网传播(特别是政企单位局域网),并回传被感染...
  • UOS 安装nvidia官方显卡驱动

    千次阅读 2021-06-26 15:32:02
    一、使用软件包管理器安装 安装nvidia-detect命令 ...执行 nvidia-detect 命令以检测 nvidia 显卡适用的 nvidia 驱动版本: uos@uos:~$ nvidia-detect Detected NVIDIA GPUs: 01:00.0 VGA compatible controll
  • 环境搭建01——Ubuntu如何查看显卡信息及安装NVDIA显卡驱动 原来的贴子有点老了,这里更新一下,算是一个快速安装的笔记吧! https://blog.csdn.net/tanmx219/article/details/86553485 1.查看显卡型号 输入如下命令...
  • 维宏控制系统驱动

    千次阅读 2020-12-21 19:13:22
    这是维宏控制系统驱动,Ncstudio V5.4.78中文版本软件适合于维宏控制系统雕刻机。本版更新:修正了维宏驱动程序在windowsXP和windows2000系统下不能正确安装的问题;修正了正常运行时会可能变慢的问题;升级了对精雕...
  • 事件驱动模型

    千次阅读 2020-05-22 00:00:52
    事件驱动模型的概念、作用、实现思路以及几种不同的实现方式。
  • Android软件层次结构(1)操作系统层显示驱动(Frame Buffer),Flash内存驱动,照相机驱动,音频驱动,WiFi驱动,键盘驱动,蓝牙驱动,Binder IPC驱动,Power Management ,这些都包括在Linux内核里。(2)各种库和...
  • windows server 2016 安装网卡驱动

    千次阅读 2021-01-30 14:52:24
    首先,联网分解为两个问题,一、WLAN(无线网)、二、以太网(有线网)一 、WLAN问题解决方案1.打开服务器管理器2.添加角色和功能3.一直点下一步到“功能”,勾选 DirectPlay 和...自个到网上下个驱动软件吧,驱动人生是...
  • 关于本人最近安装nvidia显卡的总结和一些坑 centos7 1.查看Linux系统是否已经安装...情况2: 如果输出以下信息,则Linux系统中已经安装了Nvidia驱动。(表示已经有驱动了就不用往下看了) 2.下载Nvidia官方驱动程序 2.1查
  • 驱动层(ring0)里执行应用层(ring3)代码,这是个老生常谈的技术,而且方法也挺多。 这种技术的本质:其实就是想方设法在驱动层里把应用层代码弄到应用层去执行。 比如在APC异步调用中,KeInsertQueueApc,...
  • 驱动

    千次阅读 2019-03-25 23:06:51
    驱动法: 一种编程模式,从表里面查找信息而不使用逻辑语句(if、case)。事实上,凡是能通过逻辑语句来选择的事物,都可以通过查表来选择。对简单的情况而言,使用简单的逻辑语句更为容易和直白,但随着逻辑链的...
  • Deepin20.1安装Nvidia驱动教程

    千次阅读 2021-01-17 00:31:12
    三、安装Nvidia驱动 到Nvidia官网下载驱动: 如果不知道自己驱动的具体信息,可以通过以下命令查看: lspci|grep -i nvidia 为驱动程序添加可执行权限: chmod a+x ~/Downloads/NVIDIA-Linux-x86_64-455.45.01.run ...
  • 在 ESXi 5.x 中,swfw.sh命令随vm-support支持包收集工具一起提供。swfw.sh命令可用来识别连接...获取主机总线适配器驱动程序和固件信息 要确定主机总线适配器的驱动程序和固件版本,请执行以下操作: 要确定...
  • Linux串口驱动程序(6)-串口驱动实现

    千次阅读 2019-06-13 11:23:35
    在Linux驱动开发中,一般都不会从0开始写,我们做的更多的是移植和修改,有时候还需要对驱动程序进行优化。当然具备移植、修改驱动能力的基础是能够读懂驱动程序,同时需要对这个驱动程序的核心功能非常了解。接下来...
  • MySQL驱动jar包下载

    千次阅读 2021-01-19 02:13:04
    MySQL JDBC驱动是Java连接MySQL数据库时要用到的驱动包,MySQL驱动就是赋值外界与数据的连接接口 ,对于专业的Java开发人员一定会使用到的MySQL驱动Jar包的,有需要的赶快来试试吧!【功能特点】易于开发的特点,...
  • Windows Server 2019安装Intel I211网卡驱动

    千次阅读 2021-05-12 09:35:25
    由于Windows系统原因,一般桌面主板自带的Intel网卡(典型的包括I211、I211-AT、I217-V、I218-V、I219-V)等,都无法在Windows Server系统上找到对应的驱动。但是,这些网卡几乎都有对应的服务器主板版本(例如I219-LM)...
  • Android Binder实现浅析-Binder驱动

    千次阅读 多人点赞 2019-07-04 10:53:34
    本文将以及解析,并对Binder驱动实现、Native层实现、Java层实现三块做一个总结分析。 Binder学习思路 Binder与传统IPC的区别 Binder驱动的内部设计、数据结构 Binder驱动与应用程序进程(C/S)之间的通信过程 ...
  • 如果您使用Dell Backup and Recovery或其他出厂重置方法执行了戴尔PC的出厂重置,我们也建议您安装或更新设备驱动程序。 这将确保您在PC上安装最新的设备驱动程序,并确保设备以最佳状态运行。 注:我们强烈建议您...
  • Linux驱动调试手段:打印信息日志

    千次阅读 2013-05-24 15:20:10
    1.printk 1.1 printk的优点:  a. 在中断中调用  b. 在进程上下文中调用  c.在持有锁时调用 ... d.... a....1.3 printk打印信息的级别 1.4 printk的使用 eg.  printk( KERN_WARNING“This is
  • Linux安装NVIDIA显卡驱动的正确姿势

    万次阅读 多人点赞 2018-08-20 21:05:58
    Linux安装NVIDIA显卡驱动的正确姿势 什么是nouveau驱动? 检测NVIDIA驱动是否成功安装 集显与独显的切换 使用标准仓库进行自动化安装 使用PPA仓库进行自动化安装 使用官方的NVIDIA驱动进行手动安装 Linux...
  • windows server 2016 安装有线网卡驱动

    千次阅读 2020-12-30 13:42:41
    为自己的本本安装了server 2016系统,但是官网下载的有线网卡驱动一直安不上...NDIS64文件夹,找到名称为e1d64x64的文件 (注意是类型为安装信息,后缀ini)。2、用记事本打开,找到 I219-V 对应的ID 应该是 E1570.6.3...
  • CH340 Linux驱动使用教程

    万次阅读 多人点赞 2017-04-14 11:53:26
    在官方Linux内核版本中自Kernel2.6以后就默认包含了对CH340/CH341芯片的驱动支持了,但比较遗憾的是该自带驱动版本较老(由开源社区开发者提交)已不能满足使用需求了,因此我们需要用芯片官网提供的新驱动进行替换...
  • Ubuntu 16.04上已装有CUDA 8.0,现在想再安装CUDA 10.0,由于已安装的显卡驱动版本396.54不支持CUDA 10.0,因此安装CUDA 10.0...1. 升级显卡驱动版本到430,依次执行如下命令后,重启电脑, sudo apt-get update sudo
  • 解决Ubuntu 显卡驱动升级导致的 显卡驱动和内核版本不匹配的问题 不要轻易升级显卡驱动版本!!!!!!!!!!! 1. 完全卸载Ubuntu当前显卡驱动 查看目前显卡驱动版本:sudo dpkg --list | grep nvidia-* sudo ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 588,491
精华内容 235,396
关键字:

信息驱动执行