搜索
bottom↓
回复: 23

把我这段时间学习的linux 内容 上传一下 。 东西凌乱有点杂

[复制链接]

出0入4汤圆

发表于 2020-3-29 01:09:39 | 显示全部楼层 |阅读模式
本帖最后由 kyq_linux 于 2020-3-29 01:11 编辑

/***************************        C        ***************************/
/*        [] const  int  a,int  const  a, const  int  * a,  const  int  const  * a;的区别?*/
        const  int  a             a的值不可变
        int  const  a             a的值不可变
        const  int  * a           a可变,a指向得内容不可改变
        const  int  const  * a          a和a指向的内容都不可变       
        http://www.cnblogs.com/xwdreamer/archive/2012/04/12/2444494.html
       
/*        [] inline的作用? */       
        提高代码执行效率
/*         [] volatile 的作用?*/
        这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。
/*        [] #ifndef  define   #end  的作用 */
        防止被重复定义       
       
/*        [] 用变量a给出下面的定义 */
a) 一个整型数
        (An integer)
b) 一个指向整型数的指针
        ( A pointer to an integer)
c) 一个指向指针的的指针,它指向的指针是指向一个整型数
        ( A pointer to a pointer to an intege)r
d) 一个有10个整型数的数组
        ( An array of 10 integers)
e) 一个有10个指针的数组,该指针是指向一个整型数的。
        (An array of 10 pointers to integers)
f) 一个指向有10个整型数数组的指针
        ( A pointer to an array of 10 integers)
g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数
        (A pointer to a function that takes an integer as an argument and returns an integer)
h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数
        ( An array of ten pointers tofunctions that take an integer argument and return an integer )
                               
a) int a;
b) int *a;
c) int **a;
d) int a[10];
e) int *a[10];
f) int (*a)[10];
g) int (*a)(int);
h) int (*a[10])(int);

/*************************** UBOOT ***************************/
/*        [] bootloader和uboot的区别?*/
        uboot是BootLoader的一种

/*        [] 如何移植uboot? */
        1. 指定交叉编译链
        2. 指定产品BOARD
        3. 实现能看到串口终端信息
        4. 网卡移植
        5. FLASH移植 (EMMC)

/*        [] uboot的启动流程?*/
        1、  设置异常向量表
        2、  关中断,设置cpu的工作状态为arm状态,设置cpu的工作模式svc.
        3、  关MMU, 使能 I-CACHE.
        4、  初始化时钟
        5、  初始化DRAM
        6、  初始化串口
        7、  设置栈
        8、  重定位
        9、  进一步初始化硬件
        10、 启动内核

/*        [] uboot是如何引导内核?*/
        加载内核
        判断镜像
        相关环境变量 bootcmd bootargs
   
/*************************** HARD ***************************/   
/*        [] arm中icache的作用 */
        在主存与CPU之间设置的一个高速的容量较小的存储器,叫做cache。
                cache可以分为Dcache,Icache。分别cache data和 instruction。
        其中Dcache必须在MMU开启后才能在CP15寄存器中使能,Icache在MMU未使能的情况下,也是可以使能的。
       
        Cache是一种容量比较小,但访问速度比较快存储器。
        由于处理器的速度远高于主存,处理器直接从内存中存取数据要等待一定周期,
        而Cache位于处理器与主存之间,保存着最近一段时间处理器涉及到的主存块内容。
        在需要读取数据是,处理器可能就会从Cache中读取需要的数据,
        而不是从主存中获取数据,这样就提高了系统的运行效率   

/*        []        i2c时序        */
    在通信的过程中有三种信号:
            起始信号: 时钟线为高电平,数据线由高到低表示开始发送起始信号
                结束信号: 时钟线为高电平,数据线由低到高表示结束信号
                应答信号: 在第九个时钟周期,主机或者从机拉高数据线,如果从机给主机应答,数据线拉低,主机判断数据线
                                   高电平还是低电平,如果是低电平,表示从机给主机应答信号.
                                 
               
        i2c总线在时钟线为高电平保持稳定,主机/从机  读取数据
        低电平数据可以发生变化,  主机/从机不能读取数据。

    主机发送起始信号,发送7bit的从机地址加1bit的写位,从机接收后给主机应答信号,主机发送8bit的寄存器的地址,从机
    接收后主机应答信号。

    主机重复发送起始信号,发送7bit的从机地址加1bit的读位,        从机接收后给主机应答信号,从机发送8bit的数据,主机接收后
        给从机一个应答信号,从机继续发送8bit的数据,如果主机没有应答,表示通信结束.

/*        [] spi的工作模式有几种?*/
     有4种
     0   0  
     0   1
     1   0  
     1   1        
        CPOL:时钟极性选择,为0时SPI总线空闲为低电平,为1时SPI总线空闲为高电平
        CPHA:时钟相位选择,为0时在SCK第一个跳变沿采样,为1时在SCK第二个跳变沿采样
        https://blog.csdn.net/guomutian911/article/details/72813067  


/* [] IIC,SPI,串口的区别?*/
        http://blog.csdn.net/a746742897/article/details/52503298
        i2c,spi,串口三种总线的区别?
          
    串口:通常使用3根线,RX,TX,GND        异步,全双工        传输速率: 3M
       
        1、 i2c:SCL,SDA,i2c是半双工, spi 全双工    4根线 (SCL,MOSI,MISO,CS)
        2、 i2c总线多主机通信,通过SDA数据线上数据来锁定设备,spi总线只有一个主设备,主设备通过cs片选引脚来锁定设备,
                cs片选引脚拉低,选中这个设备,拉高,不会选中这个设备。
        3、 i2c传输速率在标准模式下100k,在快速模式400k,spi总线传输速度更快,可以达到50M。
        4、 i2c总线在空闲状态下SDA,SCL都是高电平,spi总线状态由CPOL,CPHA决定.
        5、 i2c总线时钟为高电平,数据线由高到低(下降沿)表示开始传输数据,上升沿表示数据传输结束。
                spi总线cs片选引脚拉低表示开始传输数据,cs片选引脚拉高表示数据传输结束。
        6、 i2c总线时钟线为高电平采样,时钟线为低电平数据可以发生改变,spi总线什么时候采用取决于CPHA.       
        7、 i2c和spi总线在传输数据时都是高位在前,低位在后。
        8、 i2c和spi总线时钟都是由主设备产生,并且时钟都是数据传输时产生。
        9、 i2c总线读写时序比较固定,设备驱动编写简单,spi总线时序比较复杂,每一个设备时序不一样,必须参考设备的芯片编写。       
       
