2021-02-22

jcinto 内核驱动 – 2

3.2.2.4. DSS(DSS6和DSS7)
3.2.2.4.1. 介绍
本页给出了DSS(显示子系统)硬件、Linux内核驱动程序(tidss)和各种使用DSS的TI板的基本描述。有关SoC的技术参考手册(TRM)和board文件给出了更详细的说明。
本页适用于TI的v4.19内核。
3.2.2.4.2. 支持的设备
有许多DSS IP版本,所有这些版本都支持稍微不同的一组特性。omapdrm驱动程序支持DSS版本5及以上,tidss驱动程序支持DSS版本6及以上。本文档涵盖DSS6和DSS7,它们用于以下TI SoC或SoC系列:K2G、AM65x、J721E。
3.2.2.4.3. 硬件体系结构
显示子系统(DSS)是一个硬件块,负责从存储器中提取像素数据并将其发送到显示外围设备,如LCD面板或DisplayPort监视器。DSS硬件可分为两个主要部分:
•显示控制器(DISPC),处理获取像素数据、进行颜色转换、合成和其他像素操作
•外设,将原始像素数据编码为标准显示信号,如MIPI DPI或DP。
除了SoC的DSS之外,主板通常还包含外部显示bridge(例如DPI-to-HDMI bridge)和显示面板。

上图概述了DSS(在J721E上)硬件。箭头显示管道如何连接到覆盖管理器,覆盖管理器进一步连接到视频端口,视频端口最终创建一个编码的像素流以显示在LCD或监视器上。

3.2.2.4.3.1. 显示控制器(DISPC)
DISPC是负责通过DMA管道从内存中提取像素数据,然后为外设创建像素流的块。像素流包括一个或多个图像层的合成,我们最终希望将其呈现在显示器上。DISPC可分为3个主要子块:
•管道
•叠加管理器(合成器)
•视频端口(定时发生器)
接下来的三小节将详细介绍这些子块。
3.2.2.4.3.1.1. 管道
Pipelines(或DMA通道)由HW块组成,HW块执行DMA以从RAM中获取(不同颜色格式的)图像像素。除了执行DMA之外,管道还执行其他功能,如复制、ARGB扩展、缩放、颜色转换、在将输入像素传递到覆盖管理器之前对其进行VC1范围映射。覆盖管理器从一个或多个这样的管道接收像素数据,并执行合成它们并将其传递到视频端口的任务。
有两种类型的管道:VIDL和VID。两者的区别在于VID管道支持缩放,而VIDL不支持。DSS中的管道数量因SoC中使用的DSS IP版本而异。
3.2.2.4.3.1.2. 覆盖管理器(合成器)
覆盖管理器是从一个或多个管道获取像素数据的块,将它们分层以形成合成,并创建供视频端口使用的像素流。
合成器部分从多个管道获取像素数据,根据它们相对于整个覆盖管理器大小的位置来合成它们。blending, color-keying和z-order等任务也由覆盖管理器中的合成器执行。
3.2.2.4.3.1.3. 视频端口(定时发生器)
视频端口从覆盖管理器获取像素流,并将其编码为标准视频信号,该信号可被LCD面板/监视器或内部外围设备(如eDP)理解。这些视频标准由MIPI或通用视频/显示机构指定。
视频端口的时序发生器部分负责根据外围设备所期望的时序提供由上述合成器生成的像素流。时序发生器是一种状态机,它提供RGB数据以及像素时钟、hsync、vsync和数据使能等控制信号。面板/外围设备使用此定时信息在屏幕上显示合成帧。
3.2.2.4.3.2. SoC硬件特性

SoC	DSS version	Outputs	Pipes
K2G	DSS6-UL	DPI, DBI	VID
AM65x	DSS7-L	DPI, OLDI	VID, VIDL
J721E	DSS7	DPI, DP, DSI	2 x VIDL, 2 x VID

3.2.2.4.4. 驱动程序体系结构
DSS-IP的驱动程序是tidss。tidss是一个直接渲染管理器(DRM)驱动程序,位于内核树的drivers/gpu/drm/tidss/目录中。tidss没有实现任何3D GPU功能,只有内核模式设置(KMS)功能,用于在显示器上显示像素数据。
除了tidss之外,drivers/gpu/drm/bridge/ and drivers/gpu/drm/panel/中还有许多桥接器和面板驱动器,它们为各种面板和桥接器(SoC的外部和内部)提供支持。
DRM实体到DSS硬件的映射大致如下:

DRM term	HW term
plane	DSS pipeline
crtc	DSS videoport
encoder	Internal and external bridges
connector	Connector or a panel

