全志V3S嵌入式驱动开发(网卡驱动)

news2024/9/29 13:26:06

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        一开始上来就说网卡,好像有点不太对劲。这主要是因为如果开发板可以连接网络的话,可以帮我们节约很多的时间,开发效率也会得到提高。另外一方面,v3s自身也比较特殊,因为它自己集成了mac和phy,所以驱动本身并不是那么好写。好在v3s帮助客户做好了这一点,我们要做的只是需要把内核升级到4.14.y就可以,其他什么都不用做。

        查看翻了一下,在之前4.10.y版本里面,sun8i-v3s.dtsi文件当中根本没有emac的内容,但是在4.14.y当中,我们看到了相关的脚本,所以果断把内核切到4.14.y,

1、第一步,重新编译内核和dtb文件

        注意更换zImage和sun8i-v3s-licheepi-zero-dock.dtb。其中设备树文件一定要跟着替换,这是至关重要的。

2、启动开发板、插上网线

buildroot login: root
# ifconfig
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  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:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

        输入root密码之后,我们输入ifconfig,提示并没有网卡。这是什么情况?其实主要是因为还没有手动把网卡启动开来。只要输入ifconfig eth0 up即可,

# ifconfig eth0 up
[   13.914168] Generic PHY stmmac-0:01: attached PHY driver [Generic PHY] (mii_bus:phy_addr=stmmac-0:01, irq=POLL)
[   13.926199] dwmac-sun8i 1c30000.ethernet eth0: No MAC Management Counters available
[   13.933868] dwmac-sun8i 1c30000.ethernet eth0: PTP not supported by HW
# [   16.004609] dwmac-sun8i 1c30000.ethernet eth0: Link is Up - 100Mbps/Full - flow control rx/tx

# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:00:A4:52:F3:CC  
          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:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
          Interrupt:38 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  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:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

        这个时候再输入ifconfig,就会发现多了一个eth0的网卡。这就是需要配置的部分,继续输入ip、netmask和gateway。

# ifconfig eth0 192.168.0.230 netmask 255.255.255.0 broadcast 192.168.0.1
# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:00:A4:52:F3:CC  
          inet addr:192.168.0.230  Bcast:192.168.0.1  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:15 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1197 (1.1 KiB)  TX bytes:0 (0.0 B)
          Interrupt:38 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  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:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

        通过ifconfig查看,可以发现当前addr、bcast和mask都已经配置上了。为了进一步验证判断开发板和电脑之间是否通信正常,可以输入ping命令来验证,

# ping 192.168.0.101
PING 192.168.0.101 (192.168.0.101): 56 data bytes
64 bytes from 192.168.0.101: seq=0 ttl=128 time=28.197 ms
64 bytes from 192.168.0.101: seq=1 ttl=128 time=48.854 ms
64 bytes from 192.168.0.101: seq=2 ttl=128 time=1.981 ms
64 bytes from 192.168.0.101: seq=3 ttl=128 time=96.510 ms
64 bytes from 192.168.0.101: seq=4 ttl=128 time=3.070 ms
^C
--- 192.168.0.101 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 1.981/35.722/96.510 ms

        从打印来看一切正常,没有什么问题。

3、通过网络验证第一个用户侧程序

        开发到现在,我们还没有开发过应用程序。不妨写一个简单的hello来验证下,像这样,

#include <stdio.h>

int main(int argc, char* argv[])
{
	printf("hello, world!\n");
	return 0;
}

        使用交叉编译器编译一下即可,

arm-linux-gnueabihf-gcc hello.c -g -o hello

        编译好了,关键是我们怎么把程序从虚拟机拷贝到开发板呢。关于这个流程,可以这么来做,首先,把程序从虚拟机拷贝到windows目录下,

 sudo cp hello /media/sf_Downloads/

        接着,对于hello所在的目录,用python命令将其设置为web服务器的起始目录,

C:\Python39\python.exe  -m http.server 9000 --bind 192.168.0.101 -d C:\Users\feixiaoxing\Downloads

        最后一步就比较简单了,那就是用开发板上面的wget命令下载hello文件,

# wget -c http://192.168.0.101:9000/hello
Connecting to 192.168.0.101:9000 (192.168.0.101:9000)
hello                100% |*******************************| 12264   0:00:00 ETA

        注意,这个时候,hello文件还没有被当成是可执行文件,所以需要chmod一下才能执行,

# ls
hello
# chmod +x hello
# ls
hello
# ./hello
hello, world!

4、继续验证第一个驱动文件

        前面我们说了应用程序是怎么写的,这个时候就可以看下驱动是怎么编写的,其实步骤差不多,首先准备驱动文件,

#include <linux/init.h>
#include <linux/sched.h>
#include <linux/module.h>
 
MODULE_LICENSE("GPL");
MODULE_AUTHOR("feixiaoxing");
MODULE_DESCRIPTION("This is just a hello module!\n");
 
static int __init hello_init(void)
{
        printk(KERN_EMERG "hello, init\n");
        return 0;
}
 