/***************************        设备树         ***************************/               
/*        [] 设备树中 reg   interrupt-parent  interrupts   status  pinctl-0   pinctl-name  compatible 表示什么?*/   
    reg:属性来将地址信息编码进设备树,表示该设备的地址范围;来获取寄存器相关的地址信息列表
        interrupt-parent:标识此设备节点属于哪一个中断控制器,如果没有设置这个属性,会自动依附父节点的
        interrupts,一个中断标识符列表,表示每一个中断输出信号
        status:设置外设节点的状态;       
        pinctl-name: 引脚可以配置多种状态,
                                 default状态表示设备处于active时的状态,一般在设备驱动的.resume中配置,另外在启动时也会配置pin脚为default状态。
                                 idle状态表示系统处于idle时需要配置的pin脚状态,此时系统并没有进入深度休眠。
                                 sleep状态表示系统处于深度休眠时的pin脚状态,一般在设备驱动的.suspend中配置。                                 
        compatible:        一个特殊的字符串,是系统赖以查找对应的设备驱动程序的一个关键值,
                                系统就是根据它的值来查找这个设备应该使用哪一个驱动的。       
                               
/***************************        驱动         ***************************/
/* [] 字符设备驱动实现流程?*/
        申请设备号:
        注册设备号
        申请cdev结构体
        申请file_operations结构体,并初始化
        初始化cdev结构体:
        cdev结构体的注册
        cdev结构体的注销:
        设备号的注销:
       
        自动创建设备节点第一步,创建类
        自动创建设备节点第二步,在类下创建设备链接文件,并且在/dev下创建设备节点
        自动创建设备节点第三步,注销设备
        自动创建设备节点第四步,注销类       
       
/* [] insmod一个驱动模块,会执行模块中的哪个函数?
*          rmmod呢?这两个函数在设计上要注意哪些?
*          遇到过卸载驱动出现异常没?是什么问题引起的?
*/
        module_init
        module_exit       
        缺少目录:/lib/modules/3.14.0
        在init函数中申请的资源在exit函数中要释放,包括存储,ioremap,定时器,工作队列等等。       

/*        [] 字符型驱动设备你是怎么创建设备文件的,就是/dev/下面的设备文件,供上层应用程序打开使用的文件?*/
        mknod   
    自动创建:
      class_create
      device_create
/*        [] 如何自动创建设备文件?*/
        1. mknod filename type major minor
        2. devno = MKDEV(major,minor);
           cls = class_create(THIS_MODULE, "myclass");   sys/class/myclass
           device_create(cls,NULL,devno,NULL,"led");     sys/class/myclass/led
          
           mdev  -s   自动扫描   /sys/class 和/sys/block中所以的类设备目录,如果在目录下
           含有名为dev等的文件系统,则mdev就会利用这些信息在dev目录下创建设备文件。
          
/* []输入子系统分为哪几层?如何编写设备驱动?*/
        从上到下由三层实现,分别为:
        输入子系统事件处理层 、
        输入子系统核心层 、
        输入子系统设备驱动层。
       
        输入子系统包括两类驱动程序:事件驱动程序和设备驱动程序。
        事件驱动程序负责和应用程序的接口,而设备驱动程序负责和底层输入设备的通信。       

/*        [] 内核为什么要引入平台总线?*/
        将驱动与硬件分离

/*        [] 设备驱动模型三个重要成员是?
*        platfoem总线的匹配规则是?
*        在具体应用上要不要先注册驱动再注册设备?有先后顺序没?
*/
        驱动        设备        总线   
        名字相同  
        没有先后顺序
       
/*        [] platform总线设备及总线设备如何编写?*/
        驱动    硬件
       
/*        [] led驱动编写有几种方式?*/
        1. 字符设备驱动(驱动和硬件信息绑定)
        2. 基于平台总线(字符设备驱动)  驱动和硬件信息分离
        3. LED子系统  sysfs 属性文件
        4. input
       
/*        [] 编写驱动哪些硬件基于platform_deivce,哪些硬件信息不需要基于platform总线?*/
        和soc直连的就需要基于platform总线编写
        在soc的内部基于platform总线编写
          
        不在soc的内部,设备挂载到哪一个总线基于那个总线编写。          
        设备挂载到i2c总线,i2c总线基于platform总线,设备基于i2c总线编写          
        mcp2515 挂载到spi总线,spi总线驱动基于platform总线,mcp2515设备基于spi总线.

/*        [] soc内部如果没有i2c控制器,如何操作从机设备?*/
        gpio模拟i2c       

/*        [] IIC原理,总线框架,设备编写方法,i2c_msg */

        i2c_adapter
       i2c_aigorithm
          master_xfer  操作从机设备
         
    i2c_transfer
     
    i2c_msg 有多少个起始位就有多少个消息,消息的长度以字节的形式表示

/*        [] 查看驱动模块中打印信息应该使用什么命令?
*        如何查看内核中已有的字符设备的信息?如何查看正在使用的有哪些中断号?
*/
        dmesg cat /proc/devices
    dmesg cat /proc/interrupt

/*        [] 在驱动调试过程中遇到过oops没?你是怎么处理的?*/
        1. arm-none-linux-gnueabi-addr2line   地址   -e  vmlinux  -f
    2. printk  

/*        [] ioctl和unlock_ioctl有什么区别?*/

        kernel 2.6.35 及之前的版本中struct file_operations 一共有3个ioctl :
                        ioctl,unlocked_ioctl和compat_ioctl
                        现在只有unlocked_ioctl和compat_ioctl 了
        在kernel 2.6.36 中已经完全删除了struct file_operations 中的ioctl 函数指针,
                        取而代之的是unlocked_ioctl,compat_ioctl被使用在用户空间为32位模式,
                        而内核运行在64位模式时。这时候,需要将64位转成32位。
                       
/*        i2c总线在通信的过程中,如果读取的数据有问题,你该怎么解决? */
    示波器 量 goio或者i2c输出的波形和芯片手册提供的时序是否一致,如果不一样肯定是代码出现了问题。

       
/***************************        IO        ***************************/       
/*        [] 标准IO和文件IO的区别?*/
        标准IO:库,带缓冲的IO(减少系统调用的次数),通过流操作文件,高级IO。
        文件IO:系统调用,不带缓存(内核缓存), 通过文件描述符操作文件,低级IO。       

/***************************        进程间通信        ***************************/       
/*        [] 进程和线程区别?*/

        进程的地址空间是独立的。线程的地址空间共享的。
    进程消耗的资源比较大,线程消耗的资源比较小
    进程和进程通信通过进程间通信方式,线程和线程通信通过全局变量。
       
/*        [] 进程间通信方式有几种?每一种的特点?*/

        无名管道:一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用
        有名管道:也是一种半双工的通信方式,但是它允许无亲缘关系进程间的通信。
        信号:是在软件层次上对中断机制的一种模拟,用于通知进程某事件发生
        消息队列:消息的链接表
        共享内存:最有效的进程间通信方式,这种方式需要依靠某种同步机制,互斥锁或者信号量
        信号灯集:
        socket:tcp、udp       