3.2.2.4.4.1 驱动程序功能
注意:这不是一个支持/不支持特性的全面列表,每个版本都可能添加新的特性。
3.2.2.4.4.1.1 支持的功能
输出
•mipi DPI
•dp
MIPI DPI
•Active matrix
•RGB
显示接口
•SST
DRM平面特性
•CSC
•Scaler
•Z-order
•Global alpha blending
•Alpha blending (pre-multipled & non-pre-multiplied)
DRM CRTC特性
•Gamma table
3.2.2.4.4.1.2 不支持的特性/限制
液晶显示输出
•TDM
•BT-656/1120
•MIPI DBI/RFBI
• Interlace
显示接口
•MST
DSI
•不支持

3.2.2.4.5 驱动程序配置
3.2.2.4.5.1 内核的配置选项
tidss支持内置或模块构建。
tidss可以在内核menuconfig中的“Device Drivers/Graphics support”下找到。启用tidss (CONFIG_DRM_TIDSS)之前,需要先启用DRM (CONFIG_DRM)。
启用DSS显示子系统支持(CONFIG_DRM_TIDSS)
•为K2G SoC启用TI DSS6支持(CONFIG_DRM_TIDSS_DSS6)
•为K3 soc启用TI DSS7支持(CONFIG_DRM_TIDSS_DSS7)
根据SoC和板,可能需要额外的内核配置选项。
•“Device Drivers/Graphics support/Display Panels”下面的面板
•“Device Drivers/Graphics support/Display Interface Bridges”下的桥接
•“Device Drivers/PHY Subsystem”下的PHY
3.2.2.4.5.2. 显示共享配置选项
tidss支持与运行在不同内核上的其他驱动程序共享显示组件。
通过在设备树文件中添加适当的资源分区信息,可以使用共享信息初始化tidss:

dss_planes: dss-planes {
        #address-cells = <1>;
        #size-cells = <0>;

        /* vid1, Owned by us */
        plane@0 {
                reg = <0>;
                managed = <1>;
        };

        /* vidl1, Reserved for jailhouse inmate */
        plane@1 {
                reg = <1>;
                managed = <0>;
        };

        /* vid2, owned by RTOS */
        plane@2 {
                reg = <2>;
                managed = <0>;
        };

        /* vidl2, marshalled to us by RTOS */
        plane@3 {
                reg = <3>;
                managed = <0>;
        };
};

dss_vps: dss-vps {
        #address-cells = <1>;
        #size-cells = <0>;

        /* Owned by jailhouse inmate */
        vp@0 {
                reg = <0>;
                managed = <0>;
        };

        /* Owned by RTOS */
        vp@1 {
                reg = <1>;
                managed = <0>;
        };

        /* Not owned by anyone
         * so keeping here
         */
        vp@2 {
                reg = <2>;
                managed = <1>;
        };

        /* Owned by us */
        vp@3 {
                reg = <3>;
                managed = <1>;
        };
};

在上面的例子中,我们拥有一个平面vid1和一个视频端口vp4来驱动MIPI DPI输出。两个平面vid2和vidl2属于TI_RTOS,用于驱动vp2,因此被标记为managed = <0>。请注意,tidss可以使用远程设备框架使用vidl2,但实际上是由TI-RTOS拥有的。Linux虚拟机使用一个平面vidl1和一个视频端口vp1,因此它们也被标记为managed = <0>。
tidss还支持使用四种中断中的一种,这可以划分为:

dss_commons: dss-commons {
        #address-cells = <1>;
        #size-cells = <0>;

        interrupt-common {
                reg = <1>;
        };

        config-common {
                status = "disabled";
                reg = <0>;
        };
};

在上面的配置中,tidss被配置为使用common_s1区域进行中断处理,而common_m区域被标记为“disabled”,因此tidss依赖于另一个驱动程序进行初始化配置。
在上面描述的情况下,tidss需要依赖外部驱动程序来配置和发送帧/接收事件。如果提供以下信息,tidss可以利用远程设备框架执行这些操作:

dss_remote: dss-remote {
        #address-cells = <0>;
        #size-cells = <0>;

        remote-name = "r5f-tidss";
};

3.2.2.4.6. 驱动程序使用
3.2.2.4.6.1. 加载tidss
如果构建为模块,则需要在启动tidss之前加载所有drm、tidss、桥接器和面板模块。当tidss启动时,它将沿着以下lines打印一些内容:

 
 [    9.165740] [drm] Supports vblank timestamp caching Rev 2 (21.10.2013).
[    9.182786] [drm] No driver support for vblank timestamp query.
[    9.207746] [drm] Initialized tidss 1.0.0 20180215 for 4a00000.dss on minor 0