static void __exit hello_exit(void)
{
        printk(KERN_EMERG "hello, exit\n");
}
 
module_init(hello_init);
module_exit(hello_exit);

        因为驱动本身是和kernel强绑定在一起的,所以一般情况下还需要写一个makefile,其中KDIR的位置十分重要,

ifneq ($(KERNELRELEASE),)
obj-m := hello.o
 
else
PWD  := $(shell pwd)
KDIR := /home/feixiaoxing/Desktop/linux-zero-4.14.y
all:
	$(MAKE) -C $(KDIR) M=$(PWD) modules CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm
clean:
	rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions *.order *.symvers
endif

        此时,所需要做的就是输入make命令即可,这样就可以生成ko文件。生成了hello.ko之后,接着就需要把这个文件copy到开发板上面,流程和copy应用层的执行文件是一样的,这里略过。

# wget -c http://192.168.0.101:9000/hello.ko
Connecting to 192.168.0.101:9000 (192.168.0.101:9000)
hello.ko             100% |*******************************|  3340   0:00:00 ETA

        为了验证我们的驱动是否正确,可以通过insmod、lsmod和rmmod这个三个命令,并结合相关打印来综合进行判断。

# ls
hello     hello.ko
# lsmod
Module                  Size  Used by    Not tainted
# insmod hello.ko
[ 1704.500799] hello: loading out-of-tree module taints kernel.
[ 1704.507037] hello, init
# lsmod
Module                  Size  Used by    Tainted: G  
hello                  16384  0 
# rmmod hello
[ 1719.946160] hello, exit
# lsmod
Module                  Size  Used by    Tainted: G  

5、总结

        有了网络驱动,确实可以提高我们开发的效率。除了串口之外,网络几乎是嵌入式开发最重要的开发方式。当然,它不仅仅可以接收外部的命令控制,还可以和各种传感器进行通信,这样就能构成一个基本的嵌入式系统产品。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/586214.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

逍遥自在学C语言 | 揭开while循环的神秘面纱

前言 循环是一种重要的控制结构&#xff0c;可以使程序重复执行一段代码&#xff0c;直到满足特定条件为止。 在C语言中&#xff0c;while和do-while是两种常用的循环结构&#xff0c;本文将详细介绍这两种循环的用法。 一、人物简介 第一位闪亮登场&#xff0c;有请今后会一…

eclipse安装lombok插件

项目中遇到了一些实体类声明了属性&#xff0c;缺少get/set方法&#xff0c;但是类上使用了Getter 和 Setter注解&#xff0c;查了下是lombok插件的强大功能。 这里先不看lombok的功能&#xff0c;先看下eclipse安装lombok插件的过程。 1、 https://projectlombok.org/downlo…

三十五、数学知识——快速幂(反复平方法 + 快速幂求逆元)

快速幂算法主要内容 一、基本原理1、概念 暴力求解2、核心原理——反复平方法3、快速幂求逆元 二、Java、C语言模板实现三、例题题解 一、基本原理 1、概念 暴力求解 问题目标&#xff1a; 快速求出 a^k mod p 的结果&#xff0c;时间复杂度为 O(logk)&#xff0c;其中 a,p…

华为OD机试真题B卷 Java 实现【字符串变换最小字符串】,附详细解题思路

一、题目描述 给定一个字符串s&#xff0c;最多只能进行一次变换&#xff0c;返回变换后能得到的最小字符串&#xff08;按照字典序进行比较&#xff09;。 变换规则&#xff1a;交换字符串中任意两个不同位置的字符。 二、输入描述 一串小写字母组成的字符串s。 三、输出…

人工智能-不确定性的量化

这一部分的重点内容有&#xff1a; 贝叶斯规则贝叶斯网络基于隐马尔可夫模型的概率推理 大概会有以下几种考察形式&#xff0c;有答案的历年期末考试题只解释一些注意的地方 贝叶斯网络-独立性 第二问答案很详细&#xff0c;第一问看↓ D-separation&#xff1a; 判断贝叶…

Stable-diffusion-webui 本地部署及使用

Stable-diffusion-webui 本地部署及使用 本地部署stable-diffusion-webui(windows)1.安装conda&#xff1b;2.创建conda env 和python 3.10.6&#xff1b;3.更新pip&#xff1b;4.安装cuda 11.8&#xff1b;5.克隆stable-diffusion-webui仓库 &#xff1b;6.下载SD模型7.运行sd…

Dubbo配置

dubbo配置官网参考 1.配置原则 JVM 启动 -D 参数优先&#xff0c;这样可以使用户在部署和启动时进行参数重写&#xff0c;比如在启动时需改变协议的端口。 XML 次之&#xff0c;如果在 XML 中有配置&#xff0c;则 dubbo.properties 中的相应配置项无效。 Properties 最后&a…

【群智能算法改进】一种改进的蝴蝶优化算法 改进蝴蝶优化算法 改进BOA[1]【Matlab代码#35】

