El proceso de trasplante del uboot oficial de NXP al controlador de 3 redes de la placa de desarrollo ALPHA

Luego, el archivo uboot después del trasplante de LCD, el chip PHY utilizado por la placa de desarrollo de átomo puntual es LAN8720A , no es difícil seguir el video tutorial y el trasplante de PDF, es necesario prestar atención a la configuración de la dirección IP uboot y la configuración del modo de enlace de red de la máquina virtual, lo que me llevó a mucho tiempo Bajo la guía de un amigo, hice ping a Ubuntu en la máquina virtual.
Condición 1. uboot y la computadora deben estar en la misma red de área local o conectadas al mismo enrutador. Hago ping a la máquina virtual a través de la red; parece que los primeros tres campos de las tres direcciones IP de la computadora, la máquina virtual Ubuntu y la placa uboot, Para que sea la misma, es decir, la IP debe estar en el mismo campo;
Condición 2. El modo de red de la máquina virtual debe establecerse (automáticamente) en modo puente. No se menciona la configuración específica. Búsquelo usted mismo, otros modos no están claros.
Sólo cuando el entorno de red cumple con estas dos condiciones, existe la posibilidad de hacer ping. Otros dispositivos pueden fallar al hacer ping a Uboot, pero Uboot ping puede hacer ping a otros dispositivos. De todos modos, es muy extraño. . .
Principalmente en 3 pasos principales del trasplante:

1. Elimina el código relacionado 74LV595 original de NXP uboot

La placa de Punctual Atom no usa 74LV595, principalmente porque el código relacionado con 74LV595 ocupa el pin de reinicio de LAN8720A. Por supuesto, debemos prestar atención al uso del pin al diseñar la placa nosotros mismos;

  1. Busque su propio archivo de nivel de placa, el código de 74LV595 está en mx6ull_xxx_emmc.c , busque la definición de pin de 74LV595 en la línea 91 , elimine la definición de pin de 74;
#define IOX_SDI IMX_GPIO_NR(5, 10)
#define IOX_STCP IMX_GPIO_NR(5, 7)
#define IOX_SHCP IMX_GPIO_NR(5, 11)
#define IOX_OE IMX_GPIO_NR(5, 8)
  1. Para mayor comodidad, agregue la definición de E / S de reinicio del chip de red (aquí, la definición de E / S de reinicio de atómico puntual);
#define ENET1_RESET IMX_GPIO_NR(5, 7)
#define ENET2_RESET IMX_GPIO_NR(5, 8)
  1. Busque la línea 96, elimine la estructura estática iomux_v3_cfg_t const iox_pads [];
static iomux_v3_cfg_t const iox_pads[] = {
    
    
	/* IOX_SDI */
 	MX6_PAD_BOOT_MODE0__GPIO5_IO10 | MUX_PAD_CTRL(NO_PAD_CTRL),
 	/* IOX_SHCP */
 	MX6_PAD_BOOT_MODE1__GPIO5_IO11 | MUX_PAD_CTRL(NO_PAD_CTRL),
 	/* IOX_STCP */
 	MX6_PAD_SNVS_TAMPER7__GPIO5_IO07 | MUX_PAD_CTRL(NO_PAD_CTRL),
 	/* IOX_nOE */
 	MX6_PAD_SNVS_TAMPER8__GPIO5_IO08 | MUX_PAD_CTRL(NO_PAD_CTRL),
 };
  1. Aún encuentre las funciones iox74lv_init () y iox74lv_se () en la línea 136 en el archivo mx6ull_xxx_emmc.c , elimínelas o comentelas ;
