From: Jérémie D. <Ba...@us...> - 2010-02-11 16:02:35
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "krobot". The branch, master has been updated via 9a1b10ff61b5e18787f09759fe14c1d2aefb7d09 (commit) via ba0eee6c0452eaf35f96561b4734103a2088b372 (commit) from 5dfa179cb90bb249bdbccdf7d1e18818a9854581 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 9a1b10ff61b5e18787f09759fe14c1d2aefb7d09 Author: Jérémie Dimino <je...@di...> Date: Thu Feb 11 17:01:43 2010 +0100 Reorganisation of the soure tree commit ba0eee6c0452eaf35f96561b4734103a2088b372 Author: Jérémie Dimino <je...@di...> Date: Thu Feb 11 15:32:37 2010 +0100 use a custom bus daemon ----------------------------------------------------------------------- Changes: diff --git a/PC_Mainboard/Makefile b/PC_Mainboard/Makefile new file mode 100644 index 0000000..56af001 --- /dev/null +++ b/PC_Mainboard/Makefile @@ -0,0 +1,23 @@ +# Makefile +# -------- +# Copyright : (c) 2009, Jeremie Dimino <je...@di...> +# Licence : BSD3 +# +# This file is a part of [kro]bot. + +PREFIX=/usr/local + +OC = ocamlbuild +OF = ocamlfind + +ifeq ($(TERM),dumb) +OC += -classic-display +endif + +.PHONY: all +all: + $(OC) all + +.PHONY: clean +clean: + $(OC) -clean diff --git a/PC_Mainboard/README b/PC_Mainboard/README index 1481106..a595631 100644 --- a/PC_Mainboard/README +++ b/PC_Mainboard/README @@ -1,5 +1,22 @@ -* "daemons" contient les processus lancés au niveau système qui font - l'interfaçage entre les cartes +Organisation des dossiers: -* "clients" contient des utilitaires, l'intelligence artificielle, - l'interface web, ... +* "card_tools" contient des outils pour les cartes usb, notamment pour + flasher les firmwares + +* "clients" contient les divers programmes pour monitorer et + controller le robot + +* "common" contient les modules partagés par plusieurs composantes du + robot + +* "driver" contient le driver qui accède au cartes usb + +* "lib_krobot" contient la librairie cliente pour utiliser le robot, + qui se connecte au driver via D-Bus + +* "services" contient des services tels que l'arrêt des moteurs en cas + de colision ou le logging d'un match + +* "tools" contient divers outils + +* "www" contient une interface web pour le krobot diff --git a/PC_Mainboard/_tags b/PC_Mainboard/_tags new file mode 100644 index 0000000..103ccce --- /dev/null +++ b/PC_Mainboard/_tags @@ -0,0 +1,57 @@ +# -*- conf -*- + +"common": include +"lib_krobot": include + +# +------------------------------------------------------------------+ +# | Krobot library | +# +------------------------------------------------------------------+ + +<lib_krobot/**/*.ml>: syntax_camlp4o, pkg_lwt.syntax, pkg_lwt.syntax.log, pkg_obus.syntax +<lib_krobot/**>: pkg_lwt.unix, pkg_obus + +# +------------------------------------------------------------------+ +# | Card tools | +# +------------------------------------------------------------------+ + +<card_tools/**/*.ml>: syntax_camlp4o, pkg_lwt.syntax, pkg_lwt.syntax.log +<card_tools/**>: thread, pkg_usb, pkg_lwt.unix + +# +------------------------------------------------------------------+ +# | Clients | +# +------------------------------------------------------------------+ + +<clients/**/*.ml>: syntax_camlp4o, pkg_lwt.syntax, pkg_lwt.syntax.log, pkg_obus.syntax +<clients/**>: pkg_lwt.unix, pkg_obus +<clients/joy_control.*>: pkg_sdl +<clients/controller.*>: pkg_lwt.text +<clients/script_lexer.*>: pkg_text +<clients/script.*>: pkg_text + +# +------------------------------------------------------------------+ +# | Services | +# +------------------------------------------------------------------+ + +<services/**/*.ml>: syntax_camlp4o, pkg_lwt.syntax, pkg_lwt.syntax.log, pkg_obus.syntax +<services/**>: pkg_lwt.unix, pkg_obus + +# +------------------------------------------------------------------+ +# | Common | +# +------------------------------------------------------------------+ + +<common/types.{ml,mli}>: syntax_camlp4o, pkg_obus.syntax +<common/types.*>: pkg_obus + +# +------------------------------------------------------------------+ +# | Driver | +# +------------------------------------------------------------------+ + +<driver/**/*.ml>: syntax_camlp4o, pkg_lwt.syntax, pkg_lwt.syntax.log, pkg_obus.syntax +<driver/**>: thread, pkg_lwt.unix, pkg_obus, pkg_usb + +# +------------------------------------------------------------------+ +# | Tools | +# +------------------------------------------------------------------+ + +<tools/forward_dbus.ml>: syntax_camlp4o, pkg_lwt.syntax, pkg_lwt.syntax.log, pkg_obus.syntax +<tools/forward_dbus.*>: pkg_obus diff --git a/PC_Mainboard/card-tools/Makefile b/PC_Mainboard/card-tools/Makefile deleted file mode 100644 index 8055020..0000000 --- a/PC_Mainboard/card-tools/Makefile +++ /dev/null @@ -1,36 +0,0 @@ -# Makefile -# -------- -# Copyright : (c) 2009, Jeremie Dimino <je...@di...> -# Licence : BSD3 -# -# This file is a part of [kro]bot. - -PREFIX=/usr/local - -OC = ocamlbuild -OF = ocamlfind - -ifeq ($(TERM),dumb) -OC += -classic-display -endif - -.PHONY: all -all: - $(OC) all - -.PHONY: clean -clean: - $(OC) -clean - -.PHONY: install -install: - install -m0755 _build/src/send_firmare.best $(PREFIX)/bin/send-firmware - install -m0755 _build/src/dump_memory.best $(PREFIX)/bin/dump-memory - -.PHONY: uninstall -uninstall: - rm -f $(PREFIX)/bin/send-firmware - rm -f $(PREFIX)/bin/dump-memory - -.PHONY: reinstall -reinstall: uninstall install diff --git a/PC_Mainboard/card-tools/PcInterface.h b/PC_Mainboard/card-tools/PcInterface.h deleted file mode 100644 index 6928d8e..0000000 --- a/PC_Mainboard/card-tools/PcInterface.h +++ /dev/null @@ -1,208 +0,0 @@ -/** - * @file PcInterface.h - * Fichier commun avec le programme hsur la carte m (USB PC). - * Ce fichier dnit de nombreuses constantes utilis pour le protocole - * de communication carte <-> PC. -*/ - -#ifndef PC_INTERFACE_H -#define PC_INTERFACE_H - -#define USB_VID 0x04D8 ///< Vendor ID commun aux diffntes cartes USB -#define USB_PID_USB_DEV_BOARD 0x0001 ///< Product ID de la Carte d'essais -#define USB_PID_PROXIMITY_SENSOR 0x0002 ///< Product ID de la Carte capteurs -#define USB_PID_MOTOR_CONTROLLER 0x0003 ///< Product ID de la Carte d'asservissement -#define USB_PID_ROBOT_INTERFACE 0x0004 ///< Product ID de la Carte d'actionneur -#define USB_PID_BATTERY_MONITORING 0x0005 ///< Product ID de la carte Battery Monitoring -#define USB_PID_BOOTLOADER 0x000b ///< Product ID d'une carte en mode bootloader - -// Protocole USB -#define UP_HSEQ 0 ///< Host sequence number -#define UP_DSEQ 1 ///< Device sequence number -#define UP_CMD 2 -#define UP_ERR 3 -#define UP_RES0 4 -#define UP_RES1 5 -#define UP_RES2 6 -#define UP_RES3 7 -#define UP_RES4 60 -#define UP_RES5 61 -#define UP_RES6 62 -#define UP_RES7 63 -#define UP_DATA 8 - -// Commande (premier bit) -#define CMD_RESET 0 ///< Reset du PIC -#define CMD_BOOTLOADER 1 ///< Reset du PIC en mode bootloader -#define CMD_GET 2 ///< Obtenir une information -#define CMD_RESPOND 3 ///< Rnse ne commande -#define CMD_ERR 4 ///< Envoyer une erreur -#define CMD_SEND 5 ///< Envoyer du texte -#define CMD_SET 6 ///< Dnir l't d'un parame -#define CMD_TEST 7 ///< Commande grique pour dencher une action de test -#define CMD_CALIBRATE 8 ///< Lance la calibration d'un tme [Carte capteurs] -#define CMD_AX12 9 -#define CMD_TRAJ 10 ///< Transmet une trajetoire au Krobot -#define CMD_MOTOR 11 ///< Gestion des moteurs -#define CMD_MOTOR_TOR 12 - -// CMD_GET arguments -#define GET_RESET_SOURCE 0 ///< Demande au PIC la source du Reset -#define GET_BOARD_INFO 1 ///< Demande au PIC le nom de la carte et l'auteur -#define GET_FIRMWARE_BUILD 2 ///< Demande au PIC la date et l'heure de compilation du firmware -#define GET_PORTS_CONFIG 3 ///< Demande la config TRIS des ports du PIC -#define GET_PORTS_STATE 4 ///< Demande l't des ports du PIC -#define GET_RANGEFINDER_STATE 5 ///< Demande au PIC les mesures des tmes [Carte capteurs] -#define GET_ISENS 6 ///< Demande au PIC les valeurs des courants moteurs mesur [Carte d'asservissement] -#define GET_CURRENT_POS 7 ///< Demande au PIC les positions actuelles des moteurs [Carte d'asservissement] -#define GET_RANGEFINDER_CALIBRATION 8 ///< Demande au PIC les valeurs de calibration des tmes [Carte capteurs] -#define GET_TOR_STATE 9 ///< Demande au PIC l't des capteurs de contact [Carte capteurs] -#define GET_CMP03_DATA 10 ///< Rp les infos du compas ctronique CMP03 -#define GET_CELL_VOLTAGE 11 ///< Tensions des cellules [Battery Monitoring] -#define GET_CURRENT 12 ///< Valeur instantandu courant dtar la batterie [Battery Monitoring] -#define GET_POWER_STATE 13 ///< Etat de l'alimentation de puissance (On/Off) [Battery Monitoring] -#define GET_BATTERY_STATE 14 ///< Etat des batteries (Pleine charge/Charge moyenne/Charge faible) [Battery Monitoring] - -// CMD_ERR arguments -#define ERR_UNKNOWN_CMD 1 ///< Commande inconnue -#define ERR_UNKNOWN_GET 2 ///< Demande inconnue -#define ERR_UNKNOWN_SET 3 ///< Demande inconnue -#define ERR_INVALID_RESPONSE 4 ///< Rnse invalide -#define ERR_AX12_WRONG_PACKET 5 -#define ERR_AX12_ERROR 6 -#define ERR_AX12_CHKSUM 7 -#define ERR_CMP03_NOT_RESPONDING 8 -#define ERR_ADJD_S371_NOT_RESPONDING 9 - -// CMD_SET arguments -#define SET_PORTS_CONFIG_INPUTS 0x00 ///< Dnir les entr du PIC -#define SET_PORTS_CONFIG_OUTPUTS 0x01 ///< Dnir les sorties du PIC -#define SET_PORTS_STATE_LOW 0x02 ///< Dnir les sorties 't bas du PIC -#define SET_PORTS_STATE_HIGH 0x03 ///< Dnir les sorties 't haut du PIC -#define SET_SERVO_CONFIG 0x04 ///< Dnir la config des servomoteurs -#define SET_SERVO_STATE 0x05 ///< Dnir l't des servomoteurs - -// CMD_CALIBRATE arguments -#define CAL_START 0x00 -#define CAL_CONTINUE 0x01 -#define CAL_STOP 0x02 -#define CAL_ERROR 0x03 -#define CAL_DONE 0x04 -#define CAL_PLACE_INF 0x05 -#define CAL_PLACE_30 0x06 -#define CAL_PLACE_100 0x07 - -// GET_RESET_SOURCE reponse -#define RESET_SOURCE_POR 0x01 ///< Power-on Reset -#define RESET_SOURCE_RI 0x02 ///< RESET Instruction -#define RESET_SOURCE_BOR 0x03 ///< Brown-out Reset -#define RESET_SOURCE_WDT 0x04 ///< Watchdog Time-out Reset -#define RESET_SOURCE_STKFUL 0x05 ///< Stack Full Reset -#define RESET_SOURCE_STKUNF 0x06 ///< Stack Underflow Reset -#define RESET_SOURCE_MCLR 0x07 ///< Master Clear Reset - -// CMD_AX12 -#define AX12_PING 0x01 -#define AX12_READ 0x02 -#define AX12_WRITE 0x03 -#define AX12_GOTO 0x04 -#define AX12_GET_POS 0x05 -#define AX12_GET_SPEED 0x06 -#define AX12_GET_LOAD 0x07 -#define AX12_GET_STATS 0x08 -#define AX12_WRITE_REG 0x09 -#define AX12_ACTION 0x10 - -// CMD_TRAJ -#define TRAJ_INIT 0x00 -#define TRAJ_FORWARD 0x01 -#define TRAJ_BACKWARD 0x02 -#define TRAJ_TR 0x03 -#define TRAJ_TL 0x04 -#define TRAJ_GOTO 0x05 -#define TRAJ_FINISHED 0x06 -#define TRAJ_STOP 0x07 -#define TRAJ_NEW_POSITION 0x08 -#define TRAJ_NEW_VELOCITY 0x09 -#define TRAJ_CHANGE_VELOCITY 0x0A -#define TRAJ_CONFIG 0x0B -#define TRAJ_CONFIG_DEFAULT 0x0C -#define TRAJ_START 0x0D -#define TRAJ_GET_REL_POS 0x0E -#define TRAJ_READ_CONFIG 0x0F - -#define TRAJ_NOT_COMPLETED 0x00 -#define TRAJ_COMPLETED 0x01 - -#define TRAJ_STOP_MOTOR_OFF 256 -#define TRAJ_STOP_ABRUPT 512 -#define TRAJ_STOP_SMOOTH 1024 - -// CMD_MOTOR -#define MOTOR_ENABLE 1 -#define MOTOR_DISABLE 2 -#define MOTOR_MOVE 3 - -#define MOTOR_RIGHT 0 ///< Sction du moteur de droite (moteur 1) -#define MOTOR_LEFT 1 ///< Sction du moteur de gauche (moteur 2) -#define MOTOR_BOTH 2 ///< Sction des 2 moteurs simultannt - -// XXX omplr -#define READ_VERSION 0x00 -#define READ_FLASH 0x01 -#define WRITE_FLASH 0x02 -#define ERASE_FLASH 0x03 -#define READ_EEDATA 0x04 -#define WRITE_EEDATA 0x05 -#define READ_CONFIG 0x06 -#define WRITE_CONFIG 0x07 -#define UPDATE_LED 0x32 -#define RESET 0xFF - -#define FLASH_BOOT_START 0x00 -#define FLASH_BOOT_END 0x7FF -#define FLASH_VECTOR_START 0x800 -#define FLASH_VECTOR_END 0x829 -#define FLASH_PAGE_START 0x82A -#define FLASH_PAGE_END 0x7FFF - -#define PORTA_RA0 1 -#define PORTA_RA1 2 -#define PORTA_RA2 4 -#define PORTA_RA3 8 -#define PORTA_RA4 16 -#define PORTA_RA5 32 -#define PORTA_RA6 64 - -#define PORTB_RB0 1 -#define PORTB_RB1 2 -#define PORTB_RB2 4 -#define PORTB_RB3 8 -#define PORTB_RB4 16 -#define PORTB_RB5 32 -#define PORTB_RB6 64 -#define PORTB_RB7 128 - -#define PORTC_RC0 1 -#define PORTC_RC1 2 -#define PORTC_RC2 4 -#define PORTC_RC4 16 -#define PORTC_RC5 32 -#define PORTC_RC6 64 -#define PORTC_RC7 128 - -#define PORTD_RD0 1 -#define PORTD_RD1 2 -#define PORTD_RD2 4 -#define PORTD_RD3 8 -#define PORTD_RD4 16 -#define PORTD_RD5 32 -#define PORTD_RD6 64 -#define PORTD_RD7 128 - -#define PORTE_RE0 1 -#define PORTE_RE1 2 -#define PORTE_RE2 4 -#define PORTE_RE3 8 - -#endif // PC_INTERFACE_H diff --git a/PC_Mainboard/card-tools/_tags b/PC_Mainboard/card-tools/_tags deleted file mode 100644 index e273d14..0000000 --- a/PC_Mainboard/card-tools/_tags +++ /dev/null @@ -1,4 +0,0 @@ -# -*- conf -*- - -<src/*.ml>: syntax_camlp4o, pkg_lwt.syntax -<src/*>: thread, pkg_usb diff --git a/PC_Mainboard/card-tools/myocamlbuild.ml b/PC_Mainboard/card-tools/myocamlbuild.ml deleted file mode 100644 index 0607ed1..0000000 --- a/PC_Mainboard/card-tools/myocamlbuild.ml +++ /dev/null @@ -1,146 +0,0 @@ -(* - * myocamlbuild.ml - * --------------- - * Copyright : (c) 2009, Jeremie Dimino <je...@di...> - * Licence : BSD3 - * - * This file is a part of [kro]bot. - *) - -open Printf -open Ocamlbuild_plugin - -(* +-----------------------------------------------------------------+ - | Configuration | - +-----------------------------------------------------------------+ *) - -let try_exec command = - try - let () = Command.execute ~quiet:true (Cmd(S[Sh command; Sh"> /dev/null"; Sh"2> /dev/null"])) in - true - with _ -> - false - -let () = - if not (try_exec "ocamlfind printconf") then begin - prerr_endline "ocamlfind is not available, please install it"; - exit 1 - end - -let have_native = try_exec "ocamlfind ocamlopt -version" - -let () = - let yes_no = function true -> "yes" | false -> "no" in - printf "\ -+--[ compilation options ]----------+ -| native compilation: %3s | -+-----------------------------------+ -%!" (yes_no have_native) - -(* +-----------------------------------------------------------------+ - | Ocamlfind | - +-----------------------------------------------------------------+ *) - -(* Put here packages you may use in this project: *) -let packages = [ - "type-conv"; - "type-conv.syntax"; - "camlp4"; - "camlp4.extend"; - "camlp4.lib"; - "camlp4.macro"; - "camlp4.quotations.o"; - "camlp4.quotations.r"; - "lwt"; - "lwt.unix"; - "lwt.syntax"; - "lwt.syntax.log"; - "str"; - "xmlm"; - "react"; - "usb"; - "obus"; - "obus.syntax"; - "bitstring"; - "bitstring.syntax"; -] - -(* List of available syntaxes :*) -let syntaxes = [ - "camlp4o"; - "camlp4r"; -] - -(* +-----------------------------------------------------------------+ - | Utils | - +-----------------------------------------------------------------+ *) - -let flag_all_stages_except_link tag f = - flag ["ocaml"; "compile"; tag] f; - flag ["ocaml"; "ocamldep"; tag] f; - flag ["ocaml"; "doc"; tag] f - -let flag_all_stages tag f = - flag_all_stages_except_link tag f; - flag ["ocaml"; "link"; tag] f - -let _ = - dispatch begin function - | Before_options -> - - (* override default commands by ocamlfind ones *) - let ocamlfind x = S[A"ocamlfind"; A x] in - Options.ocamlc := ocamlfind "ocamlc"; - Options.ocamlopt := ocamlfind "ocamlopt"; - Options.ocamldep := ocamlfind "ocamldep"; - (* FIXME: sometimes ocamldoc say that elements are not found - even if they are present: *) - Options.ocamldoc := S[A"ocamlfind"; A"ocamldoc"; A"-hide-warnings"] - - | After_rules -> - - (* Génération du fichier contenant les détails du protocol à - partir du fichier .h *) - rule "protocol du krobot" ~dep:"PcInterface.h" ~prod:"protocol.ml" - (fun _ _ -> - Cmd(S[Sh"awk '$1 == \"#define\" && $3 != \"\" { print \"let \" tolower($2) \" = \" $3 }' PcInterface.h > protocol.ml"])); - - (* +---------------------------------------------------------+ - | Virtual targets | - +---------------------------------------------------------+ *) - - if have_native then - rule "best" ~dep:"%.native" ~prod:"%.best" - (fun env _ -> cp (env "%.native") (env "%.best")) - else - rule "best" ~dep:"%.byte" ~prod:"%.best" - (fun env _ -> cp (env "%.byte") (env "%.best")); - - let virtual_rule name deps = - rule name ~stamp:name ~deps (fun _ _ -> Nop) - in - - virtual_rule "all" ["src/send_firmware.best"; "src/dump_memory.best"]; - - (* +---------------------------------------------------------+ - | Ocamlfind stuff | - +---------------------------------------------------------+ *) - - (* When one link an OCaml binary, one should use -linkpkg *) - flag ["ocaml"; "link"; "program"] & A"-linkpkg"; - - (* For each ocamlfind package one inject the -package option - when compiling, computing dependencies, generating - documentation and linking. *) - List.iter - (fun package -> flag_all_stages ("pkg_" ^ package) (S[A"-package"; A package])) - packages; - - (* Like -package but for extensions syntax. Morover -syntax is - useless when linking. *) - List.iter - (fun syntax -> flag_all_stages_except_link ("syntax_" ^ syntax) (S[A"-syntax"; A syntax])) - syntaxes; - - | _ -> () - end diff --git a/PC_Mainboard/card-tools/src/boardname.mli b/PC_Mainboard/card-tools/src/boardname.mli deleted file mode 100644 index 23b0032..0000000 --- a/PC_Mainboard/card-tools/src/boardname.mli +++ /dev/null @@ -1,12 +0,0 @@ -(* - * boardname.mli - * ------------- - * Copyright : (c) 2009, Stéphane Glondu <st...@gl...> - * Licence : BSD3 - * - * This file is a part of Krobot. - *) - -val get_board_name : string -> string option - (** [get_board_name dump] recherche dans le [dump] mémoire (peut - être également un fichier .hex chargé) le nom de la carte. *) diff --git a/PC_Mainboard/card-tools/src/boardname.mll b/PC_Mainboard/card-tools/src/boardname.mll deleted file mode 100644 index 30f99cf..0000000 --- a/PC_Mainboard/card-tools/src/boardname.mll +++ /dev/null @@ -1,22 +0,0 @@ -(* - * boardname.mll - * ------------- - * Copyright : (c) 2009, Stéphane Glondu <st...@gl...> - * Licence : BSD3 - * - * This file is a part of Krobot. - *) - - -let boardname_regex = ("Carte " | "Robot Interface") [^'\n']+ - -rule boardname = parse - | (boardname_regex as name) '\n' { Some name } - | _ { boardname lexbuf } - | eof { None } - -{ - let get_board_name str = - let lexbuf = Lexing.from_string str in - boardname lexbuf -} diff --git a/PC_Mainboard/card-tools/src/bootloader.ml b/PC_Mainboard/card-tools/src/bootloader.ml deleted file mode 100644 index 28044cc..0000000 --- a/PC_Mainboard/card-tools/src/bootloader.ml +++ /dev/null @@ -1,184 +0,0 @@ -(* - * bootloader.ml - * ------------- - * Copyright : (c) 2009, Stéphane Glondu <st...@gl...> - * Licence : BSD3 - * - * This file is a part of Krobot. - *) - -open Lwt -open Lwt_io - -(* Code très inspiré de kard.ml, mais mis à part car le mode de - communication avec la carte est différent (bulk au lieu - d'interrupt). *) - -type t = { - mutable is_open : bool; - (* La carte est-elle ouverte ? *) - - handle : USB.handle; - (* Handle pour le périphérique usb *) - - kernel_active : bool; - (* Est-ce qu'un driver noyau était attaché à la carte avant qu'on - l'utilise ? *) -} - -type error = - | IncompleteWrite of int * int - | IncompleteRead of int * int - | UnexpectedReply of string * string - | WriteError of string * string - -let string_of_error = function - | IncompleteWrite (a, b) -> Printf.sprintf "%d byte(s) written instead of %d" a b - | IncompleteRead (a, b) -> Printf.sprintf "%d byte(s) read instead of %d" a b - | UnexpectedReply (a, b) -> Printf.sprintf "received unexpected reply %S instead of %S" a b - | WriteError (a, b) -> Printf.sprintf "written: %S, read back: %S" a b - -exception Error of error - -let failwith e = fail (Error e) - -let close k = - if k.is_open then begin - lwt _ = USB.release_interface k.handle 0 in - lwt _ = USB.reset_device k.handle in - (*if k.kernel_active then USB.attach_kernel_driver k.handle 0;*) - (*USB.close k.handle;*) - k.is_open <- false; - return () - end else return () - -let open_card () = - let handle = USB.open_device_with - ~vendor_id:Protocol.usb_vid - ~product_id:Protocol.usb_pid_bootloader - in - let kernel_active = USB.kernel_driver_active handle 0 in - if kernel_active then USB.detach_kernel_driver handle 0; - lwt _ = USB.set_configuration handle 1 in - lwt _ = USB.claim_interface handle 0 in - let k = { is_open = true; - handle = handle; - kernel_active = kernel_active } in - let _ = Lwt_sequence.add_l (fun _ -> close k) Lwt_main.exit_hooks in - return k - -let header_length = 5 - -let put_message buffer cmd length address data = - let body_length = String.length data in - assert (String.length buffer >= header_length+body_length); - let set i n = buffer.[i] <- char_of_int n in - set 0 cmd; - assert (length < 0x100); - set 1 length; - assert (address <= 0x1000000); - set 2 (address land 0xff); - set 3 ((address lsr 8) land 0xff); - set 4 ((address lsr 16) land 0xff); - String.blit data 0 buffer 5 body_length - -let send_receive_packet k send_buffer send_length receive_buffer receive_length send_delay receive_delay = - let handle = k.handle and endpoint = 1 in - lwt sent = USB.bulk_send ~handle ~endpoint ~timeout:1. send_buffer 0 send_length in - if sent <> send_length then - failwith (IncompleteWrite (sent, send_length)) - else begin - lwt received = USB.bulk_recv ~handle ~endpoint ~timeout:3. receive_buffer 0 receive_length in - if received <> receive_length then - failwith (IncompleteRead (received, receive_length)) - else - return () - end - -let get_flash k ~address ~length = - let response_length = 64 in - let increment = response_length-header_length in - assert (increment < 256); - let send_buffer = String.create header_length in - let receive_buffer = String.create response_length in - let result_buffer = String.create length in - let rec loop offset total_length = - if total_length <= 0 then - return result_buffer - else begin - let length = min increment total_length in - let response_length = length+header_length in - let address = address+offset in - put_message send_buffer Protocol.read_flash length address ""; - lwt () = send_receive_packet k send_buffer header_length receive_buffer response_length 1. 3. in - let receive_header = String.sub receive_buffer 0 header_length in - if receive_header <> send_buffer then - failwith (UnexpectedReply (receive_header, send_buffer)) - else begin - String.blit receive_buffer header_length result_buffer offset length; - loop (offset+length) (total_length-length); - end - end - in loop 0 length - -let erase_flash k ~address ~length = - let response_length = 1 in - (* les effacements se font par blocs de 64 octets *) - let increment = 64 in - let send_buffer = String.create header_length in - let receive_buffer = String.create response_length in - let rec loop offset total_length = - if total_length <= 0 then - return () - else begin - let address = address+offset in - put_message send_buffer Protocol.erase_flash 1 address ""; - lwt () = send_receive_packet k send_buffer header_length receive_buffer response_length 1. 5. in - if int_of_char receive_buffer.[0] <> Protocol.erase_flash then - failwith (UnexpectedReply (receive_buffer, String.make 1 (char_of_int Protocol.erase_flash))) - else - loop (offset+increment) (total_length-increment); - end - in loop 0 length - -let reference = String.make 16 '\255' - -let write_flash k ~address data offset length = - let send_length = 64 and receive_length = 1 in - (* les écritures se font par blocs de 16 octets *) - let increment = 16 in - let send_buffer = String.create send_length in - let receive_buffer = String.create receive_length in - let rec loop address offset total_length = - (* address: sur le PIC, offset: dans data, total_length: taille restante *) - if total_length <= 0 then - return () - else begin - let packet = String.make increment '\255' in - String.blit data offset packet 0 (min total_length increment); - if packet = reference the n begin - (* le paquet n'a pas de contenu, on l'ignore *) - (* lwt () = printf "Skipping address 0x%06X...\n" address in *) - loop (address+increment) (offset+increment) (total_length-increment) - end else begin - (* lwt () = printf "Processing address 0x%06X...\n" address in *) - put_message send_buffer Protocol.write_flash increment address packet; - lwt () = send_receive_packet k send_buffer send_length receive_buffer receive_length 0.5 1. in - if int_of_char receive_buffer.[0] <> Protocol.write_flash then - failwith (UnexpectedReply (receive_buffer, String.make 1 (char_of_int Protocol.erase_flash))) - else begin - lwt written = get_flash k ~address ~length:increment in - if written <> packet then - failwith (WriteError (packet, written)) - else - loop (address+increment) (offset+increment) (total_length-increment) - end - end - end - in loop address offset length - -let reset_board k = - let send_buffer = String.create 64 and receive_buffer = String.create 64 in - send_buffer.[0] <- char_of_int Protocol.reset; - lwt () = send_receive_packet k send_buffer 1 receive_buffer 64 5. 5. in - return () diff --git a/PC_Mainboard/card-tools/src/dump_memory.ml b/PC_Mainboard/card-tools/src/dump_memory.ml deleted file mode 100644 index 5c746e0..0000000 --- a/PC_Mainboard/card-tools/src/dump_memory.ml +++ /dev/null @@ -1,30 +0,0 @@ -(* - * dump_memory.ml - * -------------- - * Copyright : (c) 2009, Stéphane Glondu <st...@gl...> - * Licence : BSD3 - * - * This file is a part of Krobot. - *) - -open Printf -open Lwt -open Lwt_io - -let main = - lwt k = Bootloader.open_card () in - try_lwt - lwt data = Bootloader.get_flash k ~address:0x0 ~length:0x8000 in - let msg = match Boardname.get_board_name data with - | Some s -> sprintf "Board: %S" s - | None -> "Unable to identify board!" - in - lwt () = eprintlf "%s" msg in - (if Unix.isatty Unix.stdout then hexdump else write) stdout data >> flush stdout - with - | Bootloader.Error e -> - eprintlf "%s" (Bootloader.string_of_error e) - | e -> - eprintlf "%s" (Printexc.to_string e) - -let _ = Lwt_main.run main diff --git a/PC_Mainboard/card-tools/src/hexfile.ml b/PC_Mainboard/card-tools/src/hexfile.ml deleted file mode 100644 index a667957..0000000 --- a/PC_Mainboard/card-tools/src/hexfile.ml +++ /dev/null @@ -1,112 +0,0 @@ -(* - * hexfile.ml - * ---------- - * Copyright : (c) 2009, Stéphane Glondu <st...@gl...> - * Licence : BSD3 - * - * This file is a part of Krobot. - *) - -open Lwt -open Lwt_io - -type hex_record = - | Data of int * string - | ExtendedLinearAddress of int - | EndOfFile of int - -let string_of_hexline str = - let n = String.length str in - assert (n > 0 && n mod 2 = 1 && str.[0] = ':'); - let m = n/2 in - let result = String.create m in - for i = 0 to m-1 do - let j = 2*i+1 in - result.[i] <- char_of_int (int_of_string ("0x"^(String.sub str j 2))) - done; - result - -let compute_checksum str = - let rec aux i accu = - if i < 0 then - (-accu) land 0xff - else - aux (i-1) (accu+(int_of_char str.[i])) - in aux (String.length str - 2) 0 - -let parse_line str = - let str = string_of_hexline str in - let get i = int_of_char str.[i] in - let n = String.length str in - assert (n >= 5 && compute_checksum str = int_of_char str.[n-1]); - let count = get 0 in - assert (count+5 = n); - let address = ((get 1) lsl 8) lor (get 2) in - let record_type = get 3 in - let data = String.sub str 4 count in - match record_type with - | 0x00 -> - Data (address, data) - | 0x01 -> - assert (count = 0); - EndOfFile address - | 0x04 -> - assert (count = 2 && address = 0); - let msb = int_of_char data.[0] and lsb = int_of_char data.[1] in - (* check for possible overflow *) - assert (msb land 0x80 = 0); - ExtendedLinearAddress ((msb lsl 8) lor lsb) - | _ -> assert false - -let parse_file fi le = - let ic = Lwt_io.open_file ~mode:input file in - let lines = Lwt_io.read_lines ic in - let lines = Lwt_stream.map parse_line lines in - lwt lines = Lwt_stream.get_while (fun _ -> true) lines in - lwt _ = Lwt_io.close ic in - return lines - -let print_record = function - | Data (address, data) -> - Printf.printf "DAT %04x" address; - String.iter (fun c -> Printf.printf " %02x" (int_of_char c)) data; - Printf.printf "\n" - | ExtendedLinearAddress address -> - Printf.printf "ELA %04x\n" address - | EndOfFile address -> - Printf.printf "EOF %04x\n" address - -let validate_and_copy hex addr_base buffer offset length = - assert (offset+length <= String.length buffer); - let min_address = addr_base+offset in - let max_address = min_address+length in - let addr_high = ref 0 in - let execute_record = function - | Data (address, data) -> - assert (address land 0xFFFF = address); - let address = !addr_high lor address in - if address < min_address || address >= max_address then - Printf.eprintf - "0x%04x is outside range, all bytes dropped\n" - address - else begin - let length = - let n = String.length data in - if address+n >= max_address then begin - Printf.eprintf - "some bytes at address 0x%04x are outside range (dropped)\n" - address; - max_address-address - end else n - in - let offset2 = address-addr_base in - String.blit data 0 buffer offset2 length; - end - | ExtendedLinearAddress address -> - assert (address land 0x8000 = 0); - addr_high := address lsl 16 - | EndOfFile address -> - assert (address = 0); - raise Exit - in - try List.iter execute_record hex with Exit -> () diff --git a/PC_Mainboard/card-tools/src/hexfile.mli b/PC_Mainboard/card-tools/src/hexfile.mli deleted file mode 100644 index c6fa563..0000000 --- a/PC_Mainboard/card-tools/src/hexfile.mli +++ /dev/null @@ -1,26 +0,0 @@ -(* - * hexfile.mli - * ----------- - * Copyright : (c) 2009, Stéphane Glondu <st...@gl...> - * Licence : BSD3 - * - * This file is a part of Krobot. - *) - -type hex_record = - | Data of int * string - | ExtendedLinearAddress of int - | EndOfFile of int - -val parse_file : string -> hex_record list Lwt.t - -val print_record : hex_record -> unit - (** Prints one record on standard output. *) - -val validate_and_copy : hex_record list -> int -> string -> int -> int -> unit - (** [validate_and_copy hex addr_base buffer offset length] copies - the contents of the (parsed) [hex] file to [buffer]. [offset] - and [length] denote the valid range inside [buffer] that can be - written. [addr_base] is the address [buffer] is mapped to on the - microcontroller. Bytes outside the range are ignored (and a - warning is printed on standard error. *) diff --git a/PC_Mainboard/card-tools/src/myocamlbuild.ml b/PC_Mainboard/card-tools/src/myocamlbuild.ml deleted file mode 100644 index 593f6b9..0000000 --- a/PC_Mainboard/card-tools/src/myocamlbuild.ml +++ /dev/null @@ -1,126 +0,0 @@ -(* - * myocamlbuild.ml - * --------------- - * Copyright : (c) 2009, Jeremie Dimino <je...@di...> - * Licence : BSD3 - * - * This file is a part of [kro]bot. - *) - -open Printf -open Ocamlbuild_plugin - -(* +-----------------------------------------------------------------+ - | Ocamlfind | - +-----------------------------------------------------------------+ *) - -(* Put here packages you may use in this project: *) -let packages = [ - "type-conv"; - "type-conv.syntax"; - "camlp4"; - "camlp4.extend"; - "camlp4.lib"; - "camlp4.macro"; - "camlp4.quotations.o"; - "camlp4.quotations.r"; - "lwt"; - "lwt.unix"; - "lwt.syntax"; - "lwt.syntax.log"; - "lwt.text"; - "text"; - "text.pcre"; - "str"; - "xmlm"; - "react"; - "usb"; - "obus"; - "obus.syntax"; - "bitstring"; - "bitstring.syntax"; - "sdl"; -] - -(* List of available syntaxes :*) -let syntaxes = [ - "camlp4o"; - "camlp4r"; -] - -(* +-----------------------------------------------------------------+ - | Utils | - +-----------------------------------------------------------------+ *) - -let flag_all_stages_except_link tag f = - flag ["ocaml"; "compile"; tag] f; - flag ["ocaml"; "ocamldep"; tag] f; - flag ["ocaml"; "doc"; tag] f - -let flag_all_stages tag f = - flag_all_stages_except_link tag f; - flag ["ocaml"; "link"; tag] f - -let _ = - dispatch begin function - | Before_options -> - - (* override default commands by ocamlfind ones *) - let ocamlfind x = S[A"ocamlfind"; A x] in - Options.ocamlc := ocamlfind "ocamlc"; - Options.ocamlopt := ocamlfind "ocamlopt"; - Options.ocamldep := ocamlfind "ocamldep"; - (* FIXME: sometimes ocamldoc say that elements are not found - even if they are present: *) - Options.ocamldoc := S[A"ocamlfind"; A"ocamldoc"; A"-hide-warnings"] - - | After_rules -> - - (* D-Bus drivers can see the lowlevel interfaces *) - Pathname.define_context "dbus-drivers" [ "usb" ]; - - (* Génération du fichier contenant les détails du protocol à - partir du fichier .h *) - rule "protocol du krobot" ~dep:"PcInterface.h" ~prod:"protocol.ml" - (fun _ _ -> - Cmd(S[Sh"awk '$1 == \"#define\" && $3 != \"\" { print \"let \" tolower($2) \" = \" $3 }' PcInterface.h > protocol.ml"])); - - (* +---------------------------------------------------------+ - | Virtual targets | - +---------------------------------------------------------+ *) - - let virtual_rule name deps = - rule name ~stamp:name ~deps (fun _ _ -> Nop) - in - - virtual_rule "all" [ - "lib-krobot/krobot.cma"; - "lib-krobot/krobot.cmxa"; - "tools/status.native"; - "tools/controller.native"; - "remote/forward_dbus.native"; - "tools/joy_control.native"; - ]; - - (* +---------------------------------------------------------+ - | Ocamlfind stuff | - +---------------------------------------------------------+ *) - - (* When one link an OCaml binary, one should use -linkpkg *) - flag ["ocaml"; "link"; "program"] & A"-linkpkg"; - - (* For each ocamlfind package one inject the -package option - when compiling, computing dependencies, generating - documentation and linking. *) - List.iter - (fun package -> flag_all_stages ("pkg_" ^ package) (S[A"-package"; A package])) - packages; - - (* Like -package but for extensions syntax. Morover -syntax is - useless when linking. *) - List.iter - (fun syntax -> flag_all_stages_except_link ("syntax_" ^ syntax) (S[A"-syntax"; A syntax])) - syntaxes; - - | _ -> () - end diff --git a/PC_Mainboard/card-tools/src/send_firmware.ml b/PC_Mainboard/card-tools/src/send_firmware.ml deleted file mode 100644 index 1dedd01..0000000 --- a/PC_Mainboard/card-tools/src/send_firmware.ml +++ /dev/null @@ -1,69 +0,0 @@ -(* - * send_firmware.ml - * ---------------- - * Copyright : (c) 2009, Stéphane Glondu <st...@gl...> - * Licence : BSD3 - * - * This file is a part of Krobot. - *) - -open Lwt -open Lwt_io - -let do_flash force filename = - lwt hex = Hexfile.parse_file filename in - let memory = - let buffer = String.make 0x8000 '\255' in - Hexfile.validate_and_copy hex 0x0 buffer 0 0x8000; - buffer - in - let firmware_name = Boardname.get_board_name memory in - lwt () = match firmware_name with - | Some s -> printf "Detected firmware: %S\n" s - | None -> printf "Unable to identify firmware!\n" - in - let address = 0x800 and length = 0x8000-0x800 in - lwt k = Bootloader.open_card () in - lwt () = printf "Card opened\n" in - lwt data = Bootloader.get_flash k ~address:0x0 ~length:0x8000 in - let board_name = Boardname.get_board_name data in - lwt () = match board_name with - | Some s -> printf "Detected card: %S\n" s - | None -> printf "Unable to identify card!\n" - in - lwt () = - if not force && (board_name = None || firmware_name = None || board_name <> firmware_name) then begin - lwt () = eprintf "board name and firmware name do not match, use --force\n" in - exit 1 - end else return () - in - lwt () = Bootloader.erase_flash k ~address ~length in - lwt () = printf "Flash erased\n" in - lwt () = Bootloader.write_flash k ~address memory address length in - lwt () = printf "Flashing completed\n" in - return () - -let _ = - let force = ref false in - let filename = ref None in - let speclist = [ - "--force", Arg.Set force, "Force flashing even if board id and firmware id do not match"; - ] in - Arg.parse speclist - (fun s -> - match !filename with - | None -> filename := Some s - | Some _ -> raise (Arg.Bad s)) - "Send a firmware to a board in bootloader mode"; - let filename = match !filename with - | None -> Printf.eprintf "You must specify a .hex file!\n"; exit 1 - | Some s -> s - in - Lwt_main.run - (try_lwt - do_flash !force filename - with - | Bootloader.Error e -> - eprintl (Bootloader.string_of_error e) - | e -> - eprintl (Printexc.to_string e)) diff --git a/PC_Mainboard/card_tools/boardname.mli b/PC_Mainboard/card_tools/boardname.mli new file mode 100644 index 0000000..23b0032 --- /dev/null +++ b/PC_Mainboard/card_tools/boardname.mli @@ -0,0 +1,12 @@ +(* + * boardname.mli + * ------------- + * Copyright : (c) 2009, Stéphane Glondu <st...@gl...> + * Licence : BSD3 + * + * This file is a part of Krobot. + *) + +val get_board_name : string -> string option + (** [get_board_name dump] recherche dans le [dump] mémoire (peut + être également un fichier .hex chargé) le nom de la carte. *) diff --git a/PC_Mainboard/card_tools/boardname.mll b/PC_Mainboard/card_tools/boardname.mll new file mode 100644 index 0000000..30f99cf --- /dev/null +++ b/PC_Mainboard/card_tools/boardname.mll @@ -0,0 +1,22 @@ +(* + * boardname.mll + * ------------- + * Copyright : (c) 2009, Stéphane Glondu <st...@gl...> + * Licence : BSD3 + * + * This file is a part of Krobot. + *) + + +let boardname_regex = ("Carte " | "Robot Interface") [^'\n']+ + +rule boardname = parse + | (boardname_regex as name) '\n' { Some name } + | _ { boardname lexbuf } + | eof { None } + +{ + let get_board_name str = + let lexbuf = Lexing.from_string str in + boardname lexbuf +} diff --git a/PC_Mainboard/card_tools/bootloader.ml b/PC_Mainboard/card_tools/bootloader.ml new file mode 100644 index 0000000..28044cc --- /dev/null +++ b/PC_Mainboard/card_tools/bootloader.ml @@ -0,0 +1,184 @@ +(* + * bootloader.ml + * ------------- + * Copyright : (c) 2009, Stéphane Glondu <st...@gl...> + * Licence : BSD3 + * + * This file is a part of Krobot. + *) + +open Lwt +open Lwt_io + +(* Code très inspiré de kard.ml, mais mis à part car le mode de + communication avec la carte est différent (bulk au lieu + d'interrupt). *) + +type t = { + mutable is_open : bool; + (* La carte est-elle ouverte ? *) + + handle : USB.handle; + (* Handle pour le périphérique usb *) + + kernel_active : bool; + (* Est-ce qu'un driver noyau était attaché à la carte avant qu'on + l'utilise ? *) +} + +type error = + | IncompleteWrite of int * int + | IncompleteRead of int * int + | UnexpectedReply of string * string + | WriteError of string * string + +let string_of_error = function + | IncompleteWrite (a, b) -> Printf.sprintf "%d byte(s) written instead of %d" a b + | IncompleteRead (a, b) -> Printf.sprintf "%d byte(s) read instead of %d" a b + | UnexpectedReply (a, b) -> Printf.sprintf "received unexpected reply %S instead of %S" a b + | WriteError (a, b) -> Printf.sprintf "written: %S, read back: %S" a b + +exception Error of error + +let failwith e = fail (Error e) + +let close k = + if k.is_open then begin + lwt _ = USB.release_interface k.handle 0 in + lwt _ = USB.reset_device k.handle in + (*if k.kernel_active then USB.attach_kernel_driver k.handle 0;*) + (*USB.close k.handle;*) + k.is_open <- false; + return () + end else return () + +let open_card () = + let handle = USB.open_device_with + ~vendor_id:Protocol.usb_vid + ~product_id:Protocol.usb_pid_bootloader + in + let kernel_active = USB.kernel_driver_active handle 0 in + if kernel_active then USB.detach_kernel_driver handle 0; + lwt _ = USB.set_configuration handle 1 in + lwt _ = USB.claim_interface handle 0 in + let k = { is_open = true; + handle = handle; + kernel_active = kernel_active } in + let _ = Lwt_sequence.add_l (fun _ -> close k) Lwt_main.exit_hooks in + return k + +let header_length = 5 + +let put_message buffer cmd length address data = + let body_length = String.length data in + assert (String.length buffer >= header_length+body_length); + let set i n = buffer.[i] <- char_of_int n in + set 0 cmd; + assert (length < 0x100); + set 1 length; + assert (address <= 0x1000000); + set 2 (address land 0xff); + set 3 ((address lsr 8) land 0xff); + set 4 ((address lsr 16) land 0xff); + String.blit data 0 buffer 5 body_length + +let send_receive_packet k send_buffer send_length receive_buffer receive_length send_delay receive_delay = + let handle = k.handle and endpoint = 1 in + lwt sent = USB.bulk_send ~handle ~endpoint ~timeout:1. send_buffer 0 send_length in + if sent <> send_length then + failwith (IncompleteWrite (sent, send_length)) + else begin + lwt received = USB.bulk_recv ~handle ~endpoint ~timeout:3. receive_buffer 0 receive_length in + if received <> receive_length then + failwith (IncompleteRead (received, receive_length)) + else + return () + end + +let get_flash k ~address ~length = + let response_length = 64 in + let increment = response_length-header_length in + assert (increment < 256); + let send_buffer = String.create header_length in + let receive_buffer = String.create response_length in + let result_buffer = String.create length in + let rec loop offset total_length = + if total_length <= 0 then + return result_buffer + else begin + let length = min increment total_length in + let response_length = length+header_length in + let address = address+offset in + put_message send_buffer Protocol.read_flash length address ""; + lwt () = send_receive_packet k send_buffer header_length receive_buffer response_length 1. 3. in + let receive_header = String.sub receive_buffer 0 header_length in + if receive_header <> send_buffer then + failwith (UnexpectedReply (receive_header, send_buffer)) + else begin + String.blit receive_buffer header_length result_buffer offset length; + loop (offset+length) (total_length-length); + end + end + in loop 0 length + +let erase_flash k ~address ~length = + let response_length = 1 in + (* les effacements se font par blocs de 64 octets *) + let increment = 64 in + let send_buffer = String.create header_length in + let receive_buffer = String.create response_length in + let rec loop offset total_length = + if total_length <= 0 then + return () + else begin + let address = address+offset in + put_message send_buffer Protocol.erase_flash 1 address ""; + lwt () = send_receive_packet k send_buffer header_length receive_buffer response_length 1. 5. in + if int_of_char receive_buffer.[0] <> Protocol.erase_flash then + failwith (UnexpectedReply (receive_buffer, String.make 1 (char_of_int Protocol.erase_flash))) + else + loop (offset+increment) (total_length-increment); + end + in loop 0 length + +let reference = String.make 16 '\255' + +let write_flash k ~address data offset length = + let send_length = 64 and receive_length = 1 in + (* les écritures se font par blocs de 16 octets *) + let increment = 16 in + let send_buffer = String.create send_length in + let receive_buffer = String.create receive_length in + let rec loop address offset total_length = + (* address: sur le PIC, offset: dans data, total_length: taille restante *) + if total_length <= 0 then + return () + else begin + let packet = String.make increment '\255' in + String.blit data offset packet 0 (min total_length increment); + if packet = reference then begin + (* le paquet n'a pas de contenu, on l'ignore *) + (* lwt () = printf "Skipping address 0x%06X...\n" address in *) + loop (address+increment) (offset+increment) (total_length-increment) + end else begin + (* lwt () = printf "Processing address 0x%06X...\n" address in *) + put_message send_buffer Protocol.write_flash increment address packet; + lwt () = send_receive_packet k send_buffer send_length receive_buffer receive_length 0.5 1. in + if int_of_char receive_buffer.[0] <> Protocol.write_flash then + failwith (UnexpectedReply (receive_buffer, String.make 1 (char_of_int Protocol.erase_flash))) + else begin + lwt written = get_flash k ~address ~length:increment in + if written <> packet then + failwith (WriteError (packet, written)) + else + loop (address+increment) (offset+increment) (total_length-increment) + end + end + end + in loop address offset length + +let reset_board k = + let send_buffer = String.create 64 and receive_buffer = String.create 64 in + send_buffer.[0] <- char_of_int Protocol.reset; + lwt () = send_receive_packet k send_buffer 1 receive_buffer 64 5. 5. in + return () diff --git a/PC_Mainboard/card_tools/dump_memory.ml b/PC_Mainboard/card_tools/dump_memory.ml new file mode 100644 index 0000000..5c746e0 --- /dev/null +++ b/PC_Mainboard/card_tools/dump_memory.ml @@ -0,0 +1,30 @@ +(* + * dump_memory.ml + * -------------- + * Copyright : (c) 2009, Stéphane Glondu <st...@gl...> + * Licence : BSD3 + * + * This file is a part of Krobot. + *) + +open Printf +open Lwt +open Lwt_io + +let main = + lwt k = Bootloader.open_card () in + try_lwt + lwt data = Bootloader.get_flash k ~address:0x0 ~length:0x8000 in + let msg = match Boardname.get_board_name data with + | Some s -> sprintf "Board: %S" s + | None -> "Unable to identify board!" + in + lwt () = eprintlf "%s" msg in + (if Unix.isatty Unix.stdout then hexdump else write) stdout data >> flush stdout + with + | Bootloader.Error e -> + eprintlf "%s" (Bootloader.string_of_error e) + | e -> + eprintlf "%s" (Printexc.to_string e) + +let _ = Lwt_main.run main diff --git a/PC_Mainboard/card_tools/hexfile.ml b/PC_Mainboard/card_tools/hexfile.ml new file mode 100644 index 0000000..a667957 --- /dev/null +++ b/PC_Mainboard/card_tools/hexfile.ml @@ -0,0 +1,112 @@ +(* + * hexfile.ml + * ---------- + * Copyright : (c) 2009, Stéphane Glondu <st...@gl...> + * Licence : BSD3 + * + * This file is a part of Krobot. + *) + +open Lwt +open Lwt_io + +type hex_record = + | Data of int * string + | ExtendedLinearAddress of int + | EndOfFile of int + +let string_of_hexline str = + let n = String.length str in + assert (n > 0 && n mod 2 = 1 && str.[0] = ':'); + let m = n/2 in + let result = String.create m in + for i = 0 to m-1 do + let j = 2*i+1 in + result.[i] <- char_of_int (int_of_string ("0x"^(String.sub str j 2))) + done; + result + +let compute_checksum str = + let rec aux i accu = + if i < 0 then + (-accu) land 0xff + else + aux (i-1) (accu+(int_of_char str.[i])) + in aux (String.length str - 2) 0 + +let parse_line str = + let str = string_of_hexline str in + let get i = int_of_char str.[i] in + let n = String.length str in + assert (n >= 5 && compute_checksum str = int_of_char str.[n-1]); + let count = get 0 in + assert (count+5 = n); + let address = ((get 1) lsl 8) lor (get 2) in + let record_type = get 3 in + let data = String.sub str 4 count in + match record_type with + | 0x00 -> + Data (address, data) + | 0x01 -> + assert (count = 0); + EndOfFile address + | 0x04 -> + assert (count = 2 && address = 0); + let msb = int_of_char data.[0] and lsb = int_of_char data.[1] in + (* check for possible overflow *) + assert (msb land 0x80 = 0); + ExtendedLinearAddress ((msb lsl 8) lor lsb) + | _ -> assert false + +let parse_file file = + let ic = Lwt_io.open_file ~mode:input file in + let lines = Lwt_io.read_lines ic in + let lines = Lwt_stream.map parse_line lines in + lwt lines = Lwt_stream.get_while (fun _ -> true) lines in + lwt _ = Lwt_io.close ic in + return lines + +let print_record = function + | Data (address, data) -> + Printf.printf "DAT %04x" address; + String.iter (fun c -> Printf.printf " %02x" (int_of_char c)) data; + Printf.printf "\n" + | ExtendedLinearAddress address -> + Printf.printf "ELA %04x\n" address + | EndOfFile address -> + Printf.printf "EOF %04x\n" address + +let validate_and_copy hex addr_base buffer offset length = + assert (offset+length <= String.length buffer); + let min_address = addr_base+offset in + let max_address = min_address+length in + let addr_high = ref 0 in + let execute_record = function + | Data (address, data) -> + assert (address land 0xFFFF = address); + let address = !addr_high lor address in + if address < min_address || address >= max_address then + Printf.eprintf + "0x%04x is outside range, all bytes dropped\n" + address + else begin + let length = + let n = String.length data in + if address+n >= max_address then begin + Printf.eprintf + "some bytes at address 0x%04x are outside range (dropped)\n" + address; + max_address-address + end else n + in + let offset2 = address-addr_base in + String.blit data 0 buffer offset2 length; + end + | ExtendedLinearAddress address -> + assert (address land 0x8000 = 0); + addr_high := address lsl 16 + | EndOfFile address -> + assert (address = 0); + raise Exit + in + try List.iter execute_record hex with Exit -> () diff --git a/PC_Mainboard/card_tools/hexfile.mli b/PC_Mainboard/card_tools/hexfile.mli new file mode 100644 index 0000000..c6fa563 --- /dev/null +++ b/PC_Mainboard/card_tools/hexfile.mli @@ -0,0 +1,26 @@ +(* + * hexfile.mli + * ----------- + * Copyright : (c) 2009, Stéphane Glondu <st...@gl...> + * Licence : BSD3 + * + * This file is a part of Krobot. + *) + +type hex_record = + | Data of int * string + | ExtendedLinearAddress of int + | EndOfFile of int + +val parse_file : string -> hex_record list Lwt.t + +val print_record : hex_record -> unit + (** Prints one record on standard output. *) + +val validate_and_copy : hex_record list -> int -> string -> int -> int -> unit + (** [validate_and_copy hex addr_base buffer offset length] copies + the contents of the (parsed) [hex] file to [buffer]. [offset] + and [length] denote the valid range inside [buffer] that can be + written. [addr_base] is the address [buffer] is mapped to on the + microcontroller. Bytes outside the range are ignored (and a + warning is printed on standard error. *) diff --git a/PC_Mainboard/card_tools/send_firmware.ml b/PC_Mainboard/card_tools/send_firmware.ml new file mode 100644 index 0000000..1dedd01 --- /dev/null +++ b/PC_Mainboard/card_tools/send_firmware.ml @@ -0,0 +1,69 @@ +(* + * send_firmware.ml + * ---------------- + * Copyright : (c) 2009, Stéphane Glondu <st...@gl...> + * Licence : BSD3 + * + * This file is a part of Krobot. + *) + +open Lwt +open Lwt_io + +let do_flash force filename = + lwt hex = Hexfile.parse_file filename in + let memory = + let buffer = String.make 0x8000 '\255' in + Hexfile.validate_and_copy hex 0x0 buffer 0 0x8000; + buffer + in + let firmware_name = Boardname.get_board_name memory in + lwt () = match firmware_name with + | Some s -> printf "Detected firmware: %S\n" s + | None -> printf "Unable to identify firmware!\n" + in + let address = 0x800 and length = 0x8000-0x800 in + lwt k = Bootloader.open_card () in + lwt () = printf "Card opened\n" in + lwt data = Bootloader.get_flash k ~address:0x0 ~length:0x8000 in + let board_name = Boardname.get_board_name data in + lwt () = match board_name with + | Some s -> printf "Detected card: %S\n" s + | None -> printf "Unable to identify card!\n" + in + lwt () = + if not force && (board_name = None || firmware_name = None || board_name <> firmware_name) then begin + lwt () = eprintf "board name and firmware name do not match, use --force\n" in + exit 1 + end else return () + in + lwt () = Bootloader.erase_flash k ~address ~length in + lwt () = printf "Flash erased\n" in + lwt () = Bootloader.write_flash k ~address memory address length in + lwt () = printf "Flashing completed\n" in + return () + +let _ = + let force = ref false in + let filename = ref None in + let speclist = [ + "--force", Arg.Set force, "Force flashing even if board id and firmware id do not match"; + ] in + Arg.parse speclist + (fun s -> + match !filename with + | None -> filename := Some s + | Some _ -> raise (Arg.Bad s)) + "Send a firmware to a board in bootloader mode"; + let filename = match !filename with + | None -> Printf.eprintf "You must specify a .hex file!\n"; exit 1 + | Some s -> s + in + Lwt_main.run + (try_lwt + do_flash !force filename + with + | Bootloader.Error e -> + eprintl (Bootloader.string_of_error e) + | e -> + eprintl (Printexc.to_string e)) diff --git a/PC_Mainboard/clients/Makefile b/PC_Mainboard/clients/Makefile deleted file mode 100644 index 56af001..0000000 --- a/PC_Mainboard/clients/Makefile +++ /dev/null @@ -1,23 +0,0 @@ -# Makefile -# -------- -# Copyright : (c) 2009, Jeremie Dimino <je...@di...> -# Licence : BSD3 -# -# This file is a part of [kro]bot. - -PREFIX=/usr/local - -OC = ocamlbuild -OF = ocamlfind - -ifeq ($(TERM),dumb) -OC += -classic-display -endif - -.PHONY: all -all: - $(OC) all - -.PHONY: clean -clean: - $(OC) -clean diff --git a/PC_Mainboard/clients/_tags b/PC_Mainboard/clients/_tags deleted file mode 100644 index c23ac4f..0000000 --- a/PC_Mainboard/clients/_tags +++ /dev/null @@ -1,15 +0,0 @@ -# -*- conf -*- - -# Syntax extensions -<**/*.ml>: syntax_camlp4o, pkg_camlp4, pkg_lwt.syntax, pkg_lwt.... [truncated message content] |