3.2.2.4.6.2. 使用tidss
tidss通常由X服务器或Weston等窗口系统使用,因此通常用户不需要直接使用tidss。
tidss设备出现在/dev/dri/目录下,通常为card0。
还有所谓的DRM渲染设备节点renderD128,它指向相同的tidss设备。只能通过渲染节点进行缓冲区分配。可以为渲染节点提供更宽松的访问限制,因为应用程序只能从那里进行缓冲区分配,并且不能影响系统(除非分配所有内存)。
低级用户空间应用程序可以通过DRM ioctls使用tidss。这是一个更容易的libdrm,这是一个包装库周围的DRM ioctls,或kms++,这是一个C++ 11库,或由Python绑定提供的KMS++。
libdrm包含在TI版本中,其来源可以从以下位置找到:
https://gitlab.freedesktop.org/mesa/drm
libdrm还包含“modetest”工具,可以用来获取DRM状态的基本信息,并在显示器上显示测试模式。
另一个选项是kms++,这是一个用于内核模式设置的c++ 11库,其中包括一堆测试实用程序,以及用于DRM和V4L2的V4L2类和Python绑定。TI版本中包含了一些kms++工具。kms++可以在以下网站找到:
https://github.com/tomba/kmsxx
3.2.2.4.6.3 测试tidss
kms++中的kmstest是测试tidss特性的好工具。请注意,任何其他使用DRM (Weston, X)的应用程序都必须首先被终止。kms++的另一个工具是kmsprint,它可以用来打印关于tidss的各种信息。

# kmsprint
Connector 0 (35) DP-1 (disconnected)
  Encoder 0 (34) NONE
Connector 1 (43) HDMI-A-1 (connected)
  Encoder 1 (42) NONE
    Crtc 1 (41) 1920x1200 154.000 1920/48/32/80 1200/3/6/26 60 (59.95)
        Plane 1 (36) fb-id: 57 (crtcs: 0 1) 0,0 1920x1200 -> 0,0 1920x1200 (AR12 AB12 RA12 RG16 BG16 AR15 AB15 AR24 AB24 RA24 BA24 RG24 BG24 AR30 AB30 XR12 XB12 RX12 A
R15 AB15 XR24 XB24 RX24 BX24 XR30 XB30 YUYV UYVY NV12)
        FB 57 1920x1200
# kmstest -c hdmi -r 640x480
Connector 1/@43: HDMI-A-1
  Crtc 1/@41: 640x480 31.500 640/16/64/120/- 480/1/3/16/- 75 (75.00) 0xa 0x40
  Plane 0/@28: 0,0-640x480
    Fb 77 640x480-XR24
press enter to exit

3.2.2.4.6.4 tidss属性
tidss支持通过DRM属性进行配置。这些是标准的DRM属性,DRM文档描述了它们。此外,可以使用kmsprint来显示所支持的属性。

Property	Object	Description
zpos	plane	Z position of a plane
COLOR_ENCODING	plane	Selects between BT.601 and BT.709 YCbCr color encoding
COLOR_RANGE	plane	Selects between full range and limited range YCbCr encoding
alpha	plane	Full plane alpha-blending
CTM	crtc	Color Transformation Matrix blob property. Implemented trough Color phase rotation matrix in DSS IP.
GAMMA_LUT	crtc	Blob property to set the gamma lookup table (LUT) mapping pixel data sent to the connector.
GAMMA_LUT_SIZE	crtc	Number of elements in gammma lookup table.

3.2.2.4.6.5. 缓冲器
用于tidss的缓冲区可以从tidss分配,也可以从其他驱动程序导入(dmabuf import)。所有缓冲区必须是连续的。
tidss支持通用DRM dumb缓冲区。dumb缓冲区是使用通用RM_IOCTL_MODE_CREATE_DUMB分配的。
3.2.2.4.6.6. fbdev仿真(/dev/fb0)
DRM框架支持“模拟”遗留fbdev API。可以在内核配置(CONFIG_DRM_FBDEV_EMULATION)中启用或禁用此功能。fbdev仿真只提供基本的功能集,fb显示在第一个显示器上。Fbdev仿真主要用于内核控制台或启动启动屏幕。
3.2.2.5. GPIO
GPIO驱动程序概述
GPIO驱动程序启用设备上可用的GPIO控制器。驱动程序配置GPIO硬件和接口,并使它们可用于sysfs接口,用于用户空间交互或需要访问pin的其他设备驱动程序。例如,MMC/SD驱动程序可能需要读取GPIO作为输入,以确定是否存在卡。可用的H/W GPIO控制器因SoC和系统配置而异。
J721E specifics
J721E SoCs host DAVINCI GPIO IP.
当前软件仅支持存储GPIO中断。16个GPO组成一个bank。每个组可以产生一个中断;这样做是为了节省到达CPU的中断线的数量。CONFIG_GPIO_DAVINCI=y应该是defconfig的一部分。驱动程序源代码:drivers/gpio/gpio-davinci.c
概述
GPIO控制器允许与GPIO引脚进行交互,以生成输入/输出和中断。