static void iox74lv_init(void)
{
    
    
int i;
gpio_direction_output(IOX_OE, 0);
for (i = 7; i >= 0; i--) {
    
    
gpio_direction_output(IOX_SHCP, 0);
gpio_direction_output(IOX_SDI, seq[qn_output[i]][0]);
udelay(500);
gpio_direction_output(IOX_SHCP, 1);
udelay(500);
}
......
/*
* shift register will be output to pins
*/
gpio_direction_output(IOX_STCP, 1);
};
void iox74lv_set(int index)
{
    
    
int i;
for (i = 7; i >= 0; i--) {
    
    
gpio_direction_output(IOX_SHCP, 0);
if (i == index)
gpio_direction_output(IOX_SDI, seq[qn_output[i]][0]);
else
gpio_direction_output(IOX_SDI, seq[qn_output[i]][1]);
udelay(500);
gpio_direction_output(IOX_SHCP, 1);
udelay(500);
}
......
/*
* shift register will be output to pins
*/
gpio_direction_output(IOX_STCP, 1);
};
  1. Busque la función board_init () en la línea 737 y elimine las siguientes dos oraciones:
int board_init(void)
{
    
    
......
imx_iomux_v3_setup_multiple_pads(iox_pads, ARRAY_SIZE(iox_pads));
iox74lv_init();
......
return 0;
}

2. Configure los códigos relacionados con LAN8720A

Se ha definido el pin de reinicio del chip, así que no lo repetiré aquí;
5. Abra include / configs / mx6ull_xxx_emmc.h y busque la línea 333 de la declaración de definición de dirección del chip de red:

 #define CONFIG_FEC_ENET_DEV 1

#if (CONFIG_FEC_ENET_DEV == 0)
#define IMX_FEC_BASE ENET_BASE_ADDR
#define CONFIG_FEC_MXC_PHYADDR 0x2
#define CONFIG_FEC_XCV_TYPE RMII
#elif (CONFIG_FEC_ENET_DEV == 1)
#define IMX_FEC_BASE ENET2_BASE_ADDR
#define CONFIG_FEC_MXC_PHYADDR 0x1

#endif

Cambie la dirección del chip de interfaz de red 1 ( CONFIG_FEC_MXC_PHYADDR ) a: 0x0

 #if (CONFIG_FEC_ENET_DEV == 0)
 #define IMX_FEC_BASE ENET_BASE_ADDR
 #define CONFIG_FEC_MXC_PHYADDR 0x0
 #define CONFIG_FEC_XCV_TYPE RMII
 #elif (CONFIG_FEC_ENET_DEV == 1)
 #define IMX_FEC_BASE ENET2_BASE_ADDR
 #define CONFIG_FEC_MXC_PHYADDR 0x1
  1. Vuelva al archivo mx6ull_alientek_emmc.c, busque las 553 líneas de estructuras de E / S de red fec1_pads y fec2_pads , agregue E / S de reinicio;
    estructura de red 1
static iomux_v3_cfg_t const fec1_pads[] = {
    
    
MX6_PAD_GPIO1_IO06__ENET1_MDIO | MUX_PAD_CTRL(MDIO_PAD_CTRL),
MX6_PAD_GPIO1_IO07__ENET1_MDC | MUX_PAD_CTRL(ENET_PAD_CTRL),
......
MX6_PAD_ENET1_RX_ER__ENET1_RX_ER | MUX_PAD_CTRL(ENET_PAD_CTRL),
MX6_PAD_ENET1_RX_EN__ENET1_RX_EN | MUX_PAD_CTRL(ENET_PAD_CTRL),
};

Agregar restablecer IO GPIO5_IO07

MX6_PAD_SNVS_TAMPER7__GPIO5_IO07 | MUX_PAD_CTRL(NO_PAD_CTRL),

Estructura de la red 2

static iomux_v3_cfg_t const fec2_pads[] = {
    
    
MX6_PAD_GPIO1_IO06__ENET2_MDIO | MUX_PAD_CTRL(MDIO_PAD_CTRL),
MX6_PAD_GPIO1_IO07__ENET2_MDC | MUX_PAD_CTRL(ENET_PAD_CTRL),
......
MX6_PAD_ENET2_RX_EN__ENET2_RX_EN | MUX_PAD_CTRL(ENET_PAD_CTRL),
MX6_PAD_ENET2_RX_ER__ENET2_RX_ER | MUX_PAD_CTRL(ENET_PAD_CTRL),
};