/*        [] fork和vfork的区别?*/
   fork创建的进程的地址空间是独立的。vfork 创建的进程的地址空间共享的。
   fork创建的进程子进程和父进程没有先后顺序。但是vfrok创建的进程子进程先运行。       
   
/*        [] 如何编写守护进程,简述syslog的作用?*/
        1. 创建子进程,父进程退出
        2. 在子进程中创建新会话
        3. 改变工作目录
        4. 重设文件权限掩码
        5. 关闭文件描述符
       
        由于守护进程是完全脱离终端的,所以用gdb无法调试,使用syslog服务将程序的出错信息输入到系统的日志文件中
        其中会规定消息的等级,消息的输出格式等       
       
/*        [] select,poll,epoll的区别?*/
        select特点:
    1、 将表从用户空间拷贝到内核空间
    2、 清空表
    3、 遍历
    4、 将表从内核空间拷贝到用户空间
    5、 select支持文件描述符的个数  1024
       
        poll特点:
        1、 将表从用户空间拷贝到内核空间
        2、 遍历
        3、 将表从内核空间拷贝用户空间
        4、 poll支持的文件描述符比select多
         
(1)select,poll实现需要自己不断轮询所有fd集合,直到设备就绪,期间可能要睡眠和唤醒多次交替。
      而epoll其实也需要调用epoll_wait不断轮询就绪链表,期间也可能多次睡眠和唤醒交替,
          但是它是设备就绪时,调用回调函数,把就绪fd放入就绪链表中,并唤醒在epoll_wait中进入睡眠的进程。
          虽然都要睡眠和交替,但是select和poll在“醒着”的时候要遍历整个fd集合,
          而epoll在“醒着”的时候只要判断一下就绪链表是否为空就行了,这节省了大量的CPU时间。
          这就是回调机制带来的性能提升。

(2)select,poll每次调用都要把fd集合从用户态往内核态拷贝一次,并且要把current往设备等待队列中挂一次,
      而epoll只要一次拷贝,而且把current往等待队列上挂也只挂一次
     (在epoll_wait的开始,注意这里的等待队列并不是设备等待队列,只是一个epoll内部定义的等待队列)。
      这也能节省不少的开销   
          
/*        [] 内核中select和异步通知的区别?*/

        select不断的轮询来判断是否有资源就绪
        异步通知是等资源就绪时,就通知程序,程序不需要轮询来检查是否有资源就绪


/*        []        linux文件系统的分类?*/
        磁盘文件系统 ext2,ext3,ext4,yaffs,jeffs2,cramfs
        nandflash:yaffs,jeffs,cramfs               
    emmc:ext2,ext3,ext4
                         
        busybox:包含几百个命令以及工具的集合
         |
         |                  
                  ----------------------->rootfs----------打包成某一种格式-------------->磁盘文件系统         
    网络文件系统:nfs
    特殊文件系统:sysfs(为应用程序提供统一的接口),proc(进程),
                sysfs ------>sys  
        proc ------>proc 以进程号命名的目录,cpu的信息,向系统中注册的设备,注册的中断(中断号),
                                        device-tree 设备树的信息

/*        [] sysfs主要的作用?*/

    将内核的数据结构及其属性导出到用户空间的方法.
    kobject                        /sys/目录
    device_attribute     /sys/目录/属性文件        读写方法

        是一个虚拟的文件系统,可以产生一个包括所有系统硬件的层级视图。sysfs把连接在系统上的设备和总线组织成为一个分级的文件
        ,他们可以由用户空间存取,向用户空间导出内核数据结构以及它们的属性,展示设备驱动模型中各组件的层次关系         

/*        [] 中断和轮询哪个效率高?怎样决定是采用中断方式还是采用轮询方式去实现驱动?*/

   中断是CPU处于被动状态下来接受设备的信号,而轮询是CPU主动去查询该设备是否有请求。
   凡事都是两面性,所以,看效率不能简单的说那个效率高。如果是请求设备是一个频繁请求cpu的设备,
   或者有大量数据请求的网络设备,那么轮询的效率是比中断高。如果是一般设备,
   并且该设备请求cpu的频率比较低,则用中断效率要高一些。主要是看请求频率。

/*        [] 中断是嵌入式系统中重要的组成部分,
*        这导致了很多编译开发商提供一种扩展—让标准C支持中断。
*        具代表事实是,产生了一个新的关键字__interrupt。
*        下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),
*        请评论一下这段代码的。
*/       
        __interrupt double compute_area (double radius){
        double area = PI * radius * radius;
        printf("\nArea = %f", area);
        return area;
        }                               
                       
        1. ISR不能返回一个值。
        2. ISR不能传递参数。
        3. 在许多处理器编译器中,浮点一般都是不可冲入的。有些处理器编译器需要让额外的寄存器入栈,
                有些处理器编译器就不允许在ISR中做浮点运算。此外ISR应该是短而有效率的。在ISR中做浮点运算是不明智的。
        4. printf --> printk

/*        [] TCP和udp的区别?*/
        TCP 有连接,可靠的,三次握手
        UDP 无连接,不可靠
       
/*        [] 如何实现http服务器?*/
    1. 创建套接字
        2. 绑定ip地址和端口号   http默认端口号为80
        3. 设置监听
        4. 等待连接
        5. 调用send函数发送 网页(open,read)       

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入4汤圆

 楼主| 发表于 2020-3-29 01:11:51 | 显示全部楼层
/*
| .obj/renderview.o(.debug_info+0x80c44): error: undefined reference to '.LASF18078'
| .obj/renderview.o(.debug_info+0x80c62): error: undefined reference to '.LASF18079'
| .obj/renderview.o(.debug_info+0x80c81): error: undefined reference to '.LASF18080'
| collect2: error: ld returned 1 exit status
| Makefile:1131: recipe for target '../../lib/libQt53DRender.so.5.6.2' failed
| make[2]: *** [../../lib/libQt53DRender.so.5.6.2] Error 1
| make[2]: Leaving directory '/home/kyq/nfs/fsl-release-bsp/build/tmp/work/cortexa7hf-neon-poky-linux-gnueabi/qt3d/5.6.1+gitAUTOINC+7fab1fa656-r0/build/src/render'
| Makefile:80: recipe for target 'sub-render-make_first' failed
| make[1]: *** [sub-render-make_first] Error 2
| make[1]: Leaving directory '/home/kyq/nfs/fsl-release-bsp/build/tmp/work/cortexa7hf-neon-poky-linux-gnueabi/qt3d/5.6.1+gitAUTOINC+7fab1fa656-r0/build/src'
| Makefile:45: recipe for target 'sub-src-make_first' failed
| make: *** [sub-src-make_first] Error 2
| WARNING: exit code 1 from a shell command.
| ERROR: oe_runmake failed
| ERROR: Function failed: do_compile (log file is located at /home/kyq/nfs/fsl-release-bsp/build/tmp/work/cortexa7hf-neon-poky-linux-gnueabi/qt3d/5.6.1+gitAUTOINC+7fab1fa656-r0/temp/log.do_compile.61385)
ERROR: Task 3024 (/home/kyq/nfs/fsl-release-bsp/sources/meta-qt5/recipes-qt/qt5/qt3d_git.bb, do_compile) failed with exit code '1'
*/
bitbake -c clean qt3d
bitbake -c do_compile qt3d
bitbake fsl-image-qt5