用户层
GPIO驱动程序可以通过用户空间中的sysfs接口使用,也可以由其他需要访问输入/输出或中断引脚的驱动程序使用。关于这个驱动程序和GPIO在Linux中的使用的更多信息可以在内核文档中找到:
•gpio接口:在内核目录Documentation/gpio/gpio.txt下
•gpio驱动:在内核目录Documentation/gpio/driver.txt下
sysfs
sysfs接口是用于GPIO的,位于内核中的/sys/class/gpio。关于这个接口的更多信息可以在内核源代码中找到:
•gpio sysfs:在内核目录Documentation/gpio/sysfs.txt下
为了控制led和按钮,内核有标准的驱动程序,分别是“leds-gpio” and “gpio_keys”,应该直接使用它们来代替GPIO。
消费驱动程序
其他驱动程序也可以很容易地利用GPIO驱动程序来“消耗”GPIO。
•gpio Consumer:在内核目录Documentation/gpio/consumer.txt下
对于一个使用GPIO引脚的驱动程序的例子,在内核目录arch/arm/boot/dts/am335x-bone-common.dtsi line 401,检查dts文件中的这个条目,了解MMC/SD接口如何使用GPIO作为卡检测引脚。
特性
•从用户空间访问GPIO作为输入或输出
•利用另一个“消费者”驱动程序的GPIO
3.2.2.6. HyperBus和HyperFlash
3.2.2.6.1. 介绍
HyperBus是主机系统主接口和一个或多个从接口之间的低信号计数、高性能双数据速率(DDR)总线接口。它是一个8位数据总线(DQ[7:0]),具有读写数据选通(RWDS)信号和单端时钟(3.0V部分)或差分时钟(1.8V部分)。它使用ChipSelect行选择b/w多个从机。在总线级,它遵循HyperBus规范中描述的单独协议。
HyperFlash是一种基于NOR-flash的设备存储。HyperFlash遵循CFI AMD/Fujitsu扩展命令集(0x0002),类似于现有的并行nor。由于Hyperbus是x8 DDR总线,它相当于x16并行NOR flash wrt位/clk。但Hyperbus的工作频率要高得多。
TI的j7evm上的HyperFlash连接到HyperBus内存控制器,该控制器支持对flash的内存映射IO访问。内核的MTD框架支持HyperFlash。
支持的设备
•J7200 EVM
注意
在J7200 EVM上,开关SW3.1应在主板通电时处于On位置,以访问HyperFlash。
3.2.2.6.2 驱动程序的体系结构
HyperBus和HyperFlash驱动程序栈如下图所示:

源位置
HyperBus控制器驱动的源文件在Linux内核源树下的drivers/mtd/hyperbus/hbmc-am654.c。
HyperFlash命令集的实现在: drivers/mtd/chips/cfi_cmdset0002.c
3.2.2.6.2.1. 内核配置选项
驱动程序可以内置到内核中,也可以作为模块编译并动态加载到内核中。
启用HyperBus驱动程序
将为HyperBus和HyperFlash启用以下配置。
注意
HyperBus驱动程序及其依赖项在SDK映像中默认启用。所以在这种情况下可以跳过这一节。
启动Linux内核配置工具:

$ make menuconfig  ARCH=arm64
Device Drivers  --->
  <*> Memory Technology Device (MTD) support  --->
    <*>  HyperBus support  --->
       <*>   HyperBus controller driver for AM65x SoC

启用UBIFS文件系统支持:

File systems  --->
  [*] Miscellaneous filesystems  --->
    <*>   UBIFS file system support

3.2.2.6.2.2 DT配置
参考文档Documentation/devicetree/bindings/mtd/ti,am654-hbmc.txt。 HyperBus和HyperFlash文档驱动程序的DT绑定及其使用的内核源树。DT条目示例:

fss: system-controller@47000000 {
        compatible = "syscon", "simple-mfd";
        reg = <0x0 0x47000000 0x0 0x100>;
        #address-cells = <2>;
        #size-cells = <2>;
        ranges;

        hbmc_mux: hbmc-mux {
                compatible = "mmio-mux";
                #mux-control-cells = <1>;
                mux-reg-masks = <0x4 0x2>; /* HBMC select */
        };

        hbmc: hyperbus@47034000 {
                compatible = "ti,am654-hbmc";
                reg = <0x0 0x47034000 0x0 0x100>,
                        <0x5 0x00000000 0x1 0x0000000>;
                power-domains = <&k3_pds 102 TI_SCI_PD_EXCLUSIVE>;
                clocks = <&k3_clks 102 0>;
                assigned-clocks = <&k3_clks 102 5>;
                assigned-clock-rates = <333333333>;
                #address-cells = <2>;
                #size-cells = <1>;
                mux-controls = <&hbmc_mux 0>;
        };
};

