
Linux 驱动
文章平均质量分 62
linux 驱动
Adrian503
中国科学院大学计算机硕士,研究领域Linux内核、嵌入式软件、BSP等。
展开
-
[网络] 网口大流量传输时插拔网线致网络不通
88E1548P大流量传输插拔网线导致网络不通原创 2023-01-31 10:25:28 · 1494 阅读 · 0 评论 -
内存泄漏的一次调试
看看哪个slab占用内存比较多,直接上小脚本:while sleep 1; do cat /proc/slabinfo | awk '{name=$1; size=$2*$4/4096; \printf "%s %lu\n", name, size;}' | sort -n -r -k 2 | head -n 10; \ echo "--------------";done;原创 2021-11-04 10:42:02 · 141 阅读 · 0 评论 -
usb test mode 测试
在USB2.0 spec 中规定了USB必须支持以下几种模式的Test Mode由于usb 2.0 的接口可能是下面几种方式接出来的在嵌入式设备上测试时发现,虽有几种方法,但是总会有设置testmode失败的情况。方法1:uboot 下 usb 命令uboot # usb usb - USB sub-systemUsage:usb start - start (scan) USB controllerusb reset - reset (rescan) USB...原创 2021-10-14 16:03:50 · 6945 阅读 · 4 评论 -
如何跨内核编译驱动
不使用自身的内核头文件,想用别的内核头文件。跨内核编译驱动单独编译驱动make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -C /usr/src/linux-headers-4.19.26/ M=`pwd`/drivers/ata cleanmake ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -C /usr/src/linux-headers-4.19.26/ M=`pwd`/driver...原创 2021-07-14 18:36:31 · 490 阅读 · 0 评论 -
ethernet phy 的 strap pin 电阻值的确定
事情是这样的,我们,替换了原来的 microchip 的 ksz8041 ,使用了一颗更便宜的TI phy 芯片 dp83822i ,硬件设备上使用相同的两个 phy , 一个通信正常,LED 显示也正常,另一个通信不正常,LED显示也不正常。硬件工程师查了图,看两颗芯片外围电路是一样的,那做过嵌入式软件工程师的都知道,驱动一般都是通用的,一般不会区分对待两个phy, 那这就很奇怪了。。。。。来吧,搞,一探究竟!先看下我们期望的配置RMII 模式(由参考时钟决定) ...原创 2021-02-04 18:45:01 · 4004 阅读 · 1 评论 -
I2C 专题(一)I2C 简介
1、 I2C 硬件连接I2C 是两线,半双工,主从结构,同步 的通信方式,接线方式如下(1) 上拉电阻一般在4.7k~10k之间 ,当总线空闲时,两根线都是 High ,连到总线上的任一设备输出低电平,都将使总线信号变低,即各器件的SDA SCL 是“与”的关系。(2) I2C 总线上可以挂很多设备,多个主设备,多个从设备。 多个主设备,会产生总线竞争的问题,通过总线仲裁来决定哪一台主机来控制总线。(3) 每个 I2C 的设备都有唯一的地址。2、 I2C 数据传输信号(...原创 2020-12-25 10:48:28 · 1419 阅读 · 1 评论 -
SPI 专题(三)-- linux spi driver 框架
本文基于 linux4.6.69 + ti am335x 分析1、linux 下 spi driver 的代码文件下面两个文件是 TI 平台 spi 控制器驱动 , 主要和SOC的相关的寄存器配置有关,和具体的外设 SPI设备进行物理上的通信。drivers/spi/spi-omap2-mcspi.c (master)drivers/spi/spi-omap2-mcspi-slave.c (slave)下面的 spi.c 主要是注册spi bus , 一个...原创 2020-12-11 16:43:38 · 785 阅读 · 1 评论 -
SPI 专题(二)-- linux spi driver 基本数据结构
本文的数据结构 基于 linux4.9.691、SPI masterstruct spi_master 用来描述一个SPI主控制器,我们一般不需要自己编写spi控制器驱动.结构体master代表一个SPI接口,或者叫一个SPI主机控制器,一个接口对应一条SPI总线,master->bus_num则记录了这个总线号/** * struct spi_master - interface to SPI master controller * @dev: device inte...原创 2020-12-11 14:18:23 · 1412 阅读 · 0 评论 -
SPI专题(一) SPI简介
1、SPI简介SPI 全称是 serial peripheral interface ,串行外围设备接口。是 Motorola 首先在其MC68HCXX系列处理器上定义的。SPI 接口常用的场景,SPI Flash , SPI EEPROM , AD转换器, 实时时钟等外设。SPI 是一种高速的 (有的设备可达50Mbps) ,全双工,同步的通信总线。SPI用四根线,节约了芯片的管脚。2、SPI 通信时的角色-主从主从模式,在通信的过程中,输出时钟的是 master , ...原创 2020-12-10 16:09:23 · 3974 阅读 · 0 评论 -
ethernet phy 芯片需要 interrupt pin吗
我们的几款产品中使用比较多的几款芯片有microchip 的 KSZ8041 , TI 的TLK110PT , DP83848K 等芯片,我发现 PHY 芯片的 interrupt pin 基本没有用到,这是为什么呢?我们知道,为了数据收发的效率,网卡的工作原理会采用轮询加中断的方式,大数据量通信时,采用轮询,小数据量通信时,采用中断,中断的功能肯定是要用到的。KSZ8041的datasheet 是这样说的下面是dp83822i的、下面是 TLK110的总的来说...原创 2020-12-08 13:17:44 · 1097 阅读 · 0 评论 -
IMX6 dts 配置GPIO
IMX6 有很多系列版本,芯片的寄存器有一些是不一样的,我使用的CPU具体的partnumber 为 FREESCALE_MCIMX6U5EVM10AC需求:配置 引脚 GPIO6_IO04 为输出高电平。IMX6 GPIO 介绍,根据 TRM Chapter 2 Memory Maps 可知。IMX6 有7组GPIO,每组32个引脚。Base Address如下:GPIO7_BASE 0x020B4000GPIO6_BASE 0x020B0000GPIO5_BA...原创 2020-12-03 17:34:54 · 3315 阅读 · 0 评论 -
串口通信丢包分析
RS232/RS422/RS485 异步通信通常使用一个UART 来发送和接受数据,用UART 芯片来控制串口的传输。UART芯片内部有一个FIFO缓冲区,用于存储软件驱动程序的输入数据。 FIFO的大小为1、16、64或128个字节,具体取决于UART类型。 FIFO用于通过缓冲数据来提高两个串行端口之间的通信吞吐量。接收和发送FIFO是独立的。数据流向 (RX)外部的串口设备-------> UART芯片的FIFO,FIFO数据到达trigger level ,触发中断-...原创 2020-09-15 16:59:26 · 13818 阅读 · 0 评论 -
NAPI 网卡中断还是轮询?
NAPI 的核心在于:在一个繁忙网络,每次有网络数据包到达时,不需要都引发中断,因为高频率的中断可能会影响系统的整体效率,假象一个场景,我们此时使用标准的 100M 网卡,可能实际达到的接收速率为 80MBits/s,而此时数据包平均长度为 1500Bytes,则每秒产生的中断数目为: 80M bits/s / (8 Bits/Byte * 1500 Byte) = 6667 个中断 /s 每秒 6667 个中断,对于系统是个很大的压力,此时其实可以转为使用轮询 (polling) 来处理,而不转载 2020-09-07 08:28:13 · 1292 阅读 · 0 评论 -
linux 内核链表 : 双向循环链表
内核链表:双向循环链表 链表初始化 INIT_LIST_HEAD 链表添加节点(头插,尾插) list_add list_add_tail 链表的遍历(前遍历,后遍历,安全遍历) list_for_each list_for_each_safe list_for_each_entry list_for_each_entry_...原创 2020-06-23 18:57:44 · 409 阅读 · 0 评论 -
WRITE_ONCE READ_ONCE 函数的介绍与使用
今天看 内核中链表中的代码 include/linux/list.h ,发现其中有很多代码用到了WRITE_ONCE ,就引发了我的思考上面的代码是初始化一个双向循环链表 ,将list中的两个指针 next 和 prev 都指向 自己,也就是 list , 那为什么不直接赋值呢?笔者就查了查以前版本的内核代码,发现 linux4.5 以下的版本都是直接赋值的,linux4.5以上的版本都进行了优化。那我们进行思考以下两个问题:1、内核出于什么原因进行优化呢?它和直接赋值有什么区别?...原创 2020-06-23 14:49:04 · 6951 阅读 · 2 评论 -
如何在 proc 文件系统中生成一个文件,比如 /proc/board ?
#include <linux/fs.h>#include <linux/proc_fs.h>#include <linux/seq_file.h>static char board_name[32] = { 0 };static int board_proc_show(struct seq_file *m, void *v){ sprintf(board_name,"demo_armhf\n"); seq_printf(m, "%s...原创 2020-06-19 12:26:24 · 355 阅读 · 0 评论 -
AM335x 通过GPMC 与 FPGA 之间通信
AM335x 是一款A8的CPU ,其片上的资源是有限的,有时候我们需要外扩的功能有很多,比如 16个串口,4个LAN,IRIG,IO设备等。但是CPU 直接出来的 UART 和 LAN口不够用呀,这时候我们可以直接通过 am335x GPMC 总线上来扩展,如果还是不够用呢,那就需要FPGA 来译码达到更多的设备支持。AM335X 上面有7个片选,我的设计将CS0 分给了 16个串口,CS3分给了IRIG 和 Nodeid. GPMC 总线上是支持 8bit 和 16 bit 模式的,正常情况下,如果原创 2020-05-26 11:31:48 · 2544 阅读 · 0 评论 -
在别的driver里(比如 irig) ,如何操作RTC?
背景最近客户有一个基本的需求,要保证我们的网关设备系统时间和外置的基准时间源保持一致(对时功能)。其实功能实现起来很简单,irig 基准源是按标准的 IRIG-B 的标准格式发送给出来的,我们用FPGA来接收这种标准的格式,然后进行译码,再给CPU一个中断,将时间数据发送给CPU,CPU 将时间更新到系统时间。至于要不要将时间更新到RTC,也是经过一番讨论的,因为我们不能够限定客户的使用场景1 网关一直始终接着 irig 设备这时候我们认为 irig 时间源 是最可信的,只要网关上连接着.原创 2020-05-25 18:17:02 · 416 阅读 · 0 评论 -
platform_device 与 platform_driver 是如何匹配的?
我们知道 platform_device 注册到内核以后,当我们每注册一个 platform_driver 时,它们就会两两确定是否能够匹配,如果能够配对成功,就会调用 platform_driver 的 probe() 函数。platform_device 是怎么来的呢?一般有三种来源1、从设备树的某些节点转换而来 (具体哪些节点才能够转换呢?请参考下一篇)2、平台...原创 2020-04-26 16:03:39 · 2549 阅读 · 0 评论