出0入4汤圆

 楼主| 发表于 2020-3-29 01:12:08 | 显示全部楼层
tar

-c: 建立压缩档案
-x:解压
-t:查看内容
-r:向压缩归档文件末尾追加文件
-u:更新原压缩包中的文件

这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个。下面的参数是根据需要在压缩或解压档案时可选的。

-z:有gzip属性的
-j:有bz2属性的
-Z:有compress属性的
-v:显示所有过程
-O:将文件解开到标准输出

下面的参数-f是必须的

-f: 使用档案名字,切记,这个参数是最后一个参数,后面只能接档案名。

# tar -cf all.tar *.jpg
这条命令是将所有.jpg的文件打成一个名为all.tar的包。-c是表示产生新的包,-f指定包的文件名。

# tar -rf all.tar *.gif
这条命令是将所有.gif的文件增加到all.tar的包里面去。-r是表示增加文件的意思。

# tar -uf all.tar logo.gif
这条命令是更新原来tar包all.tar中logo.gif文件,-u是表示更新文件的意思。

# tar -tf all.tar
这条命令是列出all.tar包中所有文件,-t是列出文件的意思

# tar -xf all.tar
这条命令是解出all.tar包中所有文件,-t是解开的意思

压缩

tar -cvf jpg.tar *.jpg     //将目录里所有jpg文件打包成tar.jpg

tar -czf jpg.tar.gz *.jpg   //将目录里所有jpg文件打包成jpg.tar后,并且将其用gzip压缩,生成一个gzip压缩过的包,命名为jpg.tar.gz

tar -cjf jpg.tar.bz2 *.jpg   //将目录里所有jpg文件打包成jpg.tar后,并且将其用bzip2压缩,生成一个bzip2压缩过的包,命名为jpg.tar.bz2

tar -cZf jpg.tar.Z *.jpg    //将目录里所有jpg文件打包成jpg.tar后,并且将其用compress压缩,生成一个umcompress压缩过的包,命名为jpg.tar.Z

rar a jpg.rar *.jpg       //rar格式的压缩,需要先下载 rar 和 unrar for linux

zip jpg.zip *.jpg        //zip格式的压缩,需要先下载 zip 和 unzip for linux

7z a jpg.7z *.jpg        //7z格式的压缩,需要先下载 p7zip-full for linux

解压

tar -xvf file.tar       //解压 tar包

tar -xzvf file.tar.gz       //解压 tar.gz

tar -xjvf file.tar.bz2     //解压 tar.bz2

tar -xZvf file.tar.Z     //解压 tar.Z

unrar e file.rar        //解压 rar

unzip file.zip         //解压 zip

7z x file.7z           //解压 7z

出0入4汤圆

 楼主| 发表于 2020-3-29 01:12:30 | 显示全部楼层
/* 如何找到im6ul对应的pinctrl 子系统驱动 */

/* 1.设备树里面的设备节点是如何跟驱动匹配起来的 */
/*        通过compatible ,此属性是字符串列表 寻找 */
/* imx6ull.dtsi */
iomuxc: iomuxc@020e0000 {
        compatible = "fsl,imx6ul-iomuxc";
        reg = <0x020e0000 0x4000>;
        };
/*        全局搜索compatible中的字符串 去找到驱动文件        */       
/*        pinctrl-imx6ul.c        */
static struct of_device_id imx6ul_pinctrl_of_match[] = {
        { .compatible = "fsl,imx6ul-iomuxc", .data = &imx6ul_pinctrl_info, },
        { .compatible = "fsl,imx6ull-iomuxc-snvs", .data = &imx6ull_snvs_pinctrl_info, },
        { /* sentinel */ }
};
/*        当驱动和设备匹配以后        */
/* imx6ul_pinctrl_info        */
static struct imx_pinctrl_soc_info imx6ul_pinctrl_info = {
        .pins = imx6ul_pinctrl_pads,
        .npins = ARRAY_SIZE(imx6ul_pinctrl_pads),
};
/* imx_pinctrl_soc_info */
struct imx_pinctrl_soc_info {
        struct device *dev;
        const struct pinctrl_pin_desc *pins;
        unsigned int npins;
        struct imx_pin_reg *pin_regs;
        struct imx_pin_group *groups;
        unsigned int ngroups;
        struct imx_pmx_func *functions;
        unsigned int nfunctions;
        unsigned int flags;
        u32 grp_index;
}
/*        imx6ul_pinctrl_pads        */
static const struct pinctrl_pin_desc imx6ul_pinctrl_pads[] = {
        IMX_PINCTRL_PIN(MX6UL_PAD_RESERVE0),
        IMX_PINCTRL_PIN(MX6UL_PAD_RESERVE1),
        IMX_PINCTRL_PIN(MX6UL_PAD_RESERVE2),
        IMX_PINCTRL_PIN(MX6UL_PAD_RESERVE3),
        IMX_PINCTRL_PIN(MX6UL_PAD_RESERVE4),
...
};
/*        执行imx6ul_pinctrl_probe */
static int imx6ul_pinctrl_probe(struct platform_device *pdev)
{
        const struct of_device_id *match;
        struct imx_pinctrl_soc_info *pinctrl_info;

        match = of_match_device(imx6ul_pinctrl_of_match, &pdev->dev);

        if (!match)
                return -ENODEV;

        pinctrl_info = (struct imx_pinctrl_soc_info *) match->data;

        return imx_pinctrl_probe(pdev, pinctrl_info);
}
static struct platform_driver imx6ul_pinctrl_driver = {
        .driver = {
                .name = "imx6ul-pinctrl",
                .owner = THIS_MODULE,
                .of_match_table = of_match_ptr(imx6ul_pinctrl_of_match),
        },
        .probe = imx6ul_pinctrl_probe,
        .remove = imx_pinctrl_remove,
};
/* -> imx_pinctrl_probe */
int imx_pinctrl_probe(struct platform_device *pdev,
                      struct imx_pinctrl_soc_info *info)
{
        ...
/*        pinctrl_desc初始化        */       
        imx_pinctrl_desc->name = dev_name(&pdev->dev);
        imx_pinctrl_desc->pins = info->pins;
        imx_pinctrl_desc->npins = info->npins;
        imx_pinctrl_desc->pctlops = &imx_pctrl_ops;
        imx_pinctrl_desc->pmxops = &imx_pmx_ops;
        imx_pinctrl_desc->confops = &imx_pinconf_ops;
        imx_pinctrl_desc->owner = THIS_MODULE;
/*        ->        imx_pinctrl_probe_dt        */       
        ret = imx_pinctrl_probe_dt(pdev, info);
        if (ret) {
                dev_err(&pdev->dev, "fail to probe dt properties\n");
                return ret;
        }