&hbmc {
        pinctrl-names = "default";
        pinctrl-0 = <&mcu_fss0_hpb0_pins_default>;
        ranges = <0x0 0x0 0x5 0x00000000 0x4000000>, /* 64MB Flash on CS0 */
                 <0x1 0x0 0x5 0x04000000 0x800000>; /* 8MB RAM on CS1 */

        flash@0,0 {
                compatible = "cypress,hyperflash", "cfi-flash";
                reg = <0x0 0x0 0x4000000>;
        };
};

3.2.2.6.2.3. 驱动程序使用
HyperFlash作为MTD字符设备公开给用户空间,并且为DT中定义的每个分区或通过命令行参数创建/dev/mtdX (X = 0,1,2)项。MTD抽象了所有类型的闪存,要查看系统中运行的所有MTD分区,请执行以下操作:
$cat /proc/mtd
下面是DT分区的示例。从U-Boot传递cmdline分区的示例.
3.2.2.6.2.4. 测试
由于在MTD框架下支持HyperFlash,所以用法与SPI相同,也不支持OSPI/QSPI等flash。HyperFlash还支持UBIFS作为文件系统格式。请注意,必须至少定义一个cmdline或DT分区才能使用UBIFS。
有关更多测试,请参阅QSPI部分。
注意
目前,Linux不支持HyperRAM。
3.2.2.7 I2C
TI soc具有高速(HS)集成电路(I2C)控制器,它提供了CPU与通过I2C串行总线连接的任何兼容I2C总线的从设备之间的接口。更多信息,请参考各自SoC TRM中的I2C控制器章节。
I2C控制器驱动程序仅支持主模式。它可以工作在不同的频率,如100 KHz, 400 KHz和3.4 MHz。SDK镜像中默认启用驱动程序。
测试
i2c-tools包包含一组异构的I2C工具,用于与用户空间中的I2C从设备交互。默认情况下,SDK映像已经打包了i2c-tools。
要列出系统中所有I2C总线,使用i2cdetect:

$ i2cdetect -l
i2c-3   i2c             OMAP I2C adapter                        I2C adapter
i2c-1   i2c             OMAP I2C adapter                        I2C adapter
i2c-8   i2c             OMAP I2C adapter                        I2C adapter
i2c-6   i2c             OMAP I2C adapter                        I2C adapter
i2c-4   i2c             OMAP I2C adapter                        I2C adapter
i2c-2   i2c             OMAP I2C adapter                        I2C adapter
i2c-0   i2c             OMAP I2C adapter                        I2C adapter
i2c-9   i2c             OMAP I2C adapter                        I2C adapter
i2c-7   i2c             OMAP I2C adapter                        I2C adapter
i2c-5   i2c             OMAP I2C adapter                        I2C adapter
或者查看dmesg日志以获取I2C总线的列表:
$ dmesg | grep i2c
[    0.691360] i2c /dev entries driver
[    0.824513] omap_i2c 40b00000.i2c: bus 0 rev0.12 at 100 kHz
[    0.830432] omap_i2c 40b10000.i2c: bus 1 rev0.12 at 100 kHz
[    0.930545] omap_i2c 42120000.i2c: bus 2 rev0.12 at 400 kHz
[    0.998918] omap_i2c 2000000.i2c: bus 3 rev0.12 at 400 kHz
[    1.004902] omap_i2c 2010000.i2c: bus 4 rev0.12 at 400 kHz
[    1.010764] omap_i2c 2020000.i2c: bus 5 rev0.12 at 100 kHz
[    1.057367] omap_i2c 2030000.i2c: bus 6 rev0.12 at 400 kHz
[    1.063224] omap_i2c 2040000.i2c: bus 7 rev0.12 at 100 kHz
[    1.069069] omap_i2c 2050000.i2c: bus 8 rev0.12 at 100 kHz
[    1.111240] omap_i2c 2060000.i2c: bus 9 rev0.12 at 400 kHz

用户可以通过i2cdump、i2cset和i2cget命令与I2C从设备交互:

i2cdump -f -y bus slaveaddr b

这将在相应的总线上转储从机的寄存器内容。

i2cset -f -y bus slaveaddr register value b

这将向地址为“slaveaddr”的设备的“寄存器”写入一个“值”。

i2cget -f -y bus slaveaddr register b

这将从地址为“slaveaddr”的设备的“寄存器”中读取。
有关更多详细信息,请参阅相应工具的手册页:i2cdump、i2cset、i2cget、i2cdetect。
3.2.2.8.1. 介绍
TI J721E SoC千兆以太网交换子系统(CPSW NUSS)有两个端口,为设备提供以太网分组通信。它支持MII接口—精简的千兆媒体独立接口(RGMII)、精简的媒体独立接口(RMII)和用于物理层设备(PHY)管理的管理数据输入/输出(MDIO)接口。
TI J721E SoC将双端口千兆以太网交换机子系统集成到设备MCU主域MCU_CPSW0中,并且只有一个外部以太网端口(端口1),带有可选的RGMII和RMII接口以及一个内部通信端口编程接口(CPPI)端口(主机端口0)。主机端口0 CPPI数据包流接口支持8个TX信道和一个RX信道,由TI J721E NAVSS统一DMA外围根复合体(UDMA-P)控制器操作。
驱动程序遵循标准的Linux网络接口体系结构,并支持以下功能:
1.100/1000 Mbps操作模式。
2.自动协商。
3.Linux NAPI支持
4.VLAN过滤
5.以太网工具
6.CPTS
7.根据802.1Q-2018进行EST/TAS卸载
不支持:
•HW不支持中断间隔。NAPI由驱动程序使用。。
驱动程序配置
TI处理器SDK默认启用了jacinto7 MCU CPSW2g驱动程序。
要手动启用/禁用网络支持,请启动Linux内核配置工具:

