Linux Driver
hello_courage
8年USB开发经验 + 5年网络及以太网驱动开发经验 + 2年PCIe驱动开发经验 + 4年romcode开发经验,专注网卡驱动、网络协议(TCP/IP)、USB驱动及应用开发。
展开
-
内核模块间的符号调用
模块B编译好后会生成符号表文件Module.symvers,里面有导出的符号名,把该文件拷贝到需要调用的模块A的源代码下,然后重新编译模块A。EXPORT_SYMBOL_GPL():和EXPORT_SYMBOL类似,但范围只适合GPL许可的模块进行调用。EXPORT_SYMBOL():括号中定义的函数对全部内核代码公开。模块A需要调用模块B中定义的函数或变量。先extern声明需要调用的函数或变量。加载模块顺序必须先B后A,卸载相反。两个内核模块:模块A和模块B。1. 模块B导出函数或变量。原创 2023-06-09 18:51:13 · 747 阅读 · 0 评论 -
linux uvc支持H264格式
linux 原生仅支持 uvc1.1(YUV and MJPEG) ,有两种方案可以支持H264,如下:Hisi:linux-kernel.vger.kernel.org archive mirror1544522445-28930-1-git-send-email-prime.zeng@hisilicon.com/android:https://github.com/AospExtended-Devices/kernel_oneplus_sdm845/commit/54838...原创 2021-10-28 18:21:29 · 1708 阅读 · 0 评论 -
网卡offload功能介绍
offload 是将本来该操作系统进行的一些数据包处理(如TCP分段、IP分片、重组、checksum、TCP协议处理等)放到网卡硬件中去做, 降低系统 CPU 消耗的同时,提高处理的性能。普通网卡用软件方式进行一系列TCP/IP相关操作,因此,会在三个方面增加服务器的负担,这三个方面是:数据复制、协议处理和中断处理。1)TSO(TCP-Segmentation-Offload):将TCP分段工作交由网卡驱动执行,该特性需要网卡硬件支持。使能TSO后,操作系统可以将一个不超过...原创 2021-06-08 20:34:50 · 18644 阅读 · 1 评论 -
以太网PHY接口:MII RMII GMII RGMII SGMII
1. MII/GMII(Gigabit Media Independent Interface)1.1 MII/GMII signal1.2 MAC <--> PHY1) GMII:2) MII:In 1000BASE-T mode, when the GMII interface is selected, a 125 MHz transmit clock is expected on GTX_CLK.Alth...原创 2021-06-08 20:24:52 · 1528 阅读 · 1 评论 -
Marvell 88E1111(1000M PHY) linux 配置
1. driver drivers/net/phy/marvell.c drivers/net/phy/phy_device.c include/uapi/linux/mii.h (register) 2. kernel configDevice Drivers ---> [*] Network device support ---> -*- PHY Device support and infrastruct...原创 2021-06-08 20:22:41 · 2810 阅读 · 0 评论 -
RTL8211F PHY linux配置
2. kernel configMakefile:obj-$(CONFIG_REALTEK_PHY)+= realtek.oDevice Drivers--->[*] Network device support--->-*-PHY Device support and infrastructure---><*>Realtek PHYsCONFIG_...原创 2021-06-08 20:17:40 · 8645 阅读 · 0 评论 -
MSI(Message Signaled Interrupt)
MSI是什么?MSI(Message Signaled Interrupts)是一种中断方式, 依靠设备将一小段中断描述数据写入特定地址 【注一】来通知CPU中断的产生。MSI从PCI 2.2开始支持, 在PCI 3.0中得到扩展. 支持更多中断以及拥有独立配置各个中断能力的MSI-X则从PCI 3.0开始被支持.注一:这里写入数据,并不是device可以直接向cpu发送数据作为中断的一部分。 而是写到MMIO(memory mapped IO)地址的数据是给chipset的,chi...原创 2021-03-10 18:34:24 · 1859 阅读 · 0 评论 -
linux dynamic debug(linux动态调试)
https://www.kernel.org/doc/Documentation/admin-guide/dynamic-debug-howto.rstDynamic debug is designed to allow you to dynamically enable/disablekernel code to obtain additional kernel information.Currently, if CONFIG_DYNAMIC_DEBUG is set, t...原创 2020-10-12 18:12:50 · 1803 阅读 · 0 评论 -
linux kernel printk log(以及dev_dbg)
The smaller the num value, the higher the log priority.1.view loglevel# cat /proc/sys/kernel/printk94179:console_loglevel, messages with a priority higher than this value are printed to the console4:default_message_lo...原创 2020-09-08 19:44:09 · 1132 阅读 · 0 评论 -
ioremap介绍及用法
ioremap: mapphysical address to kernel virtual address, we can usekernel virtual address to access register.1.get physical addressrsc_p = platform_get_resource(Platform_Device_p, IORESOURCE_MEM, p->ResId);p->PhysBaseAddr = rsc...原创 2020-07-05 10:36:07 · 3688 阅读 · 0 评论 -
Marvell 88E1111 linux driver
The Alaska® Ultra 88E1111 Gigabit Ethernet Transceiver is a physical layer device for Ethernet 1000BASE-T, 100BASE-TX, and 10BASE-T applications.1. FEATURES• 10/100/1000BASE-T IEEE 802.3 compliant• Supports GMII, TBI, reduced pin count GMII (RGMII.原创 2020-07-05 10:19:18 · 1405 阅读 · 0 评论 -
ARM内存屏障 (memory barrier)
barrier.h#define isb() asm volatile("isb" : : : "memory")#define dmb(opt) asm volatile("dmb " #opt : : : "memory")#define dsb(opt) asm volatile("dsb " #opt : : : "memory")#define csdb() asm volatile("hint #20" : : : "memory...原创 2020-06-05 17:05:30 · 3245 阅读 · 0 评论 -
netdev: dev_watchdog timer(结合stmmac 分析)
分析netdev看门狗定时器1. dev_watchdog()作为定时器回调函数会被周期执行在dev_watchdog()中,如果 if (netif_xmit_stopped(txq) && time_after(jiffies, (trans_start + dev->watchdog_timeo)))成立,执行some_queue_timedout = 1,然后便调用ndo_tx_timeout。ndo_tx_timeout函数便是网卡发送异常(数据发不出去...原创 2020-06-05 17:00:03 · 2210 阅读 · 0 评论 -
stmmac 中断处理
1.发送中断1.1.DMA发送完数据后产生中断,调用 stmmac_interrupt服务程序1.2. stmmac_interrupt通过调用stmmac_dma_interrupt处理DMA相关中断(包括发送和接收)。在stmmac_dma_interrupt中,通过NAPI机制触发软中断,调用stmmac_poll处理相关事件。1.3.stmmac_poll调用stmmac_tx_clean回收资源,以及queue操作1)通过dma_unmap_single解除...原创 2020-06-05 16:56:35 · 1608 阅读 · 0 评论 -
dwmac ethernet driver(stmmac)
1. 官方介绍stmmac which is the official driver for Synopsys Ethernet QoS 10/100/1000 and QoSIP in Linux. The cstmmac driver was originally developed by STMicroelectronics, one of SynopsysEthernet IP customers, supporting MAC 10/100/1000. The source c...原创 2020-05-09 16:18:28 · 5526 阅读 · 3 评论 -
make modules 和 make modules_install
1. make modules如:make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- modules直接make,不加任何参数,就是make all,包含make modules。make modules是单独编译模块,驱动被配置成M的都是modules,modules不会被编译进内核image,需要单独安装到rootfs。2.make modules_install是把编译好的模块拷贝到系统目录下(一般是/lib/mod...原创 2020-05-09 16:15:03 · 18588 阅读 · 0 评论 -
基于busybox构建rootfs
它整合了许多Linux上常用的工具和命令(utilities), 如rm, ls, gzip, tftp等。对于这些工具和命令,busybox中的实现可能不是最全的,但却是最常用的,因此它的特点就是短小精悍,特别适合对尺寸很敏感的嵌入式系统。官网:https://busybox.net/参考: http://www.tldp.org/HOWTO/Bootdisk-HOWTO/buildroot.htmlbusybox有两个作用: 基于busybox构建rootfs 编..原创 2020-05-09 16:05:27 · 2491 阅读 · 0 评论 -
buildroot简介
buildroot是Linux平台上一个构建嵌入式Linux系统的框架。整个Buildroot是由Makefile脚本和Kconfig配置文件构成的。你可以和编译Linux内核一样,通过buildroot menuconfig配置,编译出一个完整的可以直接烧写到机器上运行的Linux系统软件(包含boot、kernel、rootfs以及rootfs中的各种库和应用程序)。官网: https://buildroot.org/manual: https://buildroot.org/dow...原创 2020-05-09 15:54:08 · 1556 阅读 · 0 评论 -
ethtool编译与内核实现介绍
ethtool 是用于查询及设置网卡参数的命令。使用ethtool需要两个条件:1)网卡驱动支持ethtool,实现了ethtool的接口函数2)用户控件安装ethtool可执行程序dwmac驱动已在stmmac_ethtool.c中实现了相关函数,现在我们只需要在编译ethtool工具,在用户空间使用即可。1.下载ethtoolhttps://mi...原创 2020-04-06 17:44:48 · 1441 阅读 · 0 评论 -
网卡驱动:stmmac DMA接收流程
1. dmabuffer及zero-copy在打开网卡时,stmmac_init_rx_buffers()函数负责分配dmabuffer。static int stmmac_init_rx_buffers(struct stmmac_priv *priv, struct dma_desc *p, int i, gfp_t flags, u32 qu...原创 2020-04-06 17:39:04 · 3400 阅读 · 4 评论 -
网卡驱动:stmmac DMA发送流程
1. 设置DAMbuffer&descriptor,并启动DMA发送在stmmac_xmit设置buffe r& descriptor,如下片段: if (likely(!is_jumbo)) { bool last_segment = (nfrags == 0); des = dma_map_single(priv->...原创 2020-04-06 17:36:19 · 3441 阅读 · 0 评论 -
linux kernel: defconfig和.config
在Linux内核里,编译内核文件时,先要配置.config文件,然后Makefile在编译时通过读取.config文件的配置来选择要编译的文件,选择驱动的加载方式。 defconfig 一般在arch/arm64/configs/目录下,是一个没有展开的内核配置,需要配合Kconfig展开成.config 从defconfig到.config不是简单的复制操作,而是make...原创 2020-04-06 17:31:20 · 15137 阅读 · 2 评论 -
kernel并发控制:自旋锁、互斥体、中断屏蔽
1.中断屏蔽(关中断)在单 CPU 范围内避免竞态的一种简单方法是在进入临界区之前屏蔽系统的中断。CPU 一般都具备屏蔽中断和打开中断的功能,这项功能可以保证正在执行的内核执行路径不被中断处理程序所抢占,防止某些竞态条件的发生。具体而言,中断屏蔽将使得中断与进程之间的并发不再发生,而且,由于 Linux 内核的进程调度等操作都依赖中断来实现,内核抢占进程之间的并发也就得以避免了。...原创 2019-12-01 10:56:01 · 1187 阅读 · 4 评论 -
linux三大驱动类型:字符设备、块设备、网络设备
1. 字符设备字符设备指能够像字节流串行顺序依次进行访问的设备,对它的读写是以字节为单位。字符设备的上层没有磁盘文件系统,所以字符设备的file_operations成员函数就直接由字符设备驱动提供(一般字符设备都会实现相应的fops集),因此file_operations 也就成为了字符设备驱动的核心。特点: 一个字节一个字节读写的设备 读取数...原创 2019-12-01 10:47:35 · 13069 阅读 · 4 评论 -
LDD3中snull网络驱动程序的使用
本附件程序在Ubuntu 14.04、内核版本3.13下测试通过。 1、测试步骤1)在/etc/networks文件中添加如下网段IP:snullnet0 192.168.0.0snullnet1 192.168.1.02)在/etc/hosts文件中添加如下IP地址:192.168.0.1 local0192.168.0.2 remote0192.168...原创 2018-05-02 19:46:55 · 493 阅读 · 0 评论 -
全志A33-gpio驱动程序
开发环境Ubuntu:14.04开发板:A33-Vstar开发板系统:android 4.4 、linux-3.4.39交叉编译器:arm-linux-gnueabi-gcc 4.7.3----------------------------------------------------- 1. 驱动程序1)采用Linux gpio api,具有很好的移植性2...原创 2018-08-05 10:13:40 · 4747 阅读 · 7 评论 -
全志A33-linux内核early_printk分析及使用
分析Linux内核启动流程时可以知道,在调用setup_arch函数之前就已经调用过printk函数了,但是这个时候的printk函数只是将打印信息放在缓存区中,并没有打印到控制台上,因为这个时候控制台还没有被初始化。 只有在start_kernel函数中的console_init函数被调用后,控制台才会被注册、初始化,printk函数打印的内容才会被真正地输出到屏幕上。...原创 2018-09-02 11:36:35 · 1808 阅读 · 0 评论 -
linux下控制gpio的几种方法
arm linux下写驱动控制gpio时,有两种方法: 1. 用ioremap()得到寄存器的地址,然后用iowrite32()或writel()函数写寄存器控制gpio1)查datasheet上GPIO的物理地址2)ioremap 把物理地址映射到虚拟地址3)然后直接操作映射出来的地址注:由于A33没有提供datasheet,无法知道寄存器地址,所以未测试。 2....原创 2018-10-07 20:33:54 · 14669 阅读 · 0 评论 -
如何编译Linux 内核模块
ubuntu版本:ubuntu-gnome-16.04-desktop-amd64,gnome版--------------------------------------------------------------------------------- 本文主要介绍如何在内核外编译内核模块,即:how to build an out-of-tree kernel module...原创 2018-11-03 09:44:58 · 18535 阅读 · 0 评论 -
在Linux内核中增加新驱动模块
开发环境开发板:A33-Vstar开发板系统: Linux/arm 3.4.39 KernelUbuntu版本:Ubuntu14.04---------------------------------------------------- 新增内核驱动,并可以通过make menuconfig配置。内核完整路径:~/A33-Vstar/dragonboard/linux...原创 2018-11-03 09:29:46 · 11629 阅读 · 1 评论 -
linux驱动:自动创建设备节点
在加载驱动模块后,就要自己使用mknod创建设备节点,这样虽然是可行的,但是比较麻烦。我们可以在__init()函数里面添加一些函数,自动创建设备节点。创建设备节点使用了两个函数 class_create()和device_create(),当然在__exit()函数里,要使用class_destory()和device_desotry()注销创建的设备节点。 1. 函数说明stru...原创 2018-11-03 09:05:28 · 3644 阅读 · 0 评论