        ipctl->info = info;
        ipctl->dev = info->dev;
        platform_set_drvdata(pdev, ipctl);
/*        通过 pinctrl_register 注册函数向系统中注册 pinctrl_desc 结构体        */       
        ipctl->pctl = pinctrl_register(imx_pinctrl_desc, &pdev->dev, ipctl);
        if (!ipctl->pctl) {
                dev_err(&pdev->dev, "could not register IMX pinctrl driver\n");
                return -EINVAL;
        }

        dev_info(&pdev->dev, "initialized IMX pinctrl driver\n");

        return 0;
}
/*        ->        imx_pinctrl_probe_dt */       
/*         -> imx_pinctrl_parse_functions        */
/*          -> imx_pinctrl_parse_groups        */
/*        保存<mux_reg conf_reg input_reg mux_mode input_val>参数        */
/*        pin->config = config & ~IMX_PAD_SION;        */
static int imx_pinctrl_parse_groups(struct device_node *np,
                                    struct imx_pin_group *grp,
                                    struct imx_pinctrl_soc_info *info,
                                    u32 index)
{
                ....
                pin_id = (mux_reg != -1) ? mux_reg / 4 : conf_reg / 4;
                pin_reg = &info->pin_regs[pin_id];
                pin->pin = pin_id;
                grp->pin_ids[i] = pin_id;
                pin_reg->mux_reg = mux_reg;
                pin_reg->conf_reg = conf_reg;
                pin->input_reg = be32_to_cpu(*list++);
                pin->mux_mode = be32_to_cpu(*list++);
                pin->input_val = be32_to_cpu(*list++);

                /* SION bit is in mux register */
                config = be32_to_cpu(*list++);
                if (config & IMX_PAD_SION)
                        pin->mux_mode |= IOMUXC_CONFIG_SION;
                pin->config = config & ~IMX_PAD_SION;

                dev_dbg(info->dev, "%s: 0x%x 0x%08lx", info->pins[pin_id].name,
                                pin->mux_mode, pin->config);
        }

        return 0;
}
/*        ->imx6ul_pinctrl_probe        */
/*        ->imx_pinctrl_probe*/
        //配置pin的电气属性
        /*        ->&imx_pinconf_ops*/
        /*        ->imx_pinconf_set*/       
        //配置pin的复用
        /*        ->imx_pmx_ops        */
        /*        ->imx_pmx_set        */       

出0入4汤圆

 楼主| 发表于 2020-3-29 01:12:47 | 显示全部楼层
ln -s 源文件 目标文件

ln -s libts.so.0.10.3 libts.so
ln -s libts.so.0.10.3 libts.so.0

出0入4汤圆

 楼主| 发表于 2020-3-29 01:13:09 | 显示全部楼层
/*        imx6ull.dtsi        */
/*        gpio1控制器        */
gpio1: gpio@0209c000 {
        compatible = "fsl,imx6ul-gpio", "fsl,imx35-gpio";
        reg = <0x0209c000 0x4000>;
        interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>,
        <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;
        gpio-controller;
        #gpio-cells = <2>;
        interrupt-controller;
        #interrupt-cells = <2>;
};
#if 0        //fsl-imx-gpio.txt
/*        Documentation/devicetree/bindings/gpio/fsl-imx-gpio.txt        */
Required properties:
- compatible : Should be "fsl,<soc>-gpio"
- reg : Address and length of the register set for the device
- interrupts : Should be the port interrupt shared by all 32 pins, if
  one number.  If two numbers, the first one is the interrupt shared
  by low 16 pins and the second one is for high 16 pins.
- gpio-controller : Marks the device node as a gpio controller.
- #gpio-cells : Should be two.  The first cell is the pin number and
  the second cell is used to specify the gpio polarity:
      0 = active high
      1 = active low
- interrupt-controller: Marks the device node as an interrupt controller.
- #interrupt-cells : Should be 2.  The first cell is the GPIO number.
  The second cell bits[3:0] is used to specify trigger type and level flags:
      1 = low-to-high edge triggered.
      2 = high-to-low edge triggered.
      4 = active high level-sensitive.
      8 = active low level-sensitive.
#endif
/*        imx6ull-alientek-emmc.dts        */
&usdhc1 {
        pinctrl-names = "default", "state_100mhz", "state_200mhz";
        pinctrl-0 = <&pinctrl_usdhc1>;
        pinctrl-1 = <&pinctrl_usdhc1_100mhz>;
        pinctrl-2 = <&pinctrl_usdhc1_200mhz>;
       
        /*        定义了一个cd-gpios        */
        cd-gpios = <&gpio1 19 GPIO_ACTIVE_LOW>;       
       
        keep-power-in-suspend;
        enable-sdio-wakeup;
        vmmc-supply = <&reg_sd1_vmmc>;
        status = "okay";
};

/*        驱动中对gpio的操作函数        流程        */
1. 获取到GPIO所处的设备节点        比如
2. 获取GPIO 返回值就是GPIO的编号
3. 请求GPIO编号
4. 设置GPIO 输入或输出  
        4.1 输入: 读取GPIO值
        4.2 输出: 设置GPIO值

...释放GIPO编号


/*        GPIO驱动        */
1. gpiolib
        1.1 给原厂GPIO底层驱动
        1.2 给驱动开发人员使用GPIO操作函数
       
/*<应用层>                        < gpiolib >                        <底层>*/
                               
                        <-提供相同的API函数
                                供应用层使用
                               
                        要求底层实现 gpio_chip 的注册
                                并实现API函数的封装 ->
                               
               
int gpiochip_add(struct gpio_chip *chip);

struct gpio_chip {
        const char                *label;
        struct device                *dev;
        struct module                *owner;
        struct list_head        list;
        int                        (*request)(struct gpio_chip *chip,
                                                unsigned offset);
        void                        (*free)(struct gpio_chip *chip,
                                                unsigned offset);
        int                        (*get_direction)(struct gpio_chip *chip,
                                                unsigned offset);
        int                        (*direction_input)(struct gpio_chip *chip,
                                                unsigned offset);
        int                        (*direction_output)(struct gpio_chip *chip,
                                                unsigned offset, int value);
        int                        (*get)(struct gpio_chip *chip,
                                                unsigned offset);
        void                        (*set)(struct gpio_chip *chip,
                                                unsigned offset, int value);
        void                        (*set_multiple)(struct gpio_chip *chip,
                                                unsigned long *mask,
                                                unsigned long *bits);
        int                        (*set_debounce)(struct gpio_chip *chip,
                                                unsigned offset,
                                                unsigned debounce);

