10 2019 档案
摘要:1. 隐式函数声明概念 在C语言中,函数在调用前不一定非要声明。如果没有声明,那么编译器会自动按照一种隐式声明的规则,为调用函数的C代码产生汇编代码。下面是一个例子: 单纯的编译上述源代码,并没有任何报错,只是在链接阶段因为找不到名为any_name_function的函数体而报错。 之所以编译不会
阅读全文
摘要:1.源码 main.c #include <stdio.h> #include "sub.h" int main(int argc, char *argv[]) { int i; printf("Main fun!\n"); sub_fun(); return 0; } sub.c void sub
阅读全文
摘要:问题: 在加载nvp6158的模块时,提示“ nvp6158_ex: Unknown symbol HI_I2C_Read (err 0) nvp6158_ex: Unknown symbol HI_I2C_Write (err 0) insmod: can't insert 'nvp6158_ex
阅读全文
摘要:1.问题出现 根据海思SDK里面手册编译后,制作成的glibc文件系统下载进去就出现这个问题。 2.问题解决 mw.b 0x82000000 0xff 0xb00000;tftp 0x82000000 rootfs_hi3521d_64k.jffs2;sf probe 0; sf erase 0x5
阅读全文
摘要:printk()会将打印信息存在内核的环形缓冲区log_buf[]里, 可以通过dmesg命令来查看log_buf[] 1.环形缓冲区log_buf[]又是存在内核的哪个文件呢? 位于/proc/kmsg里,所以除了dmesg命令查看,也可以使用cat /proc/kmsg来查看。 2.但是,dme
阅读全文
摘要:1.在驱动调试中,使用printk(),是最简单,最方便的办法 当uboot的命令行里的“console=tty1”时,表示printk()输出在开发板的LCD屏上 当uboot的命令行里的“console=ttySAC0,115200”时,表示printk()输出在串口UART0上,波特率=115
阅读全文
摘要:1.海思Hi35xx典型的系统层次图 2.海思媒体处理平台架构 2.1 名词概念 视频输入(VI)、视频处理(VPSS)、视频编码(VENC)、视频解码(VDEC)、视频输出(VO)、视频侦测分析(VDA)、音频输入(AI)、音频输出(VO)、音频编码(AENC)、音频解码(ADEC)、区域管理(R
阅读全文
摘要:内核版本: Linux version 3.10.14 1.由于每次开发板开机的网卡eth0的物理地址都是随机的 然后在网上找到可以通过命令行实现设置mac物理地址: 然后带着好奇,想看看命令行ifconfig是如何与内核交互的,想试试如何直接通过内核自动设置MAC。 2.分析介绍 因为ifconf
阅读全文
摘要:1.首先来看DM9000C原理图 (#:表示低电平有效) SD0~15: 16位数据线,有CMD引脚决定访问类型 CMD: 命令线,当CMD为高,表示SD 传输的是数据,CMD为低表示传输的是地址 INT: 中断引脚,接在2440的GPF7脚上 IOR#: 读引脚,接在2440的nOE脚上 IOW#
阅读全文
摘要:1.网卡驱动描述 网卡的驱动其实很简单,它还是与硬件相关,主要是负责收发网络的数据包,它将上层协议传递下来的数据包以特定的媒介访问控制方式进行发送, 并将接收到的数据包传递给上层协议。 网卡设备与字符设备和块设备不同, 网络设备并不对应于/dev目录下的文件,不过会存放在/sys/class/net
阅读全文
摘要:1.nor硬件介绍: 从原理图中我们能看到NOR FLASH有地址线,有数据线,它和我们的SDRAM接口相似,能直接读取数据,但是不能像SDRAM直接写入数据,需要有命令才行。
阅读全文
摘要:1.本节使用的nand flash型号为K9F2G08U0M,它的命令如下 1.1我们以上图的read id(读ID)为例,它的时序图如下: 首先需要使能CE片选 1)使能CLE 2)发送0X90命令,并发出WE写脉冲(就是低电平变成高电平) 3)复位CLE,然后使能ALE 4)发送0X00地址,并
阅读全文
摘要:相关命令使用: ifconfig -a 检查所有的网卡参数 ifconfig eth0 up 启动eth0 setenv PHY_addr 2 在uboot模式下设置phy地址 setenv mdio_intf rmii 在uboot模式下设置phy得接口 问题: 根据SDK里面的默认配置,编译出来
阅读全文
摘要:一、宏的定义与撤销 需要注意的是: (1)宏定义应注意添加括号,这样语义会比较清晰。 (2)使用#undef可以撤销宏定义。 (3)引号中的宏定义不会被替换。 (4)宏定义的宏名必须是合法的标识符。 (5)宏定义中单、双引号必须成对出现。 二、带有参数的宏定义 需要注意的是: (1)宏调用时参数的个
阅读全文
摘要:参考内核自带的块设备驱动程序: drivers/block /xd.c drivers/block /z2ram.c 1.本节需要的结构体如下: 1.1 gendisk磁盘结构体: 1.2 request申请结构体: 2.本节需要的函数如下: 创建一个块设备,当major==0时,表示动态创建,创建
阅读全文
摘要:1.有可能存在多个PHY setenv PHY_addr 2 2.修改PHY和MAC控制器的接口 setenv mdio_intf rmii(确认开发板的网卡是什么接口) 相关文章: https://blog.csdn.net/u011425939/article/details/80901226
阅读全文
摘要:1、MAC控制器、网卡、PHY、MDIO、mii、gmii、rgmii概念扫盲 网卡在功能上包含OSI模型的两个层,数据链路层和物理层。物理层定义了数据传送与接收所需要的电与光信号、线路状态、时钟基准、数据编码和电路等,并向数据链路层设备提供标准接口。数据链路层则提供寻址机构、数据帧的构建、数据差错
阅读全文
摘要:了解一下电梯算法 1.之前我们学的都是字符设备驱动,先来回忆一下 字符设备驱动: 当我们的应用层读写(read()/write())字符设备驱动时,是按字节/字符来读写数据的,期间没有任何缓存区,因为数据量小,不能随机读取数据,例如:按键、LED、鼠标、键盘等 2.块设备驱动 块设备: 块设备是i/
阅读全文
摘要:1.首先我们通过上节的代码中修改,来打印下键盘驱动的数据到底是怎样的 先来回忆下,我们之前写的鼠标驱动的id_table是这样: 所以我们要修改id_table,使这个驱动为键盘的驱动,如下图所示: 然后修改中断函数,通过printk()打印数据: 我们先按下按键A为例,打印出0x04,如下图: 我
阅读全文
摘要:参考/drivers/hid/usbhid/usbmouse.c(内核自带的USB鼠标驱动) 1.本节需要用到的宏如下: USB_INTERFACE_INFO()设置usb_driver驱动的id_table成员。 cl:接口类,我们USB鼠标为HID类,所以填入0X03,也就是USB_INTERF
阅读全文
摘要:1.USB概念介绍 如下图所示,以windows为例,我们插上一个没有USB设备驱动的USB,就会提示你安装驱动程序 为什么一插上就有会提示信息? 是因为windows自带了USB总线驱动程序。 USB总线驱动程序负责: 识别USB设备,给USB设备找到对应的驱动程序 新接入的USB设备的默认地址(
阅读全文
摘要:1.LCD原理图 Pin1- Pin6:Von/ Voff 电源正/负(由GPG4控制,高电平有效) Pin2:VM/VDEN 数据使能信号 (0:表示正在跳行,1:表示可以传输像素数据) Pin8:VLINE/HSYNC 水平同步信号(每扫完一行,即发一次水平同步信号) Pin28:VFRAME/
阅读全文
摘要:https://www.cnblogs.com/sky-heaven/p/8670477.html https://www.cnblogs.com/lifexy/p/7603327.html https://www.cnblogs.com/silencehuan/p/11202496.html ht
阅读全文
摘要:1.先来看看我们之前分析输入子系统的分层概念,如下图所示: 如上图所示,分层就是将一个复杂的工作分成了4层, 分而做之,降低难度,每一层专注于自己的事情, 系统只将其中的核心层和事件处理层写好了,所以我们只需要来写驱动层即可,接下来我们来分析platform机制以及分离概念。 2.分离概念 优点:
阅读全文
摘要:实现键盘驱动,让开发板的4个按键代表键盘中的L、S、空格键、回车键 1.先来介绍以下几个结构体使用和函数,下面代码中会用到 为什么使用了input_event()上报事件函数,就要使用这个函数? 因为input_event()函数只是个事件函数,所以需要这个input_sync()同步事件函数来通知
阅读全文
摘要:1.输入子系统概念介绍 内核的输入子系统是对分散的、多种不同类别的输入设备(如键盘、鼠标、跟踪球、触摸屏、加速计和手写板等)进行统一处理的驱动程序。 linux输入子系统(linux input subsystem)从上到下由三层实现,分别为:输入子系统事件处理层(EventHandler)、输入子
阅读全文
摘要:1.内核定时器概念 内核最新删除了init_timer,修改成timer_setup。 Linux内核API setup_timer|极客笔记 (deepinout.com) 内核定时器是内核用来控制在未来某个时间点(基于jiffies)调度执行某个函数的一种机制,现位于 <Linux/timer.
阅读全文
摘要:1.同步互斥阻塞的概念 并发与竞态: 并发(concurrency)指的是多个执行单元同时、并行被执行,而并发的执行单元对共享资源(硬件资源和软件上的全局变量、静态变量等)的访问则很容易导致竞态(race conditions)。 在linux中,主要的竞态发生在如下几种情况: 1、对称多处理器(S
阅读全文
摘要:1.异步通知 前面介绍的几种按键相关: 应用程序中使用while(1),一直去轮询查按键的状态。(这样会导致应用程序一直占用cpu资源) 使用中断的方式,在应用程序中通过read,然后进入驱动程序中,使应用程序进入休眠。然后发生中断的时候,在中断服务函数中将进程唤醒,返回按键值。(导致应用程序一直在
阅读全文
摘要:1.poll机制 上一节中使用中断的方式获取按键值,在应用程序中read的时候,如果没有按键中断,就会导致应用程序一直休眠。 优化:使用poll机制,在休眠5秒后,如果还没有按键中断,就返回。 linux系统再调用poll()函数时候,如果没有发生需要的事件,那么进程进入休眠。如果在限定的时间内得到
阅读全文
摘要:1.查看原理图和芯片手册 2.驱动程序分析 2.1 init函数和exit函数,向内核注册file_operations结构体。并且创建设备信息 2.2 编写open函数 request_irq函数用于向内核申请中断。 第一个参数:要注册中断服务函数的中断号 第二个参数:中断服务函数 第三个参数:触
阅读全文
摘要:1.编写LED驱动程序步骤 1.1 框架 1.2 完善硬件操作 1.2.1 查看原理图 1.2.2 看2440手册 1.2.3 写代码 其中需要注意的是:单片机通常直接用物理地址去操作寄存器。而这里要将物理地址映射为虚拟地址,用ioremap函数。 2.查看原理图和2440手册 从mini2440的
阅读全文