-
Serial Loader for BlackMath v1.0
02/05/2019 at 00:00 • 0 commentsAs you know, the BM version 1.0 is incapable of boot from the Arduino connected SPI.
Until the new boards arrive, I built a small kludge: using and USB<->RS232C adapter, we can set the BM to boot from UART, as you can see below.
The adapter can be anyone, as long it works with 3.3V.
Download the Windows program from github and upload your LDR files to the board. This is just a temporary fix, until I get the new boards, with all corrections.
In the repository there is a test program, displaying some imagens and speed tests.
-
Some tests and pitfalls
11/16/2018 at 20:58 • 0 commentsWell, this first version of the board has it's flaws, but I could run some tests.
I used the Analog Devices JTAG tool to load 2204, 16 bit audio samples and a simple 100 taps convolution filter. Then, I rewrote the code using the BF592 ROM routines and compared the results: from 64ms to 0,6ms.
Of course, the convolution filter used an academic code, but, yet, I think this will amaze the students.
The downside of the test: I discovered that the CODEC SGTL5000, when wired to SPI interface, can not be read. So, I thought I could use the chip ID register to just test the SPI interface but that is impossible.
I wrote a simple Arduino program to receive the LDR file and store it, in the hope to use it to boot the DSP. But I chose the UART as the main boot interface (from Arduino to DSP), and forgot that Arduino uses it as its main PC interface.
Now, I will have to write a small bootloader, load it in the BlackMath's SPI Flash and use the second SPI, attached to Arduino, to read the LDR binary.
Just as curiosity, the Arduino code (based on multiple internet sources), is as follows:
/* Copyright (c) 2015, Majenko Technologies All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * * Neither the name of Majenko Technologies nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* Modified by Marcellus Pereira <marcellus at laboratoriosacme.net> */ #include <ESP8266WiFi.h> #include <WiFiClient.h> #include <ESP8266WebServer.h> #include <ESP8266mDNS.h> #include <FS.h> // Include the SPIFFS library const char *ssid = "myssid"; const char *password = "mypassword"; ESP8266WebServer server(80); const int led = 14; const char page[] = {"<html><head><title></title></head><body><h1 style=\"text-align: center;\"><span style=\"font-family:courier new,courier,monospace;\"><strong>BlackMath</strong></span></h1><p><span style=\"font-family:courier new,courier,monospace;\">Atualização de firmware.</span></p><form action=\"update\" enctype=\"multipart/form-data\" method=\"post\">Arquivo ldr: <input id=\"fileToUpload\" name=\"fileToUpload\" type=\"file\" /> <input name=\"submit\" type=\"submit\" value=\"Atualizar\" /> </form><p> </p></body></html>"}; File fsUploadFile; // a File object to temporarily store the received file void handleRoot() { digitalWrite(led, 1); char temp[600]; int sec = millis() / 1000; int min = sec / 60; int hr = min / 60; server.send(200, "text/html", page); digitalWrite(led, 0); } void handleNotFound() { digitalWrite(led, 1); String message = "File Not Found\n\n"; message += "URI: "; message += server.uri(); message += "\nMethod: "; message += (server.method() == HTTP_GET) ? "GET" : "POST"; message += "\nArguments: "; message += server.args(); message += "\n"; for (uint8_t i = 0; i < server.args(); i++) { message += " " + server.argName(i) + ": " + server.arg(i) + "\n"; } server.send(404, "text/plain", message); digitalWrite(led, 0); } void setup(void) { pinMode(led, OUTPUT); pinMode(LED_BUILTIN, OUTPUT); digitalWrite(led, 0); Serial.begin(115200); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); Serial.println(""); // Wait for connection while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("Connected to "); Serial.println(ssid); Serial.print("IP address: "); Serial.println(WiFi.localIP()); if (MDNS.begin("blackmath")) { Serial.println("MDNS responder started"); } SPIFFS.begin(); // Start the SPI Flash Files System server.on("/", handleRoot); server.on("/update", HTTP_POST, // if the client posts to the upload page [](){ server.send(200); }, // Send status 200 (OK) to tell the client we are ready to receive hUpdate // Receive and save the file ); server.on("/inline", []() { server.send(200, "text/plain", "this works as well"); }); server.onNotFound([]() { // If the client requests any URI if (!handleFileRead(server.uri())) // send it if it exists server.send(404, "text/plain", "404: Not Found"); // otherwise, respond with a 404 (Not Found) error }); server.begin(); Serial.println("HTTP server started"); } void loop(void) { static int contador; server.handleClient(); if(contador++ > 5000){ digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); contador = 0; } } void hUpdate(){ // upload a new file to the SPIFFS HTTPUpload& upload = server.upload(); if(upload.status == UPLOAD_FILE_START){ String filename = upload.filename; if(!filename.startsWith("/")) filename = "/"+filename; Serial.print("handleFileUpload Name: "); Serial.println(filename); fsUploadFile = SPIFFS.open(filename, "w"); // Open the file for writing in SPIFFS (create if it doesn't exist) filename = String(); } else if(upload.status == UPLOAD_FILE_WRITE){ if(fsUploadFile) fsUploadFile.write(upload.buf, upload.currentSize); // Write the received bytes to the file } else if(upload.status == UPLOAD_FILE_END){ if(fsUploadFile) { // If the file was successfully created fsUploadFile.close(); // Close the file again Serial.print("handleFileUpload Size: "); Serial.println(upload.totalSize); server.sendHeader("Location","/success.html"); // Redirect the client to the success page server.send(303); } else { server.send(500, "text/plain", "500: couldn't create file"); } } } String getContentType(String filename) { // convert the file extension to the MIME type if (filename.endsWith(".html")) return "text/html"; else if (filename.endsWith(".css")) return "text/css"; else if (filename.endsWith(".js")) return "application/javascript"; else if (filename.endsWith(".ico")) return "image/x-icon"; else if (filename.endsWith(".gz")) return "application/x-gzip"; return "text/plain"; } bool handleFileRead(String path) { // send the right file to the client (if it exists) Serial.println("handleFileRead: " + path); if (path.endsWith("/")) path += "index.html"; // If a folder is requested, send the index file String contentType = getContentType(path); // Get the MIME type String pathWithGz = path + ".gz"; if (SPIFFS.exists(pathWithGz) || SPIFFS.exists(path)) { // If the file exists, either as a compressed archive, or normal if (SPIFFS.exists(pathWithGz)) // If there's a compressed version available path += ".gz"; // Use the compressed verion File file = SPIFFS.open(path, "r"); // Open the file size_t sent = server.streamFile(file, contentType); // Send it to the client file.close(); // Close the file again Serial.println(String("\tSent file: ") + path); return true; } Serial.println(String("\tFile Not Found: ") + path); // If the file doesn't exist, return false return false; }
Just to find out the Bonjour service doesn't work very well on Windows 10... :-(
-
CODEC: first blood
11/04/2018 at 04:36 • 0 commentsThe BF592A initialization is working fine. The PLL is set and the mais clock is 193.577MHz.
Unfortunately, the pin VDDD is currently tied to +3V3 but the datasheet says it have to be connected to 1.1 ~ 2.0V... let's see if the little cut can save it.
-
First boot with CODEC chip soldered
11/01/2018 at 02:50 • 0 commentsWell, after some trouble with the SGTL5000 power pins, it seems that the little cut-and-rewire is working fine.
I'm writing the driver, but the power regulators are ok, so, there are no short circuits.