$ make ARCH=arm64 menuconfig
Select Device Drivers from the main menu ->
Select Network device support ->
Select Ethernet driver support ->
Select ** as shown here:
...
[*]   Texas Instruments (TI) devices
-*-     TI DaVinci MDIO Support
-*-     TI CPSW ALE Support
<*>     TI K3 CPSW Ethernet driver
[*]       Enable TAS offload in AM65 CPSW
<*>     TI K3 AM65x CPTS
...
Kernel Kconfig options:
CONFIG_TI_DAVINCI_MDIO
CONFIG_TI_CPSW_ALE
CONFIG_TI_AM65_CPSW_NUSS
CONFIG_TI_AM65_CPTS
CONFIG_TI_AM65_CPSW_TAS

模块构建
支持cpsw驱动程序的模块构建。为此,在上面提到的所有地方选择module build(快捷键M).
设备树绑定
DT绑定的描述可以在下面找到:

Documentation/devicetree/bindings/net/ti,am654-cpsw-nuss.txt
Documentation/devicetree/bindings/net/ti,am654-cpts.txt

启动接口
网络接口可以根据根文件系统自动配置,也可以手动配置。手动配置:

ip addr add 192.168.1.1/24 dev eth0
ip link set dev eth0 up

< or >

ifconfig eth0 <ip> netmask <mask> up

获取驱动程序信息
MCU_CPSW0接口可以通过ethtool -i|–driver命令来识别。它还提供了一些有关支持的功能的信息.

# ethtool -i <dev>
driver: am65-cpsw-nuss
version: 0.1
firmware-version:
expansion-rom-version:
bus-info: 46000000.ethernet
supports-statistics: yes
supports-test: no
supports-eeprom-access: no
supports-register-dump: yes
supports-priv-flags: yes
ethtool -显示设备/链路的标准信息
   # ethtool eth0
Supported ports: [ TP MII ]
Supported link modes:   10baseT/Half 10baseT/Full
                        100baseT/Half 100baseT/Full
                        1000baseT/Half 1000baseT/Full
Supported pause frame use: Symmetric Receive-only
Supports auto-negotiation: Yes
Supported FEC modes: Not reported
Advertised link modes:  10baseT/Half 10baseT/Full
                        100baseT/Half 100baseT/Full
                        1000baseT/Half 1000baseT/Full
Advertised pause frame use: No
Advertised auto-negotiation: Yes
Advertised FEC modes: Not reported
Link partner advertised link modes:  10baseT/Half 10baseT/Full
                                     100baseT/Half 100baseT/Full
Link partner advertised pause frame use: Symmetric
Link partner advertised auto-negotiation: Yes
Link partner advertised FEC modes: Not reported
Speed: 100Mb/s
Duplex: Full
Port: MII
PHYAD: 0
Transceiver: internal
Auto-negotiation: on
Supports Wake-on: d
Wake-on: d
Current message level: 0x00000000 (0)

Link detected: yes

RX校验和卸载
驱动程序默认启用RX校验和卸载。可以使用ethtool-K命令禁用/启用它

# ethtool -k <dev>
....
rx-checksumming: on
ethtool -K <dev> rx-checksum on|off

注意
TX校验和卸载已实现,但由于受影响的J721E上的勘误表i2027,默认情况下可能已禁用。
VLAN配置
可以使用ip或vconfig实用程序添加/删除VLAN。
VLAN添加
ip链路添加链路eth0名称eth0.5类型vlan id 5
或vconfig add eth0 5
VLAN删除
ip链路del eth0.5
或 vconfig rem eth0 5
VLAN IP分配
IP地址可以通过udhcpc(当存在VLAN感知dhcp服务器时)或通过使用IP或ifconfig的静态IP分配来分配给VLAN接口。
一旦添加了VLAN,它将在eth0.5之类的以太网接口中创建一个新条目,下面是一个如何检查VLAN接口的示例

ip addr add 192.168.1.1/24 dev eth0.5

< or >

ifconfig eth0.5
....
eth0.5    Link encap:Ethernet  HWaddr 20:CD:39:2B:C7:BE
          inet addr:192.168.10.5  Bcast:192.168.10.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

