重庆大学建设管理与房地产学院网站网站开发之前前后端不分离

当前位置: 首页 > news >正文

重庆大学建设管理与房地产学院网站,网站开发之前前后端不分离,文化网站开发背景,朝青板块网站建设内核移植半导体厂商会从linux内核官网下载某个版本#xff0c;将其移植到自己的CPU上#xff0c;测试成功后就会将其开放给该半导体的厂商的CPU开发者#xff0c;开发者下载其提供的linux内核#xff0c;然后将其移植到自己的 产品上。1、NXP官方开发板Linux内核编译测试编…内核移植半导体厂商会从linux内核官网下载某个版本将其移植到自己的CPU上测试成功后就会将其开放给该半导体的厂商的CPU开发者开发者下载其提供的linux内核然后将其移植到自己的 产品上。1、NXP官方开发板Linux内核编译测试编译内核之前需要在ubuntu上安装lzop库图形化配置工具还需要ncurses库支持安装命令sudo apt-get install lzop sudo apt-get install build-essential sudo apt-get install libncurses5-dev1.1、修改顶层Makefile1.2、配置并编译Linux内核编译Linux内核之前要先配置Linux内核。每个板子都有其对应的默认配置文件这些配置文件保存在“arch/arm/configs”目录中。imx_v7_defconfig和imx_v7_mfg_defconfig都可以作为NXP官方开发板IMX6ULL EVK的默认配置文件但是一般都使用后者因为后者编译出来的zImage可以通过NXP官方提供的MfgTool工具进行烧写make clean //第一次编译 Linux 内核之前先清理一下 make imx_v7_mfg_defconfig //配置 Linux 内核 make -j16 //编译 Linux 内核编译完成后我们得到两个重要文件①、Linux 内核镜像文件zImage。②、NXP 官方 I.MX6ULL EVK 开发板对应的设备树文件imx6ull-14x14-evk.dtb。1.3、Linux内核启动测试首先检查uboot中的环境变量bootargsconsolettymxc0,115200 root/dev/mmcblk1p2 rootwait rw然后拷贝zImage和imx6ull-14x14-evk.dtb到tftp目录cp arch/arm/boot/zImage /home/mxh/linux/tftpboot/ -f cp arch/arm/boot/dts/imx6ull-14x14-evk.dtb /home/mxh/linux/tftpboot/ -f最后启动开发板进入uboot命令行启动tftp 80800000 zImage tftp 83000000 imx6ull-14x14-evk.dtb bootz 80800000 - 83000000内核启动后如果EMMC存在根文件系统就可以进入到linux系统进行命令行操作1.4、根文件系统缺失错误如果不设置根文件系统路径或者路径设置错误开发板从网络启动后会提示内核崩溃VFS不能挂载文件系统2、在Linux中添加自己的开发板2.1、添加开发板默认配置文件将arch/arm/configs 目 录 下 的 imx_v7_mfg_defconfig 重 新 复 制 一 份 命 名 为imx_alientek_emmc_defconfig命令如下cd arch/arm/configs cp imx_v7_mfg_defconfig imx_alientek_emmc_defconfig打开 imx_alientek_emmc_defconfig 文件找到“CONFIG_ARCH_MULTI_V6y”这一行将其屏蔽掉因为 I.MX6ULL 是 ARMV7 架构的因此要屏蔽掉 V6 相关选项否则后面做驱动实验的时候可能会遇到驱动模块无法加载的情况。以后 imx_alientek_emmc_defconfig 就是正点原子的 EMMC 版开发板默认配置文件了以后就可以使用如下命令来配置正点原子 EMMC 版开发板对应的 Linux 内核了make imx_alientek_emmc_defconfig2.2、添加开发板对应的设备树文件进入目录 arch/arm/boot/dts 中复制一份 imx6ull-14x14-evk.dts然后将其重命名为 imx6ull-alientek-emmc.dts.dts是设备树文件编译linux的时候会将其编译成.dtb文件命令如下cd arch/arm/boot/dts cp imx6ull-14x14-evk.dts imx6ull-alientek-emmc.dts修改arch/arm/dts/Makefile文件添加开发板设备树文件########## arch/arm/boot/dts/Makefile代码段 ########## dtb-$(CONFIG_SOC_IMX6ULL) \imx6ull-14x14-ddr3-arm2.dtb \imx6ull-14x14-ddr3-arm2-adc.dtb .………..imx6ull-14x14-evk-usb-certi.dtb \imx6ull-alientek-emmc.dtb .……….. 2.3、编译测试我们可以创建一个编译脚本imx6ull_alientek_emmc.sh#!/bin/sh make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- distclean make ARCHarm CROSS_COMPILEarm-linux-gnueabihfimx_alientek_emmc_defconfig make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- menuconfig make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- all -j16执行shell脚本chmod 777 imx6ull_alientek_emmc.sh //给予可执行权限 ./imx6ull_alientek_emmc.sh //执行 shell 脚本编译内核启动开发板tftp 80800000 zImage tftp 83000000 imx6ull-alientek-emmc.dtb bootz 80800000 – 830000003、CPU主频和网络驱动修改3.1、CPU主频修改开发板主频是792MHz输入命令查看cpu信息cat /proc/cpuinfoBogoMIPS 是 Linux 系统中衡量处理器运行速度的一个“尺子”处理器性能越强主频越高BogoMIPS 值就越大。BogoMIPS 只是粗略的计算 CPU 性能并不十分准确。但是我们可以通过 BogoMIPS 值来大致的判断当前处理器的性能。3.2、使能8线EMMC驱动IMX6UL-ALPHA开发板上的EMMC采用8位数据线而Linux内核里的4线模式所以可以以通过修改为8线模式来提高运行速度直接修改设备树即可打开imx6ull0-alientek-emmc.dts找到如下代码usdhc2 { pinctrl-names default; pinctrl-0 pinctrl_usdhc2; non-removable; status okay; };修改后的代码usdhc2 { pinctrl-names default, state_100mhz, state_200mhz; pinctrl-0 pinctrl_usdhc2_8bit; pinctrl-1 pinctrl_usdhc2_8bit_100mhz; pinctrl-2 pinctrl_usdhc2_8bit_200mhz; bus-width 8; non-removable; status okay; };3.3、网络驱动修改在设备树源码文件中找到如下代码段此处SNVS_TAMPER7/8两个引脚被初始化为了SPI4的IO所以需要删除########## imx6ull-alientek-emmc.dts 代码段 ########## pinctrl_spi4: spi4grp {fsl,pins MX6ULL_PAD_BOOT_MODE0GPIO5_IO10 0x70a1MX6ULL_PAD_BOOT_MODE1GPIO5_IO11 0x70a1# MX6ULL_PAD_SNVS_TAMPER7GPIO5_IO07 0x70a1 #删除此行# MX6ULL_PAD_SNVS_TAMPER8GPIO5_IO08 0x80000000 #删除此行; }; 在设备树源码文件中找到如下代码段此处SNVS_TAMPER7/8两个引脚被设置为了SPI4的功能IO所以需要删除########## imx6ull-alientek-emmc.dts 代码段 ########## spi4 {compatible spi-gpio;pinctrl-names default;pinctrl-0 pinctrl_spi4;