文章目录 【获取资源请见文章第5节&#xff1a;资源获取】1. 原始蝴蝶优化算法2. 改进蝴蝶优化算法2.1 动态转换概率策略2.2 最优邻域扰动策略2.3 随机惯性权重策略 3. 部分代码展示4. 仿真结果展示5. 资源获取6. 参考文献 【获取资源请见文章第5节&#xff1a;资源获取】 1. 原…

React面试题和基础

React的特点&#xff1a; JSX它使用虚拟DOM &#xff0c;减少 DOM 操作&#xff0c;提升性能。便于和其他平台集成。它可以进行服务器端渲染。单向数据流。组件化 双向数据绑定和单向数据流区别&#xff1f; 单向绑定的优点在于清晰可控&#xff0c;缺点则在于模板代码过多。…

第一部分-基础篇-第二章:PSTN、PBX及呼叫中心业务

文章目录 序言上一篇文章&#xff1a;2.1 PSTN业务2.1.1 POTS2.1.2 商务业务2.1.3 其他增值业务 2.2 PBX业务2.2.1 呼叫转移2.2.2 同组代答 2.3 PBX与中继线2.4 IP-PBX业务2.5 呼叫中心2.5.1 什么是呼叫中心2.5.2 呼叫中心的历史2.5.3 呼叫中心的分类1.交换机类型的呼叫中心2.板…

C++——string

作者&#xff1a;几冬雪来 时间&#xff1a;2023年5月29日 内容&#xff1a;C——string内容讲解 目录 前言&#xff1a; 1.string&#xff08;续&#xff09;&#xff1a; 1.string::operator[]: 2.string:: length()&#xff1a; 3.string:: max_size(): 4.strin…

华南农业大学|图像处理与分析技术综合测试|题目解答:识别时钟上时间

设计任务 这是一幅表盘图像&#xff0c;试采用图像处理和分析技术&#xff0c;设计适当的算法和程序&#xff0c;计算出表盘上的指示时间&#xff08;要求精确到秒&#xff09;。请按统一要求写出算法原理、设计流程&#xff0c;并完成测试分析等报告内容。 算法设计 解题思路…

张小飞的Java之路——第四十二章——字节流

写在前面&#xff1a; 视频是什么东西&#xff0c;有看文档精彩吗&#xff1f; 视频是什么东西&#xff0c;有看文档速度快吗&#xff1f; 视频是什么东西&#xff0c;有看文档效率高吗&#xff1f; 诸小亮&#xff1a;下面我们学习——字节流 张小飞&#xff1a;什么是字…

article-并联机械手爪运动学分析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3aNKIR4E-1685371700448)(data:image/svgxml;utf8, )] 2.4.3 基于Robotics Toolbox的工具箱的模型检测 上文中&#xff0c;我们已经对采摘机器手爪运动学理论模型进行了创建&#xff0c;接下来要用MA…

V3.0_用exec族函数替代system()

注意点&#xff1a;exec族函数的使用 以execl为例&#xff1a; &#xff08;1&#xff09; &#xff08;2&#xff09;exec族函数中的函数调用失败时会设置error并返回-1&#xff0c;然后从源程序调用点接着往下执行。 执行成功后不会返回&#xff0c;也不会从源程序调用点接…

Redis缓存一致性问题及解决方案

对于没有并发的用户请求 先更新缓存&#xff0c;后更新数据库先更新数据库&#xff0c;后更新缓存 两者第二步没成功&#xff0c;都有问题 如果更新缓存成功&#xff0c;更新数据库没成功&#xff0c;一旦缓存失效&#xff0c;读取的仍是旧值如果更新数据库成功&#xff0c;…

MySQL官网下载Linux版本安装包

步骤一&#xff1a;https://www.mysql.com/ 步骤二&#xff1a;https://www.mysql.com/downloads/ 步骤三&#xff1a;https://dev.mysql.com/downloads/ 步骤四&#xff1a;https://dev.mysql.com/downloads/mysql/

二十分钟秒懂:实现前后端分离开发(vue+element+spring boot+mybatis+MySQL)

目录 开发者介绍 什么是前后端分离开发 vue与springboot开发的优势 Vue.js 的优势&#xff1a; Spring Boot 的优势&#xff1a; vue与springboot如何实现前后端连接 demo简介 重要部分前端部分代码 重要部分后端代码 后端解决跨域问题 Controller部分 xml部分 se…

商城APP开发需要哪些功能,如何选择开发公司

商城APP开发的功能有很多&#xff0c;从功能上看主要分为以下几个大类&#xff1a; 一、商品展示类&#xff1a;商家可以在这里展示自己产品的种类、数量、价格等信息&#xff0c;消费者在浏览和选择的时候&#xff0c;能直观的看到商家介绍。 二、优惠促销类&#xff1a;商家…

JDBC与DBCP整合

DBCP:DataBase Connection Pool,数据库连接池负责分配、管理和释放数据库连接&#xff0c;它允许应用程序重复使用一个现有的数据库连接&#xff0c;而不是再重新建立一个&#xff1b;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接…