Agregar restablecer IO GPIO5_IO08

MX6_PAD_SNVS_TAMPER8__GPIO5_IO08 | MUX_PAD_CTRL(NO_PAD_CTRL)
  1. Continúe buscando la función 583 setup_iomux_fec en el archivo mx6ull_alientek_emmc.c,
static void setup_iomux_fec(int fec_id)
{
    
    
  if (fec_id == 0)
	imx_iomux_v3_setup_multiple_pads(fec1_pads,
	ARRAY_SIZE(fec1_pads));
  else
	imx_iomux_v3_setup_multiple_pads(fec2_pads,
	ARRAY_SIZE(fec2_pads));
}

Agregue una declaración de restablecimiento de hardware y cámbiela a:

tatic void setup_iomux_fec(int fec_id)
{
    
    
	if (fec_id == 0)
	{
    
    
		imx_iomux_v3_setup_multiple_pads(fec1_pads,
						 ARRAY_SIZE(fec1_pads));
		gpio_direction_output(ENET1_RESET, 1);
		gpio_set_value(ENET1_RESET, 0);
		mdelay(20);
		gpio_set_value(ENET1_RESET, 1);
	}
	else
	{
    
    
		imx_iomux_v3_setup_multiple_pads(fec2_pads,
						 ARRAY_SIZE(fec2_pads));
		gpio_direction_output(ENET2_RESET, 1);
		gpio_set_value(ENET2_RESET, 0);
		mdelay(20);
		gpio_set_value(ENET2_RESET, 1);
	}
}

Preste atención al número de pin;

3. Modifique el archivo drivers / net / phy / phy.c

  1. Abra phy.c y busque la función genphy_update_link , que es una función general del controlador PHY. Esta función se utiliza para actualizar el estado de conexión y la velocidad de la PHY. En su lugar, agregue el siguiente código:
int genphy_update_link(struct phy_device *phydev)
{
    
    
  unsigned int mii_reg;

  //#ifdef CONFIG_PHY_SMSC
  static int lan8720_flag = 0;
  int bmcr_reg = 0;
  if (lan8720_flag == 0) 
    {
    
    
      bmcr_reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR);
	  phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, BMCR_RESET);//软件复位
	  while(phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR) & 0X8000)//等待复位完成
	  {
    
    
	     udelay(100);
      }
	phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, bmcr_reg);
	lan8720_flag = 1;
   }
  //#endif

/*
* Wait if the link is up, and autonegotiation is in progress
* (ie - we're capable and it's not done)
*/
243 mii_reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMSR);
......

return 0;
}

Compilación condicional ( #ifdef CONFIG_PHY_SMSC ) Lo intenté, pero no parece funcionar.

Finalmente grabe en la tarjeta SD e imprima la información a través del puerto serial Si ve Net: FEC1 , significa que la configuración del controlador de red es exitosa.

4. Establecer variables de entorno de red uboot

comando de referencia uboot

setenv ipaddr 192.168.1.55 //开发板 IP 地址,注意前三个字段与电脑要相同
setenv ethaddr 00:a4:1f:04:d2:35 //开发板网卡 MAC 地址,不和其他网络设备冲突就行
setenv gatewayip 192.168.1.1 //开发板默认网关
setenv netmask 255.255.255.0 //开发板子网掩码
setenv serverip 192.168.1.250 //服务器地址,也就是 Ubuntu 地址
saveenv //保存环境变量

Luego puede intentar hacer ping al Ubuntu de la máquina virtual, debería tener éxito.

Supongo que te gusta

Origin blog.csdn.net/BBDS1ASD/article/details/108699774
Recomendado
Clasificación