VLAN数据包发送/接收
要发送或接收带有VLAN标签的数据包,请将套接字绑定到上面显示的适当的以太网接口,并可以通过该socket-fd发送/接收.
多播添加/删除
多播MAC地址可以通过ip maddr命令或Linux socket ioctl SIOCADDMULTI/SIOCDELMULTI进行添加/删除。
显示muliticast地址

# ip maddr show dev <dev>
2:      eth0
    link  01:00:5e:00:00:01
    link  01:80:c2:00:00:00
    link  01:80:c2:00:00:03
    link  01:80:c2:00:00:0e
    link  01:00:5e:00:00:fc
    inet  224.0.0.252
    inet  224.0.0.1
添加多播地址
# ip maddr add 01:00:5e:00:00:05 dev eth0
# ip maddr show dev eth0
2:      eth0
    link  01:00:5e:00:00:01
    link  01:80:c2:00:00:00
    link  01:80:c2:00:00:03
    link  01:80:c2:00:00:0e
    link  01:00:5e:00:00:fc
    link  01:00:5e:00:00:05 static
    inet  224.0.0.252
    inet  224.0.0.1
删除muliticast地址
# ip maddr del 01:00:5e:00:00:05 dev eth0

ethtool -P|–show-permaddr DEVNAME显示永久硬件地址

# ethtool -P eth0

Permanent address: a0:f6:fd:a6:46:6e"
ethtool -s|–change DEVNAME更改常规选项
以下命令将重定向到phy驱动程序:

# ethtool -s <dev>
[ speed %d ]
[ duplex half|full ]
[ autoneg on|off ]
[ wol p|u|m|b|a|g|s|d... ]
[ sopass %x:%x:%x:%x:%x:%x ]

请注意
CPSW驱动程序不执行任何类型的WOL特定的操作或配置.

#ethtool -s eth0 duplex half speed 100
[ 3550.892112] cpsw 48484000.ethernet eth0: Link is Down
[ 3556.088704] cpsw 48484000.ethernet eth0: Link is Up - 100Mbps/Half - flow control off

按名称或编号设置驱动程序消息类型标志
[ msglvl %d | msglvl type on|off … ]

# ethtool -s eth0 msglvl drv off
# ethtool -s eth0 msglvl ifdown off
# ethtool -s eth0 msglvl ifup off
# ethtool eth0
Current message level: 0x00000031 (49)
                       drv ifdown ifup

ethtool -r|–negotiate DEVNAME重启N-WAY协商

# ethtool -r eth0
[ 4338.167685] cpsw 48484000.ethernet eth0: Link is Down
[ 4341.288695] cpsw 48484000.ethernet eth0: Link is Up - 1Gbps/Full - flow control rx/tx"

ethtool -a|–show-pause DEVNAME设置暂停选项

# ethtool -a eth0
Pause parameters for eth0:
Autonegotiate:  off
RX:             off
TX:             off

ethtool -A|–pause DEVNAME设置暂停选项

# ethtool -A eth0 rx on tx on
cpsw 48484000.ethernet eth0: Link is Up - 1Gbps/Full - flow control rx/tx
# ethtool -a eth0
Pause parameters for eth0:
Autonegotiate:  off
RX:             on
TX:             on
ethtool -g|--show-ring DEVNAME查询RX/TX ring参数
# ethtool -g eth0
Ring parameters for eth0:
Pre-set maximums:
RX:             0
RX Mini:        0
RX Jumbo:       0
TX:             0
Current hardware settings:
RX:             500
RX Mini:        0
RX Jumbo:       0
TX:             512

ethtool-l|–show-channels DEVNAME查询通道

# ethtool -l eth0
Channel parameters for eth0:
Pre-set maximums:
RX:             1
TX:             8
Other:          0
Combined:       0
Current hardware settings:
RX:             1
TX:             8
Other:          0
Combined:       0

ethtool -L|–set-channels DEVNAME设置通道.
允许在DMA级别控制允许驱动程序使用的TX通道数。TX通道的最大数量为8个。支持的选项[tx N]:

# ethtool -L eth0 tx 3
ethtool --show-priv-flags/--set-priv-flags 

DEVNAME显示/设置私有标志
允许控制驱动程序支持的私有标志.
Flag
p0-rx-ptype-rrobin 控制TX DMA通道处理模式:轮循或优先模式。如果启用了优先模式,高号码通道将有更高的优先级: TX 7 - prio 7 … TX 0 - prio 0.
iet-frame-preemption Enables support for Interspersed Express Traffic (IET) IEEE 802.3br (frame preemption).
iet-mac-verify 开启IET (Interspersed Express Traffic) MAC验证过程.

# ethtool --show-priv-flags eth0
Private flags for eth0:
p0-rx-ptype-rrobin  : on
iet-frame-preemption: off
iet-mac-verify      : off

