Exynos4412——网卡移植和NFS启动

fs4412开发板学习笔记(六) 移植Linux3.14.29内核setenv bootcmd tftp 41000000 uImage_me\;tftp 42000000 exynos4412-fs4412_me.dtb\;bootm 41000000 - 42000000一、内核的配置和编译1.修改顶层目录的Makefile #ARCH ?= $(SUBARCH) #CROSS_COMPILE ?= $(C 阅读详情

优快云仅用于增加百度收录权重,排版未优化,日常不维护。请访问:www.hceng.cn 查看、评论。
本博文对应地址: https://hceng.cn/2017/10/31/Exynos4412——网卡移植和NFS启动/#more

为Exynos 4412移植好网卡驱动,并采用NFS挂载根文件系统启动。

玩Exynos4412的第一个目标是想弄下LCD驱动。
在开始流畅的写驱动前,前期的准备工作又多又繁琐。

上次移植好了内核,内核和根文件系统都是在RAM进行进行加载的,后面写驱动的时候,肯定不方便。
就以往的经验来看,uboot、kernel都应该在SD卡或者eMMC上,这样断电才不会丢失。根文件系统在调试驱动的时候应该是nfs挂载,调试完成了再烧写到SD卡或者eMMC上。

因此,写驱动前至少还要移植好SD卡驱动、网卡驱动。eMMC可暂时不管。

本次就先移植好网卡驱动,并尝试NFS挂载根文件系统。

1.硬件结构

JZ2440中的网卡芯片是DM9000,采用的是内存接口。

Tiny4412的网卡芯片是DM9621,采用的是USB接口。
而且该芯片并没有直接接在SOC的USB上,而是接在USB4604这个HUB芯片上。
USB4604通过HSIC接口(XuhostSTROBE1和XuhostDATA1)接在SOC上。
框架如下:

因此,需要重点关注USB4604和DM9621。查看这两块的原理图:

USB4604:

DM9621:

发现USB4604的一些功能并没有使用,如外接SPI/I2C设备等。除了数据端口,还能控制的就是复位引脚。

DM9621的驱动在本内核的drivers/net/usb/dm9601.c已经实现,但为了支持识别bootargs中的mac地址的功能,需要稍微修改dm9601.c,添加解析mac地址的功能,并且还需要将解析到的有效的mac地址设置到dm9621中,否则网络不能用。

USB4604的驱动在本内核的drivers/usb/misc/usb4604.c已经实现,但由于没有外接SPI/I2C,需要删除一些,可以参考drivers/usb/misc/usb3503.c或者博客里的代码。我直接用的博客里面的代码。

此外,还需在设备树使能将要用到的外设:hsi、ehci、otg等。

2.移植网卡驱动

目前需要修改的文件有:
(1)设备树文件:arch/arm/boot/dts/exynos4412-tiny4412.dts;
(2)DM9621驱动:drivers/net/usb/dm9601.c;
(3)USB4604驱动:drivers/usb/misc/usb4604.c;
(4)USB4604驱动头文件:include/linux/platform_data/usb4604.h(新建);
(5)设备树头文件:include/dt-bindings/usb4640/usb4604.h(新建);
(6)DM9621驱动加入内核;
(7)USB4604驱动加入内核;

2.1 修改设备树文件

主要添加了usb-hub的复位引脚信息和使能了一些外设。
{% codeblock lang:c%}
— /work/tools/linux-4.13.9/arch/arm/boot/dts/exynos4412-tiny4412.dts 2017-10-21 08:55:07.000000000 -0700
+++ /work/linux-4.13.9/arch/arm/boot/dts/exynos4412-tiny4412.dts 2017-10-30 02:34:10.363297869 -0700
@@ -14,6 +14,7 @@
/dts-v1/;
#include “exynos4412.dtsi”
#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/usb4604/usb4604.h>

