@@ -321,7 +321,10 @@ impl Runner {
321321 self . ctx . shell_run_cmd ( & cmd) ?;
322322 }
323323
324+ let mut net_ok = false ;
325+
324326 let mut uboot = handle. join ( ) . unwrap ( ) ?;
327+ uboot. set_env ( "autoload" , "yes" ) ?;
325328
326329 if let Some ( ref ip) = ip_string
327330 && let Ok ( output) = uboot. cmd ( "net list" )
@@ -334,13 +337,8 @@ impl Runner {
334337
335338 info ! ( "Board network ok" ) ;
336339
337- if let Some ( ref board_ip) = self . config . net . as_ref ( ) . unwrap ( ) . board_ip {
338- uboot. set_env ( "ipaddr" , board_ip) ?;
339- } else {
340- uboot. cmd ( "dhcp" ) ?;
341- }
342-
343340 uboot. set_env ( "serverip" , ip. clone ( ) ) ?;
341+ net_ok = true ;
344342 }
345343
346344 let mut fdt_load_addr = None ;
@@ -354,30 +352,34 @@ impl Runner {
354352 ramfs_load_addr = Some ( addr as u64 ) ;
355353 }
356354
357- let loadaddr = if let Ok ( addr) = uboot. env_int ( "loadaddr" ) {
358- info ! ( "Found $loadaddr: {addr:#x}" ) ;
355+ let kernel_entry = if let Some ( entry) = self . config . kernel_load_addr_int ( ) {
356+ info ! ( "Using configured kernel load address: {entry:#x}" ) ;
357+ entry
358+ } else if let Ok ( entry) = uboot. env_int ( "kernel_addr_r" ) {
359+ info ! ( "Using $kernel_addr_r as kernel entry: {entry:#x}" ) ;
360+ entry as u64
361+ } else if let Ok ( entry) = uboot. env_int ( "loadaddr" ) {
362+ info ! ( "Using $loadaddr as kernel entry: {entry:#x}" ) ;
363+ entry as u64
364+ } else {
365+ return Err ( anyhow ! ( "Cannot determine kernel entry address" ) ) ;
366+ } ;
367+
368+ let fit_loadaddr = if let Ok ( addr) = uboot. env_int ( "kernel_comp_addr_r" ) {
369+ info ! ( "image load to kernel_comp_addr_r: {addr:#x}" ) ;
359370 addr as u64
360- } else if let Ok ( addr) = uboot. env_int ( "kernel_comp_addr_r" ) {
361- uboot. set_env ( "loadaddr" , format ! ( "{addr:#x}" ) ) ?;
362- info ! ( "Set $loadaddr to kernel_comp_addr_r: {addr:#x}" ) ;
371+ } else if let Ok ( addr) = uboot. env_int ( "kernel_addr_c" ) {
372+ info ! ( "image load to kernel_addr_c: {addr:#x}" ) ;
363373 addr as u64
364374 } else {
365- let addr = uboot. env_int ( "kernel_addr_c" ) ? as u64 ;
366- uboot. set_env ( "loadaddr" , format ! ( "{addr:#x}" ) ) ?;
367- info ! ( "Set $loadaddr to kernel_addr_c: {addr:#x}" ) ;
375+ let addr = ( kernel_entry + 0x02000000 ) & 0xffff_ffff_ff00_0000 ;
376+ info ! ( "No kernel_comp_addr_r or kernel_addr_c, use calculated address: {addr:#x}" ) ;
368377 addr
369378 } ;
370379
371- let kernel_entry = if let Some ( entry) = self . config . kernel_load_addr_int ( ) {
372- info ! ( "Using configured kernel load address: {entry:#x}" ) ;
373- entry
374- } else {
375- uboot
376- . env_int ( "kernel_addr_r" )
377- . expect ( "kernel_addr_r not found" ) as u64
378- } ;
380+ uboot. set_env ( "loadaddr" , format ! ( "{:#x}" , fit_loadaddr) ) ?;
379381
380- info ! ( "fitimage loadaddr: {loadaddr :#x}" ) ;
382+ info ! ( "fitimage loadaddr: {fit_loadaddr :#x}" ) ;
381383 info ! ( "kernel entry: {kernel_entry:#x}" ) ;
382384 let dtb = self . config . dtb_file . clone ( ) ;
383385 if let Some ( ref dtb_file) = dtb {
@@ -396,18 +398,34 @@ impl Runner {
396398 )
397399 . await ?;
398400
399- if self . config . net . is_some ( ) {
400- info ! ( "TFTP upload FIT image to board..." ) ;
401- let filename = fitimage. file_name ( ) . unwrap ( ) . to_str ( ) . unwrap ( ) ;
401+ let fitname = fitimage. file_name ( ) . unwrap ( ) . to_str ( ) . unwrap ( ) ;
402402
403- let tftp_cmd = format ! ( "tftp {filename}" ) ;
404- uboot. cmd ( & tftp_cmd) ?;
405- uboot. cmd_without_reply ( "bootm" ) ?;
406- } else {
407- info ! ( "No TFTP config, using loady to upload FIT image..." ) ;
408- Self :: uboot_loady ( & mut uboot, loadaddr as usize , fitimage) ;
409- uboot. cmd_without_reply ( "bootm" ) ?;
410- }
403+ let bootcmd =
404+ if let Some ( ref board_ip) = self . config . net . as_ref ( ) . and_then ( |e| e. board_ip . clone ( ) ) {
405+ uboot. set_env ( "ipaddr" , board_ip) ?;
406+ format ! ( "tftp {fitname} && bootm" , )
407+ } else if net_ok {
408+ format ! ( "dhcp {fitname} && bootm" , )
409+ } else {
410+ info ! ( "No TFTP config, using loady to upload FIT image..." ) ;
411+ Self :: uboot_loady ( & mut uboot, fit_loadaddr as usize , fitimage) ;
412+ "bootm" . to_string ( )
413+ } ;
414+
415+ info ! ( "Booting kernel with command: {}" , bootcmd) ;
416+ uboot. cmd_without_reply ( & bootcmd) ?;
417+ // if self.config.net.is_some() {
418+ // info!("TFTP upload FIT image to board...");
419+ // let filename = fitimage.file_name().unwrap().to_str().unwrap();
420+
421+ // let tftp_cmd = format!("tftp {filename}");
422+ // uboot.cmd(&tftp_cmd)?;
423+ // uboot.cmd_without_reply("bootm")?;
424+ // } else {
425+ // info!("No TFTP config, using loady to upload FIT image...");
426+ // Self::uboot_loady(&mut uboot, fit_loadaddr as usize, fitimage);
427+ // uboot.cmd_without_reply("bootm")?;
428+ // }
411429
412430 let tx = uboot. tx . take ( ) . unwrap ( ) ;
413431 let rx = uboot. rx . take ( ) . unwrap ( ) ;
0 commit comments