# ethtool --set-priv-flags eth0 p0-rx-ptype-rrobin off

请注意
对于私有标志配置,网络接口必须是关闭的.
ethtool -S|–statistics DEVNAME显示适配器统计信息
" ethtool -S "命令显示外部端口1和主机端口0的统计信息。主机端口0前缀为p0_的统计信息
.

 # ethtool -S eth0
NIC statistics:
     p0_rx_good_frames: 347
     p0_rx_broadcast_frames: 4
     p0_rx_multicast_frames: 264
     p0_rx_crc_errors: 0
     p0_rx_oversized_frames: 0
     p0_rx_undersized_frames: 0
     p0_ale_drop: 0
     p0_ale_overrun_drop: 0
     p0_rx_octets: 25756
     p0_tx_good_frames: 4816
     p0_tx_broadcast_frames: 3629
     p0_tx_multicast_frames: 1120
     p0_tx_octets: 878055
     p0_tx_64B_frames: 735
     p0_tx_65_to_127B_frames: 1023
     ...
     rx_good_frames: 4816
     rx_broadcast_frames: 3629
     rx_multicast_frames: 1120
     rx_pause_frames: 0
     rx_crc_errors: 0
     rx_align_code_errors: 0
     rx_oversized_frames: 0
     rx_jabber_frames: 0
     rx_undersized_frames: 0
     rx_fragments: 0
     ale_drop: 0
     ale_overrun_drop: 0
     rx_octets: 878055
     tx_good_frames: 347
     tx_broadcast_frames: 4
     tx_multicast_frames: 264
     tx_pause_frames: 0
     tx_deferred_frames: 0
     tx_collision_frames: 0
     tx_single_coll_frames: 0
     tx_mult_coll_frames: 0
     tx_excessive_collisions: 0
     tx_late_collisions: 0
     ...

ethtool -T|–show-time-stamping DEVNAME显示时间戳功能.
启用CPTS时可访问.

  # ethtool -T eth0
Time stamping parameters for eth0:
Capabilities:
        hardware-transmit     (SOF_TIMESTAMPING_TX_HARDWARE)
        software-transmit     (SOF_TIMESTAMPING_TX_SOFTWARE)
        hardware-receive      (SOF_TIMESTAMPING_RX_HARDWARE)
        software-receive      (SOF_TIMESTAMPING_RX_SOFTWARE)
        software-system-clock (SOF_TIMESTAMPING_SOFTWARE)
        hardware-raw-clock    (SOF_TIMESTAMPING_RAW_HARDWARE)
PTP Hardware Clock: 1
Hardware Transmit Timestamp Modes:
        off                   (HWTSTAMP_TX_OFF)
        on                    (HWTSTAMP_TX_ON)
Hardware Receive Filter Modes:
        none                  (HWTSTAMP_FILTER_NONE)
        all                   (HWTSTAMP_FILTER_ALL)
ethtool --show-eee DEVNAME 显示 EEE 设置
#ethtool --show-eee eth0
EEE Settings for eth0:
        EEE status: not supported

ethtool --set-eee DEVNAME设置eee设置。
注意
在驱动程序中不支持完整的EEE,但它支持在以太网PHY中读取和写入EEE advertising设置。这样就可以禁用特定速度的advertising EEE。
ethtool -d|–register-dump DEVNAME执行寄存器dump
此命令以以下格式dump所有CPSW MMIO区域。TI开关switch-config工具可用于CPSW NUSS寄存器dump解析。

MMIO region header (8 Bytes)
module_id (u32)	MMIO region id NUSS = 1, RGMII_STATUS = 2, MDIO = 3, CPSW = 4, CPSW_P0 = 5, CPSW_P1 = 6, CPSW_CPTS = 7, CPSW_ALE = 8, CPSW_ALE_TBL = 9
len (u32)	MMIO region dump length, including header
MMIO region registers dump (num_regs * 8 Bytes)
reg_offset (u32)	resgister offset from the start of MCU NAVSS MMIO space
reg_value (u32)	MMIO region dump length, including header

例外:ALE表dump为ALE记录的原始数组(每条记录3 * u32).

# ethtool -d eth0
Offset          Values
------          ------
0x0000:         01 00 00 00 48 00 00 00 00 00 00 00 00 71 a0 6b
0x0010:         04 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00
0x0020:         0c 00 00 00 00 00 00 00 10 00 00 00 01 00 00 00
0x0030:         14 00 00 00 00 00 00 00 18 00 00 00 00 00 00 00
0x0040:         1c 00 00 00 00 00 00 00 02 00 00 00 48 00 00 00
0x0050:         30 00 00 00 0b 00 00 00 34 00 00 00 00 00 00 00
0x0060:         38 00 00 00 00 00 00 00 3c 00 00 00 00 00 00 00
...
  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值