/ {
model = “FriendlyARM TINY4412 board based on Exynos4412”;
@@ -21,6 +22,7 @@

chosen {
	stdout-path = &serial_0;
  •   bootargs = "root=/dev/ram0 rw rootfstype=ext4 console=ttySAC0,115200 init=/linuxrc earlyprintk";
    

    };

    memory@40000000 {
    @@ -28,6 +30,12 @@
    reg = <0x40000000 0x40000000>;
    };

  •   usb-hub {
    
  •    	compatible = "smsc,usb4604";
    
  •   reset-gpios = <&gpm2 4 GPIO_ACTIVE_LOW>;
    
  •    	initial-mode = <USB4604_MODE_HUB>;
    
  •   };
    
  • leds {
    compatible = “gpio-leds”;

@@ -79,7 +87,7 @@
bus-width = <4>;
pinctrl-0 = <&sd2_clk &sd2_cmd &sd2_cd &sd2_bus4>;
pinctrl-names = “default”;

  • status = “okay”;
  • status = “disabled”;
    };

&serial_0 {
@@ -97,3 +105,32 @@
&serial_3 {
status = “okay”;
};
+
+
+&exynos_usbphy {

  • status = “okay”;
    +};

+&ehci {

  • status = “okay”;
  • port@0 {
  •    status = "okay";
    
  • };
  • port@1 {
  •    status = "okay";
    
  • };
  • port@2 {
  •    status = "okay";
    
  • };
    +};

+&ohci {

  • status = “okay”;
  • port@0 {
  •    status = "okay";
    
  • };
    +};

+&hsotg {

  • status = “okay”;
    +};
    {% endcodeblock %}

2.2 修改DM9621驱动

主要是添加解析mac地址的功能,并且还需要将解析到的有效的mac地址设置到dm9621中。
{% codeblock lang:c%}
— /work/tools/linux-4.13.9/drivers/net/usb/dm9601.c 2017-10-21 08:55:07.000000000 -0700
+++ /work/linux-4.13.9/drivers/net/usb/dm9601.c 2017-10-30 02:06:54.319597116 -0700
@@ -58,6 +58,39 @@
#define DM_RX_OVERHEAD 7 /* 3 byte header + 4 byte crc tail */
#define DM_TIMEOUT 1000

+/* Setup ethernet address */
+static u8 param_addr[ETH_ALEN];
+
+static int __init dm9601_set_mac(char *str) {

  • u8 addr[ETH_ALEN];
  • uint val;
  • int idx = 0;
  • char *p = str, *end;
  • while (*p && idx < ETH_ALEN) {
  •   val = simple_strtoul(p, &end, 16);
    
  •   if (end <= p) {
    
  •   	break;
    
  •   } else {
    
  •   	addr[idx++] = val;
    
  •   	p = end;
    
  •   	if (*p == ':'|| *p == '-') {
    
  •   		p++;
    
  •   	} else {
    
  •   		break;
    
  •   	}
    
  •   }
    
  • }
  • if (idx == ETH_ALEN) {
  •   printk("Setup ethernet address to %pM\n", addr);
    
  •   memcpy(param_addr, addr, ETH_ALEN);
    
  • }
  • return 1;
    +}
    +__setup(“ethmac=”, dm9601_set_mac);

static int dm_read(struct usbnet *dev, u8 reg, u16 length, void *data)
{
int err;
@@ -190,8 +223,6 @@
return dm_read_shared_word(dev, 0, offset, value);
}

static int dm9601_get_eeprom_len(struct net_device *dev)
{
return DM_EEPROM_LEN;
@@ -281,9 +312,9 @@
.set_msglevel = usbnet_set_msglevel,
.get_eeprom_len = dm9601_get_eeprom_len,
.get_eeprom = dm9601_get_eeprom,
+// .get_settings = usbnet_get_settings,
+// .set_settings = usbnet_set_settings,
.nway_reset = usbnet_nway_reset,

  • .get_link_ksettings = usbnet_get_link_ksettings,
  • .set_link_ksettings = usbnet_set_link_ksettings,
    };

static void dm9601_set_multicast(struct net_device *net)
@@ -343,7 +374,6 @@
.ndo_start_xmit = usbnet_start_xmit,
.ndo_tx_timeout = usbnet_tx_timeout,
.ndo_change_mtu = usbnet_change_mtu,

  • .ndo_get_stats64 = usbnet_get_stats64,
    .ndo_validate_addr = eth_validate_addr,
    .ndo_do_ioctl = dm9601_ioctl,
    .ndo_set_rx_mode = dm9601_set_multicast,
    @@ -390,7 +420,11 @@
    /*
    • Overwrite the auto-generated address only with good ones.
      */
  • if (is_valid_ether_addr(mac))
  • if (is_valid_ether_addr(param_addr)) {
  •   /* write MAC to dm9621 */
    
  •   memcpy(dev->net->dev_addr, param_addr, ETH_ALEN);
    
  •   __dm9601_set_mac_address(dev);
    
  • } else if (is_valid_ether_addr(mac))
    memcpy(dev->net->dev_addr, mac, ETH_ALEN);
    else {
    printk(KERN_WARNING
    {% endcodeblock %}

2.3 修改USB4604驱动##

这个几乎就全改了,应该原来的那个稍微改改也能用。
{% codeblock lang:c%}
/*

  • Driver for SMSC USB4604 USB 2.0 hub controller driver
    */

#include <linux/gpio.h>
#include <linux/delay.h>
#include <linux/slab.h>
#include <linux/module.h>
#include <linux/of_gpio.h>
#include <linux/platform_device.h>
#include <linux/platform_data/usb4604.h>

struct usb4604 {
enum usb4604_mode mode;
struct device *dev;
int gpio_reset;
};

static int usb4604_reset(struct usb4604 *hub, int state)
{
if (gpio_is_valid(hub->gpio_reset))
gpio_set_value_cansleep(hub->gpio_reset, state);

 /* Wait 1ms for hub logic to stabilize */
 if (state)
     usleep_range(1, 10);

 return 0;

}

static int usb4604_connect(struct usb4604 *hub)
{
struct device *dev = hub->dev;

 usb4604_reset(hub, 1);
 hub->mode = USB4604_MODE_HUB;
 dev_info(dev, "switched to HUB mode\n");

 return 0;

}

static int usb4604_switch_mode(struct usb4604 *hub, enum usb4604_mode mode)
{
struct device *dev = hub->dev;
int err = 0;

 switch (mode) {
 case USB4604_MODE_HUB:
     err = usb4604_connect(hub);
     break;

 case USB4604_MODE_STANDBY:
     usb4604_reset(hub, 0);
     dev_info(dev, "switched to STANDBY mode\n");
     break;

 default:
     dev_err(dev, "unknown mode is requested\n");
     err = -EINVAL;
     break;
 }

 return err;

}

static int usb4604_probe(struct usb4604 *hub)
{
struct device *dev = hub->dev;
struct usb4604_platform_data *pdata = dev_get_platdata(dev);
struct device_node *np = dev->of_node;
int err;
u32 mode = USB4604_MODE_HUB;

 if (pdata) {
     hub->gpio_reset        = pdata->gpio_reset;
     hub->mode        = pdata->initial_mode;
 } else if (np) {
     hub->gpio_reset = of_get_named_gpio(np, "reset-gpios", 0);
     if (hub->gpio_reset == -EPROBE_DEFER)
         return -EPROBE_DEFER;
     of_property_read_u32(np, "initial-mode", &mode);
     hub->mode = mode;
 }

 if (gpio_is_valid(hub->gpio_reset)) {
     err = devm_gpio_request_one(dev, hub->gpio_reset,
             GPIOF_OUT_INIT_LOW, "usb4604 reset");
     if (err) {
         dev_err(dev,
             "unable to request GPIO %d as reset pin (%d)\n",
             hub->gpio_reset, err);
         return err;
     }
 }

 usb4604_switch_mode(hub, hub->mode);

 dev_info(dev, "%s: probed in %s mode\n", __func__,
         (hub->mode == USB4604_MODE_HUB) ? "hub" : "standby");

 return 0;

}

static int usb4604_platform_probe(struct platform_device *pdev)
{
struct usb4604 *hub;

 hub = devm_kzalloc(&pdev->dev, sizeof(struct usb4604), GFP_KERNEL);
 if (!hub)
     return -ENOMEM;
 hub->dev = &pdev->dev;

 return usb4604_probe(hub);

}

#ifdef CONFIG_OF
static const struct of_device_id usb4604_of_match[] = {
{ .compatible = “smsc,usb4604”, },
{},
};
MODULE_DEVICE_TABLE(of, usb4604_of_match);
#endif

static struct platform_driver usb4604_platform_driver = {
.driver = {
.name = USB4604_NAME,
.of_match_table = of_match_ptr(usb4604_of_match),
},
.probe = usb4604_platform_probe,
};

static int __init usb4604_init(void)
{
int err;
err = platform_driver_register(&usb4604_platform_driver);
if (err != 0)
pr_err(“usb4604: Failed to register platform driver: %d\n”,
err);

 return 0;

}
module_init(usb4604_init);

static void __exit usb4604_exit(void)
{
platform_driver_unregister(&usb4604_platform_driver);
}
module_exit(usb4604_exit);

MODULE_DESCRIPTION(“USB4604 USB HUB driver”);
MODULE_LICENSE(“GPL”);
{% endcodeblock %}

2.4 USB4604驱动头文件##

枚举usb模式。
{% codeblock lang:c%}
#ifndef USB4604_H
#define USB4604_H

#define USB4604_NAME “usb4604”

enum usb4604_mode {
USB4604_MODE_UNKNOWN = 1,
USB4604_MODE_HUB,
USB4604_MODE_STANDBY,
};

struct usb4604_platform_data {
enum usb4604_mode initial_mode;
int gpio_reset;
};

#endif
{% endcodeblock %}

2.5 设备树头文件##

提供usb-hub的工作模式宏。
{% codeblock lang:c%}
#ifndef _DT_BINDINGS_USB4604
#define _DT_BINDINGS_USB4604

#define USB4604_MODE_UNKNOWN 1
#define USB4604_MODE_HUB 2
#define USB4604_MODE_STANDBY 3
#endif
{% endcodeblock %}

2.6 DM9621驱动加入内核##

进入配置界面:

 make menuconfig

将DM9621驱动加入内核

2.7 USB4604驱动加入内核##

将USB4604驱动加入内核

2.8 重新编译、烧写、测试##

  • 编译:
make uImage LOADADDR=0x40008000 
make dtbs
  • 烧写:
    在开发板uboot界面输入:
dnw 0x40600000;dnw 0x41000000;dnw 0x42000000

在Ubuntu依次输入:

sudo ./dnw /work/linux-4.13.9/arch/arm/boot/uImage
sudo ./dnw /work/ramdisk/ramdisk.img
sudo ./dnw /work/linux-4.13.9/arch/arm/boot/dts/exynos4412-tiny4412.dtb

最后再开发板启动:

sudo ./dnw /work/linux-4.13.9/arch/arm/boot/uImage
sudo ./dnw /work/ramdisk/ramdisk.img
sudo ./dnw /work/linux-4.13.9/arch/arm/boot/dts/exynos4412-tiny4412.dtb
  • 测试:
    设置网卡ip
ifconfig eth0 192.168.1.225

ping主机:

ping -c4 192.168.1.226

3.NFS启动

这里的根文件系统直接使用的是韦老大第三期项目视频的根文件系统,之前在JZ2440上也能运行,就直接拿来用了。
此外修改了根文件系统、的etc/init.d/rcS,加入了ifconfig eth0 192.168.1.225设置静态IP。

设置uboot参数:

setenv bootargs 'root=/dev/nfs rw nfsroot=192.168.1.226:/work/fs_mini_mdev_new ethmac=00:40:5c:26:0a:5b ip=192.168.1.225:192.168.1.226:192.168.1.1:255.255.255.0::eth0:off console=ttySAC0,115200 init=/linuxrc'; saveenv

开发板下载及启动:

dnw 0x40000000;dnw 0x42000000;bootm 0x40000000 - 0x42000000

Ubuntu下载:

sudo ./dnw /work/linux-4.13.9/arch/arm/boot/uImage
sudo ./dnw /work/linux-4.13.9/arch/arm/boot/dts/exynos4412-tiny4412.dtb

NFS启动效果:

4.心得

感谢摩斯电码的博客,很多的参考他的,节约了很多时间。

下一步移植完SD卡的驱动,将uboot和内核都放在SD卡上,根文件系统挂在nfs上,就可以搞LCD了。

《Linux操作系统-系统移植》第4章 内核移植 (Exynos4412+Linux3.14) 4.6内核的配置和编译 【Linux内核下载地址】 1、 解压内核 将linux-3.14.tar.xz拷贝到/home/linux下并解压 $tar xvf linux-3.14.tar.xz $ cd linux-3.14 2、 修改内核顶层目录下的Makefile $ vim Makefile 修改: 为: ARCH ?= arm... 阅读详情

相关推荐

基于Tiny4412开发板的U-Boot移植与实战详解

U-Boot(Universal Boot Loader)是嵌入式系统中应用最广泛的开源引导程序,遵循GPL协议,支持ARM、PowerPC、MIPS、x86等多种处理器架构。其核心作用是在系统上电后初始化关键硬件,并加载操作系统内核(如Linux),完成从裸机环境到高级操作系统的过渡。在实际开发中,经常需要为U-Boot添加私有功能,比如点亮LED、注册新命令或启用专有通信协议。此时需手动定义新的CONFIG_*宏。

weixin_36464343的博客 968

ioctl 详解,以ethtool为例

相关的ethtool命令: ethtool -s|--change DEVNAME Change generic options [ speed %d ] [ duplex half|full ] [ port tp|aui|bnc|mii|fibre ] [ mdix auto|on|off ] [ autoneg on|off ] ...

技术花园 4030

From Manual to Magic: How nnU-Net is Revolutionizing Biomedical Image Segmentation Without Human Int

本文探讨了nnU-Net如何通过全自动深度学习技术革新生物医学图像分割领域。作为自我配置的智能系统,nnU-Net无需人工干预即可完成从数据预处理到模型训练的全流程,显著提升医学影像分割的效率和精度,尤其在CT和MRI影像分析中表现卓越。

metal的博客 1082

USB-NET说明

<br />1.    USB-NET说明<br />本分析是建立在linux2.6.20内核基础上。<br />2.    USB-NET系统结构图<br /><br />                             <br />a linux实现<br />    linux主要实现两个接口 – 发送接口(start_xmit) 和接收接口(netif_rx)<br />b windows实现<br />    Windows中主要对上实现minport,对下实现usb接口。可以修改ndis

zh98jm的专栏 8046

STM32 HAL库定时器中断实现步进电机S型加减速控制与脉冲精准计数

本文详细介绍了如何使用STM32 HAL库定时器中断实现步进电机的S型加减速控制与脉冲精准计数。通过CubeMX配置定时器、计算PSC和ARR值,并结合S型曲线算法,实现平滑启停和精准定位。文章还提供了脉冲计数方案和常见问题排查技巧,帮助开发者优化步进电机控制性能。

weixin_29189363的博客 371

在MacBook M1/M2上,手把手教你打包包含嵌入模型的RagFlow Docker镜像(避坑指南)

本文详细指导如何在MacBook M1/M2上构建ARM64架构的RagFlow Docker镜像,涵盖环境准备、依赖处理、镜像构建及性能优化全流程。特别针对Apple Silicon芯片的兼容性问题提供解决方案,帮助开发者高效完成本地开发环境搭建。

weixin_26908317的博客 240

基于tiny4412的Linux内核移植 -- DM9621NP网卡驱动移植(四)

作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本:Linux-4.4.0 (支持device tree) u-boot版本:友善之臂自带的 U-Boot 2010.12 (为支持uImage启动,做了少许改动) busybox版本:...

weixin_34250709的博客 1040

IIS - 会话cookie中缺少HttpOnly属性

不啰嗦,我们直接开始! 先进行常规设置 打开配置编辑器 选中图中节点,将httpOnlyCookies设置为true 然后。。。不起作用。。。 换种方式 通过配置出站规则getcookie添加HttpOnly 在Web.config中添加如下出站规则 <rewrite> <outboundRules> <rule name="Add HttpOnly"> <match serverVa.

。 21万+

linux内核编程之网卡驱动

每一个网络接口由一个net_device结构描述,定义在中。 1.首先需要分配设备结构,使用函数: struct net_device *alloc_netdev(int sizof_priv, const char *name, void (*setup)(struct net_device));_priv是驱动程序的私有数据大小,这个区是同 net_device 结构一起分配的。name是

程序猿的挨踢人生 3732

OneNET物联网平台实战:从零搭建到双向数据通信测试

本文提供了一份详细的OneNET物联网平台实战指南,从零开始讲解平台搭建与设备创建,并重点演示了如何通过MQTT协议实现设备数据上报与云端命令下发的双向数据通信测试。通过模拟设备连接与数据交互,帮助开发者快速理解物联网核心通信流程。

weixin_29306571的博客 350

UG\NX二次开发 获取对象的引用集

获取对象的引用集,一个对象可能有多个引用集,下面这个封装函数可以获取对象的所有引用集。

王牌飞行员_里海的博客 489

usbnet驱动深入分析-usb虚拟网卡host端

1、驱动流程:   2、明确probe函数的功能: probe有usb core 经枚举过程,匹配 id_table ,识别到驱动,并调用probe来初始化一些信息。 如 dev->driver_info = info 只是取得注册时的一些信息,用于一些比较特殊的设备,如bind 与收发与普通的网卡不同时,增加或减少一些配置。 主要做了:  skb_queue_head_init

zh98jm的专栏 1万+

手把手教你学PCIE(2.1.23)--PCIe基本概念:链路速率协商

链路速率协商是一个多步骤的过程,确保发送端和接收端之间的链路速率设置一致。通过初始化链路速率寄存器、发送和接收 TS2 序列、检测链路对端的存在、交换链路速率信息、确定最大链路速率和配置链路速率,可以确保 PCIe 设备之间的数据传输速度最大化,从而提高数据传输效率。初始化链路速率寄存器:设置支持的最大链路速率。发送和接收 TS2 序列:检测链路对端的存在。交换链路速率信息:发送和支持的最大链路速率。确定最大链路速率:选择最小值作为最终链路速率。配置链路速率:更新链路速率寄存器。

MHD0815的博客 1815

创客exynos-fs4412系统移植-(uboot,内核,文件系统)

目录uboot移植uboot源码结构概括源码结构平台相关代码平台无关代码配置文件,帮助文档,示例程序,帮助等uboot配置与编译uboot移植 uboot移植 uboot源码结构概括 使用uboot引导启动Linux是Linux嵌入式开发中最常使用的方式 uboot源码下载 http://www.denx.de/wiki/U-Boot/ 本次移植使用u-boot-2013.01版本 为什么使用uboot 代码结构清晰 支持丰富的处理器与开发板,易于移植 支持丰富的用户命令 支持丰富的网络协议 支持丰富

u012640537的博客 7280

cdk&java | 分子sdf文件生成

sdf

ASKCOS博客 1089

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

linux 内核 网卡驱动 移植,linux内核移植步骤添加dm9000网卡驱动(设备树).docx

linux内核移植步骤添加dm9000网卡驱动(设备树).docx LINUX内核移植步骤2015年05月13日星期三上午1105往设备树中添加网卡驱动1、选平台,指定交叉编译工具链1、在MAKEFILE中指定源码顶层目录下MAKEFILEARCHSUBARCHCROSS_COMPILECONFIG_CROSS_COMPILE““改为ARCHARMCROSS_COMPILEARMLINUX2、编译...

weixin_30831529的博客 448

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

kernel移植

实验环境】 1、ubuntu 14.04 2、linux-3.14.tar.xz 3、FS_4412平台(EXYNOS 4412) 4、交叉编译器 arm-none-linux-gnueabi-gcc 开始移植: 1、下载内核 linux 内核 下载地址 https://www.kernel.org/ linux 各个版本下载地址 https://www.kernel.org/pub/linux...

xihuanyutian123的博客 585

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Exynos4412 uboot2013.1移植B

DM9000 网卡移植 由于DM9000 挂接在 EBI 总线上,所以CPU用SROM控制器(此处用BANK1)来对其进行访问和配置,SROM控制器直接接到AHB,所以保证了其通信速度 根据DM9000特性进行SROM控制器配置 #define DM9000_Tacs (0x1) /* 0clk         address set-up */ #define DM9000_Tcos

长江不择细流,故能浩荡万里 619

tiny4412学习(三)之移植linux-4.x驱动(1)支持网卡驱动【转】

本文转载自:http://blog.youkuaiyun.com/fengyuwuzu0519/article/details/74160686 一、思路 上一节我们通过DNW将内核、文件系统、设备树文件烧入到内存中,并使用bootm启动内核:bootm0x40600000  0x41000000  0x42000000。因为此时内核并没有SD卡驱动,和EMMC驱动,我们只能直接将系统拷贝至内存中然后启动...

weixin_34239169的博客 105

内核移植笔记----FS4112学习板

本人学习的是华清远见的一款FS4412学习板,学到内核移植,就把内核移植的学习笔记贴上来,跟大家学习交流交流。

Daback01的博客 674

linux 内核配置、编译过程

linux 内核配置、编译、移植 1、前言 Linux内核: 3.14 目 标 板: Exynos4412-FS4412开发板 学习 目标: 从www.kernel.org下载一个全新的Linux内核,并将linux 内核经过配置、编译之后,移植到我们的目 标版。 2、linux内核的配置 配置之前:首先拿到我们的板子,

只有自己觉到悟到的,才是自己的。 748

FS4412开发板移植Linux内核4.9.9版本

基本移植 1、源码下载 官网下载最新的linux4.9.9内核:https://mirrors.edge.kernel.org/pub/linux/kernel/。 第三个数字是修订版本号。 2、解压并配置 tar xvf linux-4.9.9.tar.xz 进入内核源码目录及:cd linux-4.9.9 修改编译工具链,打开顶层的Makefile:vi Mak...

weixin_30861797的博客 432

系统移植基础知识

系统操作系统(本质一个程序一堆代码;移植将源代码(Linux操作系统原码)叫做移植内核裁剪选择对应的功能linux文件系统的瘦身给动态库瘦身:删静态库加上调试信息。

2401_87196189的博客 351

1.系统移植

(无图形化界面)(NTFS/FAT(16/32)):规定数据如何组成为文件/文件夹,记录内存使用情况(桌面图形化)

2301_80823950的博客 202

Linux系统移植全流程解析

本文系统梳理了操作系统移植的核心流程与技术要点,包括:1. 系统启动流程对比分析PC与嵌入式设备启动差异,详解BIOS/U-Boot的硬件初始化、引导加载机制及内存管理策略;2. U-Boot与Linux内核交互重点解析参数传递机制(寄存器约定、内存布局)、设备树作用及bootcmd/bootargs配置规范;3. 内核构建体系阐明Kconfig-Makefile-.config的配置逻辑,揭示menuconfig菜单生成与功能编译的关联关系;4. 深度剖析U-Boot两阶段启动设计(时钟初始化、内存重定向

2503_90158057的博客 348

Linux系统移植

复位后执行IROM中的BootRom进行如CPU基础时钟、SRAM,并根据boot决定启动方式如果是eMMC;然后将eMMC中的SPL即bootloader(比如u-boot-spl.bin)的第一阶段搬移到IRAM(SRAM),执行部分硬件比如PPL、串口、DDR控制器的初始化;然后将bootloader第二阶段(u-boot.bin)搬移到DDR执行,加载系统内核、设备树与文件系统镜像,最后跳转执行内核并挂载文件系统。

qq_57329063的博客 245
上一篇: Exynos4412——内核移植
下一篇: Exynos4412——SD卡启动
hceng_blog
博客等级 码龄10年 263粉丝 53原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值