        int                        (*to_irq)(struct gpio_chip *chip,
                                                unsigned offset);

        void                        (*dbg_show)(struct seq_file *s,
                                                struct gpio_chip *chip);
        int                        base;
        u16                        ngpio;
        struct gpio_desc        *desc;
        const char                *const *names;
        bool                        can_sleep;
        bool                        irq_not_threaded;
        bool                        exported;

}
/*        imxull.dtsi        */
/*        gpio1: gpio@0209c000        */
/*        compatible = "fsl,imx6ul-gpio", "fsl,imx35-gpio";        */

/*        gpio-mxc.c        */
static const struct of_device_id mxc_gpio_dt_ids[] = {
        { .compatible = "fsl,imx1-gpio", .data = &mxc_gpio_devtype[IMX1_GPIO], },
        { .compatible = "fsl,imx21-gpio", .data = &mxc_gpio_devtype[IMX21_GPIO], },
        { .compatible = "fsl,imx31-gpio", .data = &mxc_gpio_devtype[IMX31_GPIO], },
        { .compatible = "fsl,imx35-gpio", .data = &mxc_gpio_devtype[IMX35_GPIO], },
        { /* sentinel */ }
};
/*        platform_driver        */
static struct platform_driver mxc_gpio_driver = {
        .driver                = {
                .name        = "gpio-mxc",
                .of_match_table = mxc_gpio_dt_ids,
        },
        .probe                = mxc_gpio_probe,
        .id_table        = mxc_gpio_devtype,
};
/*        mxc_gpio_probe        */
static int mxc_gpio_probe(struct platform_device *pdev)
{
...
        mxc_gpio_get_hw(pdev);
...
        if (mxc_gpio_hwtype == IMX21_GPIO) {
                /*
                 * Setup one handler for all GPIO interrupts. Actually setting
                 * the handler is needed only once, but doing it for every port
                 * is more robust and easier.
                 */
                irq_set_chained_handler(port->irq, mx2_gpio_irq_handler);
        } else {
                /* setup one handler for each entry */
                irq_set_chained_handler(port->irq, mx3_gpio_irq_handler);
                irq_set_handler_data(port->irq, port);
                if (port->irq_high > 0) {
                        /* setup handler for GPIO 16 to 31 */
                        irq_set_chained_handler(port->irq_high,
                                                mx3_gpio_irq_handler);
                        irq_set_handler_data(port->irq_high, port);
                }
        }
        err = bgpio_init(&port->bgc, &pdev->dev, 4,
                         port->base + GPIO_PSR,
                         port->base + GPIO_DR, NULL,
                         port->base + GPIO_GDIR, NULL, 0);
...
        err = gpiochip_add(&port->bgc.gc);
        if (err)
                goto out_bgpio_remove;
...
}
/*        mxc_gpio_probe        */
/*        ->mxc_gpio_hwtype        */        //获取6ullGPIO寄存器组
/*        ->bgpio_init                */        //初始化gpio_chip
/*        ->gpiochip_add        */                //向系统添加gpio_chip





/*        mxc_gpio_get_hw */
/*        &imx35_gpio_hwdata        */
static struct mxc_gpio_hwdata imx35_gpio_hwdata = {
        .dr_reg                = 0x00,
        .gdir_reg        = 0x04,
        .psr_reg        = 0x08,
        .icr1_reg        = 0x0c,
        .icr2_reg        = 0x10,
        .imr_reg        = 0x14,
        .isr_reg        = 0x18,
        .edge_sel_reg        = 0x1c,
        .low_level        = 0x00,
        .high_level        = 0x01,
        .rise_edge        = 0x02,
        .fall_edge        = 0x03,
};

出0入4汤圆

 楼主| 发表于 2020-3-29 01:13:36 | 显示全部楼层
/*  uboot参数 */
setenv ipaddr 192.168.0.251
setenv ethaddr 00:04:9f:04:d2:35
setenv gatewayip 192.168.0.1
setenv netmask 255.255.255.0
setenv serverip 192.168.0.250
        /* EMMC */
setenv bootcmd 'mmc dev 1;fatload mmc 1:1 80800000 zImage; \
                                fatload mmc 1:1 83000000 imx6ull-alientek-emmc.dtb; \
                                bootz 80800000 - 83000000'
                               
setenv bootcmd 'mmc dev 1;fatload mmc 1:1 80800000 zImage; \
                                fatload mmc 1:1 83000000 imx6ull-14x14-emmc-7-800x480-c.dtb;\
                                bootz 80800000 - 83000000'       
        /* 网络启动 */
setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull-kyq-emmc.dtb; bootz 80800000 - 83000000'
setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull-14x14-emmc-7-800x480-c.dtb; bootz 80800000 - 83000000'


        /* EMMC 文件系统 */
setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'                                 
        /* nfs 网络文件系统 */                               
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs rw \
                                 nfsroot=192.168.0.250:/home/kyq/nfs/rootfs \
                             ip=192.168.0.251:192.168.0.250:192.168.0.1:255.255.255.0::eth0:off'

/*         /etc/init.d/rcS  启动脚本 */
#!/bin/sh

PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
runlevel=S
umask 022
export PATH LD_LIBRARY_PATH runlevel

#网络设置
ifconfig eth0 up
#udhcpc -i eth0
ifconfig eth0 192.168.1.251 netmask 255.255.255.0
route add default gw 192.168.0.1

mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts

#热插拔
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
#cd /

出0入4汤圆

 楼主| 发表于 2020-3-29 01:14:40 | 显示全部楼层
1. 修改设备树
/*        imx6ull-alientek-emmc.dts        */
/{
...
/*添加kyqgpioled节点*/
        kyqgpioled{
                compatible = "kyqgpioled,gpioled";
                pinctrl-names = "default";
                led-gpios = <&gpio1 3 GPIO_ACTIVE_LOW>;
                pinctrl-0 = <&pinctrl_gpioled>;
                status = "okay";
        };
}

&iomuxc {
...
        imx6ul-evk {
/*        添加pinctrl_gpioled*/
                pinctrl_gpioled: ledgrp{
                        fsl,pins = <
                        MX6UL_PAD_GPIO1_IO03__GPIO1_IO03        0X01B0
                        >;
                };
        ...
        }
...
}               
/*        make dtbs        */
/*        重启开发板        */

2. 编写驱动
/*        编写linux驱动模块的基本步骤:*/
<1> 头文件
#include <linux/init.h>
#include <linux/module.h>
...
<2>许可权限GPL
MODULE_LICENSE("GPL");
MODULE_AUTHOR("xxx");        /*        添加作者信息        */

<3>模块入口函数
<4>模块出口函数

<5>模块入口
module_init(xxx_init);
<6>模块出口
module_exit(xxx_exit);