pinctrl-assert-gpios gpio5 8 GPIO_ACTIVE_LOW; #删除此行

…… ……# cs-gpios gpio5 7 0; #删除此行 }; 在设备树源码文件中找到名为“iomuxc_snvs”节点在里面添加网络复位引脚配置信息########## imx6ull-alientek-emmc.dts 代码段 ########## iomuxc_snvs {pinctrl-names default_snvs;pinctrl-0 pinctrl_hog_2;imx6ul-evk {…… ……# enet1 复位配置pinctrl_enet1_reset: enet1resetgrp {fsl,pins # used for enet1 reset #MX6ULL_PAD_SNVS_TAMPER7GPIO5_IO07 0x10B0;};#enet2 复位配置pinctrl_enet2_reset: enet2resetgrp {fsl,pins # used for enet2 reset #MX6ULL_PAD_SNVS_TAMPER8GPIO5_IO08 0x10B0;};}; }; 在设备树源码文件中找到如下代码段将ENET1和ENET2的网络时钟引脚的电气属性值由0x4001b031默认值改为0x4001b009########## imx6ull-alientek-emmc.dts 代码段 ########## pinctrl_enet1: enet1grp {fsl,pins MX6UL_PAD_ENET1_RX_ENENET1_RX_EN 0x1b0b0MX6UL_PAD_ENET1_RX_ERENET1_RX_ER 0x1b0b0MX6UL_PAD_ENET1_RX_DATA0ENET1_RDATA00 0x1b0b0MX6UL_PAD_ENET1_RX_DATA1ENET1_RDATA01 0x1b0b0MX6UL_PAD_ENET1_TX_ENENET1_TX_EN 0x1b0b0MX6UL_PAD_ENET1_TX_DATA0ENET1_TDATA00 0x1b0b0MX6UL_PAD_ENET1_TX_DATA1ENET1_TDATA01 0x1b0b0MX6UL_PAD_ENET1_TX_CLKENET1_REF_CLK1 0x4001b009 #默认值为0x4001b031; };pinctrl_enet2: enet2grp {fsl,pins MX6UL_PAD_GPIO1_IO07ENET2_MDC 0x1b0b0MX6UL_PAD_GPIO1_IO06ENET2_MDIO 0x1b0b0MX6UL_PAD_ENET2_RX_ENENET2_RX_EN 0x1b0b0MX6UL_PAD_ENET2_RX_ERENET2_RX_ER 0x1b0b0MX6UL_PAD_ENET2_RX_DATA0ENET2_RDATA00 0x1b0b0MX6UL_PAD_ENET2_RX_DATA1ENET2_RDATA01 0x1b0b0MX6UL_PAD_ENET2_TX_ENENET2_TX_EN 0x1b0b0MX6UL_PAD_ENET2_TX_DATA0ENET2_TDATA00 0x1b0b0MX6UL_PAD_ENET2_TX_DATA1ENET2_TDATA01 0x1b0b0MX6UL_PAD_ENET2_TX_CLKENET2_REF_CLK2 0x4001b009 #默认值为0x4001b031; }; 在设备树源码文件中找到“fec1”和“fec2”这两个节点修改其中的“pinctrl-0”属性值修改后的代码如下示########## imx6ull-alientek-emmc.dts 代码段 ########## fec1 {pinctrl-names default;pinctrl-0 pinctrl_enet1pinctrl_enet1_reset;phy-mode rmii;……status okay; };fec2 {pinctrl-names default;pinctrl-0 pinctrl_enet2pinctrl_enet2_reset;phy-mode rmii;…… }; 在设备树源码文件中找到如下代码段设置ENET1的LAN8720A地址0x0设置ENET2的LAN8720A地址0x1以及其他相关设置修改后的代码如下示########## imx6ull-alientek-emmc.dts 代码段 ########## fec1 {pinctrl-names default;pinctrl-0 pinctrl_enet1pinctrl_enet1_reset;phy-mode rmii;phy-handle ethphy0;phy-reset-gpios gpio5 7 GPIO_ACTIVE_LOW; #添加了ENET1复位引脚低电平有效phy-reset-duration 200; #复位低电平持续时间为200msstatus okay; };fec2 {pinctrl-names default;pinctrl-0 pinctrl_enet2pinctrl_enet2_reset;phy-mode rmii;phy-handle ethphy1;phy-reset-gpios gpio5 8 GPIO_ACTIVE_LOW; #添加了ENET2复位引脚低电平有效phy-reset-duration 200; #复位低电平持续时间为200msstatus okay;mdio {#address-cells 1;#size-cells 0;ethphy0: ethernet-phy0 { #ethernet-phy后面的数字式PHY的地址compatible ethernet-phy-ieee802.3-c22;#表明PHY芯片是SMSC公司的Linux内核会找到SMSC的PHY芯片驱动来驱动LAN8720Asmsc,disable-energy-detect; reg 0; #也表示PHY地址};ethphy1: ethernet-phy1 { #ethernet-phy后面的数字式PHY的地址compatible ethernet-phy-ieee802.3-c22;#表明PHY芯片是SMSC公司的Linux内核会找到SMSC的PHY芯片驱动来驱动LAN8720Asmsc,disable-energy-detect;reg 1;};}; }; 要 在 I.MX6ULL 上 使 用 LAN8720A 需 要 修 改 一 下 Linux 内 核 源 码 打 开drivers/net/ethernet/freescale/fec_main.c找到函数 fec_probe在 fec_probe 中加入如下代码static int fec_probe(struct platform_device *pdev) {struct fec_enet_private *fep;struct fec_platform_data *pdata;struct net_device *ndev;int i, irq, ret 0;struct resource *r;const struct of_device_id *of_id;static int dev_id;struct device_node *np pdev-dev.of_node, phy_node;int num_tx_qs;int num_rx_qs;/ 设置 MX6UL_PAD_ENET1_TX_CLK 和 MX6UL_PAD_ENET2_TX_CLK* 这两个 IO 的复用寄存器的 SION 位为 1,以下为添加的代码 */void __iomem *IMX6U_ENET1_TX_CLK;void __iomem *IMX6U_ENET2_TX_CLK;IMX6U_ENET1_TX_CLK ioremap(0X020E00DC, 4);writel(0X14, IMX6U_ENET1_TX_CLK);IMX6U_ENET2_TX_CLK ioremap(0X020E00FC, 4);writel(0X14, IMX6U_ENET2_TX_CLK);……return ret; } 输入“make menuconfig”打开图形化配置解密选择使能LAN8720A的驱动路径如下- Device Drivers - Network device support - PHY Device support and infrastructure - Drivers for SMSC PHYs在 Linux 中对 LAN8720A 进行一次软复位找到LAN8720A的驱动文件 “drivers/net/phy/smsc.c”在函数“smsc_phy_reset”中添加LAN8720A复位代码修改后的代码如下static int smsc_phy_reset(struct phy_device *phydev){int err, phy_reset;int msec 1;struct device_node np;int timeout 50000;if(phydev-addr 0) / 获取FEC1网卡对应的设备节点 / {np of_find_node_by_path(/soc/aips-bus02100000/ethernet02188000);if(np NULL) {return -EINVAL;}}if(phydev-addr 1) / 获取FEC2网卡对应的设备节点 / {np of_find_node_by_path(/soc/aips-bus02000000/ethernet020b4000);if(np NULL) {return -EINVAL;}}//从设备树中获取复位时间err of_property_read_u32(np, phy-reset-duration, msec);/ A sane reset duration should not be longer than 1s /if (!err msec 1000)msec 1;//从设备树中获取复位IOphy_reset of_get_named_gpio(np, phy-reset-gpios, 0);if (!gpio_is_valid(phy_reset))return;//设置PHY的复位IO复位LAN8720Agpio_direction_output(phy_reset, 0);gpio_set_value(phy_reset, 0);msleep(msec);gpio_set_value(phy_reset, 1);int rc phy_read(phydev, MII_LAN83C185_SPECIAL_MODES);if (rc 0)return rc;/ If the SMSC PHY is in power down mode, then set it* in all capable mode before using it./if ((rc MII_LAN83C185_MODE_MASK) MII_LAN83C185_MODE_POWERDOWN) {/ set all capable mode and reset the phy /rc | MII_LAN83C185_MODE_ALL;phy_write(phydev, MII_LAN83C185_SPECIAL_MODES, rc);}//未修改之前在上面的函数里面只有Powerdown模式时才会软复位LAN8720A//此处将其移出来这样每次调用smsc_phy_reset函数LAN8720A都会被软复位phy_write(phydev, MII_BMCR, BMCR_RESET);/ wait end of reset (max 500 ms) */do {udelay(10);if (timeout– 0)return -1;rc phy_read(phydev, MII_BMCR);} while (rc BMCR_RESET);return 0; } 因为smsc_phy_reset函数中用到了gpio_direction_output和gpio_set_value函数所以需要在“smsc.c”中添加如下头文件#include linux/of_gpio.h #include linux/io.h 网络驱动测试修改好设备树和内核后重新编译下载并启动开发板后使用如下步骤进行测试输入ifconfig -a来查看开发板中存在的网卡输入ifconfig eth0 up和ifconfig eth1 up命令打开eth0ENET2和eth1ENET1使用ifconfig eth0 192.168.10.51和ifconfig eth0 192.168.10.52命令配置网卡IP地址。配置成功后ping以下Ubuntu主机192.168.10.100ping成功说明网络驱动修改成功4、内核移植总结一般情况下设计自已的硬件时都会参考半导体厂商官方的开发板在半导体厂商维护的Linux内核中查找可以参考的板子半导体厂商官方开发板编译出参考板子对应的zImage和.dtb文件尝试在自已的板子上启动大部分情况下会启动起来如果不能的话就需要调试Linux内核修改相应的驱动NAND/EMMC/SD卡等内核已经提供重点是网络驱动需要根据自已的外设PHY芯片设置复位引脚、地址信息等Linux内核启动以后需要根文件系统如果没有的话系统会崩溃