/*        字符设备驱动框架        */
<1> struct cdev cdev          /*        针对字符设备的通用描述        */
struct  chr_cdev
{
        struct cdev cdev;//通用的字符设备描述
        ....
};

struct chr_cdev chr_cdev;                  
/*
*        需要给自己设计的结构体分配空间(内核申请空间使用kmalloc函数)
*        kmalloc(sizeof(*pdev), GFP_KERNEL);
*/

<2>提供硬件设备的操作函数接口
struct file_operations 结构体做填充
static struct file_operations xxx_fops = {
        .owner = THIS_MODULE,
        .open = xxx_open,
        .read = xxx_read,
        .write = xxx_write,
        .release =         xxx_release,
};



<3>申请一个空闲的设备号

<4>使用设备号,将struct cdev这个结构体添加到系统中去

出0入4汤圆

 楼主| 发表于 2020-3-29 01:15:23 | 显示全部楼层
{
     "search.exclude": {
        "**/node_modules": true,
        "**/bower_components": true,
        "**/*.o":true,
        "**/*.su":true,
        "**/*.cmd":true,
        "arch/arc":true,
        "arch/avr32":true,
        "arch/blackfin":true,
        "arch/m68k":true,
        "arch/microblaze":true,
        "arch/mips":true,
        "arch/nds32":true,
        "arch/nios2":true,
        "arch/openrisc":true,
        "arch/powerpc":true,
        "arch/sandbox":true,
        "arch/sh":true,
        "arch/sparc":true,
        "arch/x86":true,
        "arch/arm/mach*":true,
        "arch/arm/cpu/arm11*":true,
        "arch/arm/cpu/arm720t":true,
        "arch/arm/cpu/arm9*":true,
        "arch/arm/cpu/armv7m":true,
        "arch/arm/cpu/armv8":true,
        "arch/arm/cpu/pxa":true,
        "arch/arm/cpu/sa1100":true,
        "board/[a-e]*":true,
        "board/[g-z]*":true,
        "board/[0-9]*":true,
        "board/[A-Z]*":true,
        "board/fir*":true,
        "board/freescale/b*":true,
        "board/freescale/l*":true,
        "board/freescale/m5*":true,
        "board/freescale/mp*":true,
        "board/freescale/c29*":true,
        "board/freescale/cor*":true,
        "board/freescale/mx7*":true,
        "board/freescale/mx2*":true,
        "board/freescale/mx3*":true,
        "board/freescale/mx5*":true,
        "board/freescale/p*":true,
        "board/freescale/q*":true,
        "board/freescale/t*":true,
        "board/freescale/v*":true,
        "board/freescale/mx6d*":true,
        "board/freescale/mx6q*":true,
        "board/freescale/mx6s*":true,
        "configs/[a-l]*":true,
        "configs/[n-z]*":true,
        "configs/[A-Z]*":true,
        "configs/M[a-z]*":true,
        "configs/M[A-Z]*":true,
        "configs/M[0-9]*":true,
        "configs/m[a-w]*":true,
        "configs/m[0-9]*":true,
        "configs/[0-9]*":true,
        "include/configs/[a-l]*":true,
        "include/configs/[n-z]*":true,
        "include/configs/[A-Z]*":true,
        "include/configs/m[a-w]*":true,
     },

     "files.exclude": {
        "**/.git": true,
        "**/.svn": true,
        "**/.hg": true,
        "**/CVS": true,
        "**/.DS_Store": true,
        "**/*.o":true,
        "**/*.su":true,
        "**/*.cmd":true,
        "arch/arc":true,
        "arch/avr32":true,
        "arch/blackfin":true,
        "arch/m68k":true,
        "arch/microblaze":true,
        "arch/mips":true,
        "arch/nds32":true,
        "arch/nios2":true,
        "arch/openrisc":true,
        "arch/powerpc":true,
        "arch/sandbox":true,
        "arch/sh":true,
        "arch/sparc":true,
        "arch/x86":true,
        "arch/arm/mach*":true,
        "arch/arm/cpu/arm11*":true,
        "arch/arm/cpu/arm720t":true,
        "arch/arm/cpu/arm9*":true,
        "arch/arm/cpu/armv7m":true,
        "arch/arm/cpu/armv8":true,
        "arch/arm/cpu/pxa":true,
        "arch/arm/cpu/sa1100":true,
        "board/[a-e]*":true,
        "board/[g-z]*":true,
        "board/[0-9]*":true,
        "board/[A-Z]*":true,
        "board/fir*":true,
        "board/freescale/b*":true,
        "board/freescale/l*":true,
        "board/freescale/m5*":true,
        "board/freescale/mp*":true,
        "board/freescale/c29*":true,
        "board/freescale/cor*":true,
        "board/freescale/mx7*":true,
        "board/freescale/mx2*":true,
        "board/freescale/mx3*":true,
        "board/freescale/mx5*":true,
        "board/freescale/p*":true,
        "board/freescale/q*":true,
        "board/freescale/t*":true,
        "board/freescale/v*":true,
        "board/freescale/mx6d*":true,
        "board/freescale/mx6q*":true,
        "board/freescale/mx6s*":true,
        "configs/[a-l]*":true,
        "configs/[n-z]*":true,
        "configs/[A-Z]*":true,
        "configs/M[a-z]*":true,
        "configs/M[A-Z]*":true,
        "configs/M[0-9]*":true,
        "configs/m[a-w]*":true,
        "configs/m[0-9]*":true,
        "configs/[0-9]*":true,
        "configs/mx6d*":true,
        "configs/mx6q*":true,
        "configs/mx6s*":true,
        "configs/mx7*":true,
        "configs/mx2*":true,
        "configs/mx3*":true,
        "configs/mx5*":true,
        "include/configs/[a-l]*":true,
        "include/configs/[n-z]*":true,
        "include/configs/[A-Z]*":true,
        "include/configs/m[a-w]*":true,
        "include/configs/mx6q*":true,
        "include/configs/mx6d*":true,
        "include/configs/mx6s*":true,
        "include/configs/mx7*":true,
        "include/configs/mx2*":true,
        "include/configs/mx3*":true,
        "include/configs/mx5*":true,
     }
}

出0入4汤圆

 楼主| 发表于 2020-3-29 01:15:41 | 显示全部楼层
{
    "search.exclude": {
        "**/node_modules": true,
        "**/bower_components": true,
        "**/*.o":true,
        "**/*.su":true,
        "**/*.cmd":true,
        "Documentation":true,
   
        /* 屏蔽不用的架构相关的文件 */
        "arch/alpha":true,
        "arch/arc":true,
        "arch/arm64":true,
        "arch/avr32":true,
        "arch/[b-z]*":true,
        "arch/arm/plat*":true,
        "arch/arm/mach-[a-h]*":true,
        "arch/arm/mach-[n-z]*":true,
        "arch/arm/mach-i[n-z]*":true,
        "arch/arm/mach-m[e-v]*":true,
        "arch/arm/mach-k*":true,
        "arch/arm/mach-l*":true,
   
        /* 屏蔽排除不用的配置文件 */
        "arch/arm/configs/[a-h]*":true,
        "arch/arm/configs/[j-z]*":true,
        "arch/arm/configs/imo*":true,
        "arch/arm/configs/in*":true,
        "arch/arm/configs/io*":true,
        "arch/arm/configs/ix*":true,

        /* 屏蔽掉不用的 DTB 文件 */
        "arch/arm/boot/dts/[a-h]*":true,
        "arch/arm/boot/dts/[k-z]*":true,
        "arch/arm/boot/dts/in*":true,
        "arch/arm/boot/dts/imx1*":true,
        "arch/arm/boot/dts/imx7*":true,
        "arch/arm/boot/dts/imx2*":true,
        "arch/arm/boot/dts/imx3*":true,
        "arch/arm/boot/dts/imx5*":true,
        "arch/arm/boot/dts/imx6d*":true,
        "arch/arm/boot/dts/imx6q*":true,
        "arch/arm/boot/dts/imx6s*":true,
        "arch/arm/boot/dts/imx6ul-*":true,
        "arch/arm/boot/dts/imx6ull-9x9*":true,
        "arch/arm/boot/dts/imx6ull-14x14-ddr*":true,
    },

    "files.exclude": {
        "**/.git": true,
        "**/.svn": true,
        "**/.hg": true,
        "**/CVS": true,
        "**/.DS_Store": true,
        "**/*.o":true,
        "**/*.su":true,
        "**/*.cmd":true,
        "Documentation":true,
   
        /* 屏蔽不用的架构相关的文件 */
        "arch/alpha":true,
        "arch/arc":true,
        "arch/arm64":true,
        "arch/avr32":true,
        "arch/[b-z]*":true,
        "arch/arm/plat*":true,
        "arch/arm/mach-[a-h]*":true,
        "arch/arm/mach-[n-z]*":true,
        "arch/arm/mach-i[n-z]*":true,
        "arch/arm/mach-m[e-v]*":true,
        "arch/arm/mach-k*":true,
        "arch/arm/mach-l*":true,
        "arch/arm/configs/[a-h]*":true,
        "arch/arm/configs/[j-z]*":true,
        "arch/arm/configs/imo*":true,
        "arch/arm/configs/in*":true,
        "arch/arm/configs/io*":true,
        "arch/arm/configs/ix*":true,
   
        /* 屏蔽掉不用的 DTB 文件 */
        "arch/arm/boot/dts/[a-h]*":true,
        "arch/arm/boot/dts/[k-z]*":true,
        "arch/arm/boot/dts/in*":true,
        "arch/arm/boot/dts/imx1*":true,
        "arch/arm/boot/dts/imx7*":true,
        "arch/arm/boot/dts/imx2*":true,
        "arch/arm/boot/dts/imx3*":true,
        "arch/arm/boot/dts/imx5*":true,
        "arch/arm/boot/dts/imx6d*":true,
        "arch/arm/boot/dts/imx6q*":true,
        "arch/arm/boot/dts/imx6s*":true,
        "arch/arm/boot/dts/imx6ul-*":true,
        "arch/arm/boot/dts/imx6ull-9x9*":true,
        "arch/arm/boot/dts/imx6ull-14x14-ddr*":true,
    }
}

出0入4汤圆

 楼主| 发表于 2020-3-29 01:21:10 | 显示全部楼层
34.内核函数mmap的实现原理,机制?

        map将一个文件或者其它对象映射进内存。文件被映射到多个页上,
        如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。
        mmap在用户空间映射调用系统中作用很大。

35.在Linux C中,ls这个命令是怎么被执行的?

   fork+exec
   system("ls -l");

出0入0汤圆

发表于 2020-3-29 05:52:51 来自手机 | 显示全部楼层
内容不错,就是有点乱,哈哈哈

出0入42汤圆

发表于 2020-3-29 07:28:45 来自手机 | 显示全部楼层
楼主辛苦,借鉴一下,感谢分享

出0入4汤圆

 楼主| 发表于 2020-3-29 07:32:14 | 显示全部楼层
闲鱼翻身 发表于 2020-3-29 05:52
内容不错,就是有点乱,哈哈哈

哈哈哈 纯属娱乐  可以用nodepad++ 打开。。

出0入4汤圆

 楼主| 发表于 2020-3-29 07:32:34 | 显示全部楼层
我是一个大白菜 发表于 2020-3-29 07:28
楼主辛苦,借鉴一下,感谢分享

哈哈哈 纯属娱乐  可以用nodepad++ 打开。。

出0入0汤圆

发表于 2020-3-29 10:30:13 | 显示全部楼层
看了看,总结的不错,很多知识点和易错点

出615入1076汤圆

发表于 2020-3-29 14:16:24 | 显示全部楼层
隨便瞄一眼,雖然是你整理的,但跟抄來抄去的技術文章感覺差不多。
譬如 tar 解壓縮,你寫的是:
tar -xvf file.tar       //解压 tar包
tar -xzvf file.tar.gz       //解压 tar.gz
tar -xjvf file.tar.bz2     //解压 tar.bz2
tar -xZvf file.tar.Z     //解压 tar.Z

實際上是:
tar xf xxxxx 即可,xxxx 包含你上述各種格式,壓縮、解壓,減號 - 都不需要。

出0入0汤圆

发表于 2020-3-29 17:41:08 来自手机 | 显示全部楼层
顶楼上的

出0入0汤圆

发表于 2020-3-29 19:38:43 来自手机 | 显示全部楼层
kyq_linux 发表于 2020-3-29 01:12
ln -s 源文件 目标文件

ln -s libts.so.0.10.3 libts.so

果然很杂乱

出0入0汤圆

发表于 2020-3-29 20:20:20 来自手机 | 显示全部楼层
干货很多,就是太乱了。顶你一下。

出0入4汤圆

 楼主| 发表于 2020-3-29 22:11:28 | 显示全部楼层
dukelec 发表于 2020-3-29 14:16
隨便瞄一眼,雖然是你整理的,但跟抄來抄去的技術文章感覺差不多。
譬如 tar 解壓縮,你寫的是:
tar -xvf  ...

有道理。我其实也是边学习,边看 很多东西深层次的思考都没有 。。。

出0入4汤圆

 楼主| 发表于 2020-3-29 22:22:56 | 显示全部楼层
liyuncan 发表于 2020-3-29 20:20
干货很多,就是太乱了。顶你一下。

蟹蟹!

出20入0汤圆

发表于 2020-4-10 10:31:13 | 显示全部楼层
unix  style, 加 "-"
gnu style 不需要加

出0入0汤圆

发表于 2020-5-10 09:18:44 | 显示全部楼层
做成pdf不好么?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 04:04

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表