From beca2e0bd316ffbda81e644be79b05683a31bec4 Mon Sep 17 00:00:00 2001 From: Juan64Bits Date: Fri, 9 Apr 2010 10:39:15 -0500 Subject: [PATCH] Adding dual channel to scope example, fixing logic and QT source code. --- Examples/ADC/QT_src/ADC | Bin 41897 -> 0 bytes Examples/ADC/QT_src/ADCw.cpp | 77 ------------ Examples/ADC/QT_src/ADCw.h | 21 ---- Examples/ADC/QT_src/mainwindow.cpp | 49 -------- Examples/ADC/Scope-QT-src/ADC | Bin 0 -> 43080 bytes .../ADC/{QT_src => Scope-QT-src}/ADC1.pro | 0 .../{QT_src => Scope-QT-src}/ADC1.pro.user | 0 Examples/ADC/Scope-QT-src/ADCw.cpp | 76 ++++++++++++ Examples/ADC/Scope-QT-src/ADCw.h | 30 +++++ .../ADC/{QT_src => Scope-QT-src}/Makefile | 2 +- .../{QT_src => Scope-QT-src}/jz47xx_gpio.cpp | 0 .../{QT_src => Scope-QT-src}/jz47xx_gpio.h | 0 .../{QT_src => Scope-QT-src}/jz47xx_mmap.cpp | 0 .../{QT_src => Scope-QT-src}/jz47xx_mmap.h | 0 .../jz_adc_peripheral.cpp | 12 -- .../jz_adc_peripheral.h | 10 +- .../ADC/{QT_src => Scope-QT-src}/main.cpp | 0 Examples/ADC/Scope-QT-src/mainwindow.cpp | 63 ++++++++++ .../ADC/{QT_src => Scope-QT-src}/mainwindow.h | 1 + .../{QT_src => Scope-QT-src}/mainwindow.ui | 0 .../signaldisplay.cpp | 39 ++++--- .../{QT_src => Scope-QT-src}/signaldisplay.h | 12 +- Examples/ADC/logic/ADC.bit | Bin 0 -> 169292 bytes Examples/ADC/logic/ADC.v | 8 +- Examples/ADC/logic/ADC_peripheral.v | 30 ++--- Examples/ADC/logic/Makefile | 1 - Examples/ADC/src/Makefile | 36 ------ Examples/ADC/src/jz47xx_gpio.c | 108 ----------------- Examples/ADC/src/jz47xx_gpio.h | 84 ------------- Examples/ADC/src/jz47xx_mmap.c | 39 ------- Examples/ADC/src/jz47xx_mmap.h | 14 --- Examples/ADC/src/jz_adc_peripheral.c | 36 ------ Examples/ADC/src/jz_adc_peripheral.h | 78 ------------- Examples/ADC/src/jz_test_adc.c | 110 ------------------ docs/wiki/.~lock.ADC.odg# | 1 - docs/wiki/ADC.odg | Bin 21356 -> 23346 bytes 36 files changed, 220 insertions(+), 717 deletions(-) delete mode 100755 Examples/ADC/QT_src/ADC delete mode 100644 Examples/ADC/QT_src/ADCw.cpp delete mode 100644 Examples/ADC/QT_src/ADCw.h delete mode 100755 Examples/ADC/QT_src/mainwindow.cpp create mode 100755 Examples/ADC/Scope-QT-src/ADC rename Examples/ADC/{QT_src => Scope-QT-src}/ADC1.pro (100%) rename Examples/ADC/{QT_src => Scope-QT-src}/ADC1.pro.user (100%) create mode 100644 Examples/ADC/Scope-QT-src/ADCw.cpp create mode 100644 Examples/ADC/Scope-QT-src/ADCw.h rename Examples/ADC/{QT_src => Scope-QT-src}/Makefile (99%) rename Examples/ADC/{QT_src => Scope-QT-src}/jz47xx_gpio.cpp (100%) rename Examples/ADC/{QT_src => Scope-QT-src}/jz47xx_gpio.h (100%) rename Examples/ADC/{QT_src => Scope-QT-src}/jz47xx_mmap.cpp (100%) rename Examples/ADC/{QT_src => Scope-QT-src}/jz47xx_mmap.h (100%) rename Examples/ADC/{QT_src => Scope-QT-src}/jz_adc_peripheral.cpp (87%) rename Examples/ADC/{QT_src => Scope-QT-src}/jz_adc_peripheral.h (91%) rename Examples/ADC/{QT_src => Scope-QT-src}/main.cpp (100%) create mode 100755 Examples/ADC/Scope-QT-src/mainwindow.cpp rename Examples/ADC/{QT_src => Scope-QT-src}/mainwindow.h (96%) rename Examples/ADC/{QT_src => Scope-QT-src}/mainwindow.ui (100%) rename Examples/ADC/{QT_src => Scope-QT-src}/signaldisplay.cpp (51%) rename Examples/ADC/{QT_src => Scope-QT-src}/signaldisplay.h (71%) create mode 100644 Examples/ADC/logic/ADC.bit delete mode 100644 Examples/ADC/src/Makefile delete mode 100644 Examples/ADC/src/jz47xx_gpio.c delete mode 100644 Examples/ADC/src/jz47xx_gpio.h delete mode 100644 Examples/ADC/src/jz47xx_mmap.c delete mode 100644 Examples/ADC/src/jz47xx_mmap.h delete mode 100644 Examples/ADC/src/jz_adc_peripheral.c delete mode 100644 Examples/ADC/src/jz_adc_peripheral.h delete mode 100644 Examples/ADC/src/jz_test_adc.c delete mode 100644 docs/wiki/.~lock.ADC.odg# diff --git a/Examples/ADC/QT_src/ADC b/Examples/ADC/QT_src/ADC deleted file mode 100755 index 40ef590362ea3994218080363880dad8963e1671..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41897 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 z zhQW+)0#=Ty+hM^OVE*=@)(1~n;$H08r`|zg{Z|7k$NbtY z_-@l{>qFIQTf&T!30ygKM`mY-|ZOwybO0BpKE>Y21-SaJM{*H7I}a2!;j*g?ceE zQdPamS1lM3j70{CYWXM(PMV4g^!4o%33*&7!fR?(FD2k>z;TjRIuXQc&Ji9HXnFiw9i5GcDNgkA`{l`0@)RoV{59Xz z9F&Mdyv*e0!B*MrFP6;84=PhX?R_i;{UuJqQkHh;aNJJpGLzAKzZiKF+fe17O^bQX4jxN+>A znZP^Uxun0wIhW>{YWdRur#&E*hsWX6wkZv6`qNj<;$QhJ&8t0tk_XyZi(;`h-!x}a z%K^bWL{6*x6eifU%_7!l4|VwA`#Sp5H~qo5g~vy-v*1A2usoqRXIkFrPT=+VU^E;@ zgZP9)V0Cc)oxwoc=6i6!U%rmh9zSXf29^q|b1ZXZxSFF$r#{qB9|Da7{|d)|W-ktx zLaA5?2U&;lk%P9nj%@~P=?ZSy(CH1f)a;2xFxnQJ8p!k9HD;V9 zjK;cMo@WaMPHjGHQ(d`J9-pmiWwrU$1a;7;8Z58sh})|?&l`&dbsBh~)_t;gJV!nq zh^7MZM5cx3UTSA*PC5MfragN+D4%W#-s$70E<0!#=YOYy$yk5Bn^H-&Tq~`{vmqIH zRQ-+SndSs^4E%+a5a#je`2hhli8+v{ndI_kuWO@)&x>;APSwsID{Qv3_GJaxby34L zs&Dm1@#5Srta+iuZ5)Dd(x}=0)f&c_t#cOi8#|rYJmj>Xp)49Qi<>(I*N3m*@X%Iu zmh2^`+RK)~h(cSoteJe%9)4_`UTU5uTcBF>qiuME84rxN@a$)c)WU;|S9NsZ%RDI* z01GIi32866PJWrQlWS@_8bj$=xB+KF$HHwGNPD80aBo9@q#+X7oZ`u|k-#=%D8Xt- z*+xR%C~U%=L!k|>GL^Iir!#l*h})n%M)s0s&5c(qZ{cCyEOp_*##0>V+_N_o!-rn< z3fA-_(Em3NTzWKcwd8E;S50YQ?CR9V8s?E(1{SIurR3<_9@>Z5bPbk1 zMn7Z&7(R}{t2)-kL%Y*$o2ol9zM6(OZhrVk83S8dawpi{DLW$XeRxk;I2`(_InDIiW7;i$8vy*aqCAyA-*{2FEYbD(`I)mVcwi7y>#R3&^qyorFv-b`)f zy7=y-Y$>gW>mw`5rmdb#v$?_<+tVz^)Qyw8@oL+&PG()*(U45ysCjutdTn$t8kWYG zuU9A?>>20}=SNVEaQPt?(P%gnJ)Y&2%*tbsJd&|`YT30^5s5-80 zRcgspXz2NtQ#Uy4_u#-}YEur)D`kh^Vu2+yy2NU%F#B=(IC^zw zFt8!q=?iw&1f?m}HW^WPQdVk5iq|S=jP%ApQ&8C{Pl_*`{+0O|bC$FYOlN95qzKtic;nd(|-P?dViU)>T)f zcJDv^pq6j*=?}Lr7`uI57*r=-N%REV7k+wVBYp(N5#DdR+U(dZi^56f8f0Os^&1 zDmC6Dg4sNbhHWaAL+m|0V<-E)Oo(uBTnH{tf z>-==%KDpwVdVy7QZ*-qN!mR1o5Zz}EFZs^3CXz}d^A_K%5G_8p%t~B1NG1X`_V^k8sb?uuQ8`^`L*RJivt#nsIV|xp>qVL3g zgf;@{S;=i7d_6GMH_*q09}K>rO7C;qP|wEa(>{%7Ol0vyD3gvwdb9@Teow@*^<**I zIxNxT%1MpE#^71^@x5wRsOz}BQ)@D{Y=PYwUfKKwlaAJCEBo@*Z^imdt&EKcsurKq l#NusJXRx*zJJE8k%eCSv*#}{Ey@`l2j@2D)?3h}h_+Jq>q;dcN diff --git a/Examples/ADC/QT_src/ADCw.cpp b/Examples/ADC/QT_src/ADCw.cpp deleted file mode 100644 index 07015b5..0000000 --- a/Examples/ADC/QT_src/ADCw.cpp +++ /dev/null @@ -1,77 +0,0 @@ -#include "ADCw.h" - -ADCw::ADCw() -{ - ADCBuffer = jz_adc_init(); - /*************************Clean FPGA RAM memory****************************/ - for (int i = 0; i < 512; i++) //RAMB16_s9_s9 has 2048 bytes 8-bit - { - ADCBuffer[i] = 0x00000000; //Clean 4 register by cicle - } -} - -void ADCw::testADC() -{ - /****************Configure ADC register on FPGA RAM memory*****************/ - jz_adc_config(ADCBuffer, 0x00, ADC_SPI_CLKDIV_MAX, ADC_CMD_SET_SPI_CLKDIV); - usleep (1000); - jz_adc_config(ADCBuffer, 0x00, ADC_SPI_CLKDIV_MAX, ADC_CMD_SET_FAST_CONV); - usleep (1000); - printf("\nADC in Fast Convertion Mode (10us) and Fs=9.8KHz (Min)\n"); - - int LENB = 0xFE; // 254 read/cmd - - /******************************* TEST 1 ***********************************/ - printf("\nINIT TEST1: Autoselft {(Vref+) - (Vref-)}/2 -> Return 0x0200 \n"); - jz_adc_config(ADCBuffer, 0x00, ADC_SPI_CLKDIV_MAX, ADC_CMD_SET_AUTOSELFT_1); - printf("[%08X]", ADCBuffer[0]);fflush (stdout); - usleep (1000); - jz_adc_config(ADCBuffer, LENB, ADC_SPI_CLKDIV_MAX, ADC_CMD_READ_AUTOSELFT_1); - printf("[%08X]", ADCBuffer[0]);fflush (stdout); - while(jz_adc_check_buffer(ADCBuffer)){usleep (10);} - for(int i=1; i< 512; i++) - printf("[%08X]", ADCBuffer[i]); - fflush (stdout); - - /******************************* TEST 2 ***********************************/ - printf("\n\nINIT TEST2: Autoselft (Vref-) -> Return 0x0000 \n"); - jz_adc_config(ADCBuffer, 0x00, ADC_SPI_CLKDIV_MAX, ADC_CMD_SET_AUTOSELFT_2); - printf("[%08X]", ADCBuffer[0]);fflush (stdout); - usleep (1000); - jz_adc_config(ADCBuffer, LENB, ADC_SPI_CLKDIV_MAX, ADC_CMD_READ_AUTOSELFT_2); - printf("[%08X]", ADCBuffer[0]);fflush (stdout); - while(jz_adc_check_buffer(ADCBuffer)){usleep (10);} - for(int i=1; i< 512; i++) - printf("[%08X]", ADCBuffer[i]); - fflush (stdout); - - /******************************* TEST 3 ***********************************/ - printf("\n\nINIT TEST3: Autoselft (Vref+) -> Return 0x03FF \n"); - jz_adc_config(ADCBuffer, 0x00, ADC_SPI_CLKDIV_MAX, ADC_CMD_SET_AUTOSELFT_3); - printf("[%08X]", ADCBuffer[0]);fflush (stdout); - usleep (1000); - jz_adc_config(ADCBuffer, LENB, ADC_SPI_CLKDIV_MAX, ADC_CMD_READ_AUTOSELFT_3); - printf("[%08X]", ADCBuffer[0]);fflush (stdout); - while(jz_adc_check_buffer(ADCBuffer)){usleep (10);} - for(int i=1; i< 512; i++) - printf("[%08X]", ADCBuffer[i]); - fflush (stdout); - - printf("\n\nTESTS complete\n"); -} - -void ADCw::powerDownADC() -{ - jz_adc_config(ADCBuffer, 0x00, ADC_SPI_CLKDIV_MAX, ADC_CMD_SET_POWER_DOWN); - printf("\nADC in Power Down Mode \n"); -} - -JZ_REG* ADCw::takeSamplesADC(int LENB, uchar CLKDIV, int CHANNEL) -{ - jz_adc_config(ADCBuffer, 0x00, CLKDIV, ADC_CMD_SET_CHANNEL0+CHANNEL); - usleep (1000); - jz_adc_config(ADCBuffer, LENB, CLKDIV, ADC_CMD_READ_CHANNEL0+CHANNEL); - //while(jz_adc_check_buffer(ADCBuffer)){usleep (400000);printf("[%08X]", ADCBuffer[0]);fflush (stdout);} - while(jz_adc_check_buffer(ADCBuffer)){usleep (10);} - return ADCBuffer; -} diff --git a/Examples/ADC/QT_src/ADCw.h b/Examples/ADC/QT_src/ADCw.h deleted file mode 100644 index 845e45e..0000000 --- a/Examples/ADC/QT_src/ADCw.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef ADCW_H -#define ADCW_H - -#include "jz_adc_peripheral.h" -#include -#include - -class ADCw -{ -public: - ADCw(); - ~ADCw(){}; - - void testADC(); - void powerDownADC(); - JZ_REG * takeSamplesADC(int LENB, uchar CLKDIV, int CHANNEL); -private: - JZ_REG * ADCBuffer; -}; - -#endif // ADCW_H diff --git a/Examples/ADC/QT_src/mainwindow.cpp b/Examples/ADC/QT_src/mainwindow.cpp deleted file mode 100755 index 5afe798..0000000 --- a/Examples/ADC/QT_src/mainwindow.cpp +++ /dev/null @@ -1,49 +0,0 @@ -#include "mainwindow.h" -#include "ui_mainwindow.h" -#include - -#include -#include - -MainWindow::MainWindow(QWidget *parent) - : QMainWindow(parent), ui(new Ui::MainWindow) -{ - ui->setupUi(this); - connect(this,SIGNAL(refresh()),ui->Graph, SLOT(repaint())); - ui->Graph->setPointsPerPlot(300); - ui->Graph->setVoltsPerDiv(102); - - timer1 = new QTimer(this); - timer1->start(50); - connect(timer1, SIGNAL(timeout()), this, SLOT(updateGraph())); - - ADC1 = new ADCw; - ADC1->testADC(); - printf("\nTaking 250 samples each 50ms from Channel 0 at Fs=9.8KHz \n"); -} - -MainWindow::~MainWindow() -{ - delete ui; -} - -void MainWindow::updateGraph() -{ - JZ_REG * dataADC =ADC1->takeSamplesADC(300, 0x08, 1); - int tempD; - - for(int i=1; i< 300/2+1; i++) - { - //printf("[%08X]",dataADC[i]); - tempD = dataADC[i]&0xFFFF; - ui->Graph->addPoint(tempD); - tempD = dataADC[i]>>16; - ui->Graph->addPoint(tempD); - } - //printf("\n \n *************************************************************** \n\n"); - //fflush (stdout); - /*for(int i = 0; i<100;i++) - ui->Graph->addPoint(20*sin(6.2832*i/100)+20);*/ - - emit refresh(); -} diff --git a/Examples/ADC/Scope-QT-src/ADC b/Examples/ADC/Scope-QT-src/ADC new file mode 100755 index 0000000000000000000000000000000000000000..96016a3136e25bb4c13ee1b44f0b9a98baf1a743 GIT binary patch literal 43080 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 Zt#VMbt)QBJQ+Efu9<*&J88tKY{{TKfWXk{m literal 0 HcmV?d00001 diff --git a/Examples/ADC/QT_src/ADC1.pro b/Examples/ADC/Scope-QT-src/ADC1.pro similarity index 100% rename from Examples/ADC/QT_src/ADC1.pro rename to Examples/ADC/Scope-QT-src/ADC1.pro diff --git a/Examples/ADC/QT_src/ADC1.pro.user b/Examples/ADC/Scope-QT-src/ADC1.pro.user similarity index 100% rename from Examples/ADC/QT_src/ADC1.pro.user rename to Examples/ADC/Scope-QT-src/ADC1.pro.user diff --git a/Examples/ADC/Scope-QT-src/ADCw.cpp b/Examples/ADC/Scope-QT-src/ADCw.cpp new file mode 100644 index 0000000..a295184 --- /dev/null +++ b/Examples/ADC/Scope-QT-src/ADCw.cpp @@ -0,0 +1,76 @@ +#include "ADCw.h" + +ADCw::ADCw() +{ + BUFFER_OFFSET = 8; + ADC_SPI_CLKDIV=ADC_SPI_CLKDIV_MAX; //Set clock to minimum speed + BUFFER_LEN=10; + + ADCBuffer = jz_adc_init(); + + //Clean FPGA RAM memory + for (int i = 0; i < 512; i++) //RAMB16_s9_s9 has 2048 bytes 8-bit + { + ADCBuffer[i] = 0x00000000; //Clean 4 register by cicle + } + + adcConfig(ADC_CMD_SET_SPI_CLKDIV); + adcConfig(ADC_CMD_SET_FAST_CONV); + printf("\nADC in Fast Convertion Mode (10us) and Fs=9.8KHz (Min)\n"); +} + +void ADCw::testADC() +{ + /******************************* TEST 1 ***********************************/ + printf("\nINIT TEST1: Autoselft {(Vref+) - (Vref-)}/2 -> Return 0x0200 \n"); + adcConfig(ADC_CMD_SET_AUTOSELFT_1); + adcConfig(ADC_CMD_READ_AUTOSELFT_1); + while(adcCheckBufferFull())usleep (10); + for(int i=BUFFER_OFFSET; i< BUFFER_LEN/2+BUFFER_OFFSET; i++) + printf("[%08X]", ADCBuffer[i]); + fflush (stdout); + + /******************************* TEST 2 ***********************************/ + printf("\n\nINIT TEST2: Autoselft (Vref-) -> Return 0x0000 \n"); + adcConfig(ADC_CMD_SET_AUTOSELFT_2); + adcConfig(ADC_CMD_READ_AUTOSELFT_2); + while(adcCheckBufferFull())usleep (10); + for(int i=BUFFER_OFFSET; i< BUFFER_LEN/2+BUFFER_OFFSET; i++) + printf("[%08X]", ADCBuffer[i]); + fflush (stdout); + + /******************************* TEST 3 ***********************************/ + printf("\n\nINIT TEST3: Autoselft (Vref+) -> Return 0x03FF \n"); + adcConfig(ADC_CMD_SET_AUTOSELFT_3); + adcConfig(ADC_CMD_READ_AUTOSELFT_3); + for(int i=BUFFER_OFFSET; i< BUFFER_LEN/2+BUFFER_OFFSET; i++) + printf("[%08X]", ADCBuffer[i]); + fflush (stdout); + + printf("\n\nTESTS complete\n"); +} + +void ADCw::powerDownADC() +{ + adcConfig(ADC_CMD_SET_POWER_DOWN); + printf("\nADC in Power Down Mode \n"); +} + +JZ_REG* ADCw::takeSamplesADC(int CHANNEL) +{ + adcConfig(ADC_CMD_SET_CHANNEL0+CHANNEL); + adcConfig(ADC_CMD_READ_CHANNEL0+CHANNEL); + while(adcCheckBufferFull())usleep (10); + return (JZ_REG*)(ADCBuffer+BUFFER_OFFSET); +} + +void ADCw::adcConfig(uchar CMD) +{ + ADCBuffer[0] = ((BUFFER_LEN+(BUFFER_OFFSET-1)*2) << 16) + (ADC_SPI_CLKDIV<<8) + CMD; + usleep (100); +} + +int ADCw::adcCheckBufferFull() +{ + return ADCBuffer[0]&0x20; +} diff --git a/Examples/ADC/Scope-QT-src/ADCw.h b/Examples/ADC/Scope-QT-src/ADCw.h new file mode 100644 index 0000000..83eedb7 --- /dev/null +++ b/Examples/ADC/Scope-QT-src/ADCw.h @@ -0,0 +1,30 @@ +#ifndef ADCW_H +#define ADCW_H + +#include "jz_adc_peripheral.h" +#include +#include + +class ADCw +{ +public: + ADCw(); + ~ADCw(){} + + void testADC(); + void powerDownADC(); + JZ_REG * takeSamplesADC(int CHANNEL); + void setClockDiv(uchar value){ ADC_SPI_CLKDIV = value;} + void setBufferLen(int value){ BUFFER_LEN = value;} + +private: + void adcConfig(uchar CMD); + int adcCheckBufferFull(); + + JZ_REG * ADCBuffer; + uchar ADC_SPI_CLKDIV; + int BUFFER_LEN; + int BUFFER_OFFSET; +}; + +#endif // ADCW_H diff --git a/Examples/ADC/QT_src/Makefile b/Examples/ADC/Scope-QT-src/Makefile similarity index 99% rename from Examples/ADC/QT_src/Makefile rename to Examples/ADC/Scope-QT-src/Makefile index dd3827f..b624c46 100644 --- a/Examples/ADC/QT_src/Makefile +++ b/Examples/ADC/Scope-QT-src/Makefile @@ -1,6 +1,6 @@ ############################################################################# # Makefile for building: ADC -# Generated by qmake (2.01a) (Qt 4.6.2) on: Wed Apr 7 21:11:41 2010 +# Generated by qmake (2.01a) (Qt 4.6.2) on: Fri Apr 9 10:33:37 2010 # Project: ADC1.pro # Template: app # Command: /home/juan64bits/ebd/ECB/openwrt-xburst/build_dir/target-mipsel_uClibc-0.9.30.1/qt-everywhere-opensource-src-4.6.2/bin/qmake -spec ../../../../openwrt-xburst/build_dir/target-mipsel_uClibc-0.9.30.1/qt-everywhere-opensource-src-4.6.2/mkspecs/qws/linux-openwrt-g++ -unix -o Makefile ADC1.pro diff --git a/Examples/ADC/QT_src/jz47xx_gpio.cpp b/Examples/ADC/Scope-QT-src/jz47xx_gpio.cpp similarity index 100% rename from Examples/ADC/QT_src/jz47xx_gpio.cpp rename to Examples/ADC/Scope-QT-src/jz47xx_gpio.cpp diff --git a/Examples/ADC/QT_src/jz47xx_gpio.h b/Examples/ADC/Scope-QT-src/jz47xx_gpio.h similarity index 100% rename from Examples/ADC/QT_src/jz47xx_gpio.h rename to Examples/ADC/Scope-QT-src/jz47xx_gpio.h diff --git a/Examples/ADC/QT_src/jz47xx_mmap.cpp b/Examples/ADC/Scope-QT-src/jz47xx_mmap.cpp similarity index 100% rename from Examples/ADC/QT_src/jz47xx_mmap.cpp rename to Examples/ADC/Scope-QT-src/jz47xx_mmap.cpp diff --git a/Examples/ADC/QT_src/jz47xx_mmap.h b/Examples/ADC/Scope-QT-src/jz47xx_mmap.h similarity index 100% rename from Examples/ADC/QT_src/jz47xx_mmap.h rename to Examples/ADC/Scope-QT-src/jz47xx_mmap.h diff --git a/Examples/ADC/QT_src/jz_adc_peripheral.cpp b/Examples/ADC/Scope-QT-src/jz_adc_peripheral.cpp similarity index 87% rename from Examples/ADC/QT_src/jz_adc_peripheral.cpp rename to Examples/ADC/Scope-QT-src/jz_adc_peripheral.cpp index 9390a3a..091f350 100644 --- a/Examples/ADC/QT_src/jz_adc_peripheral.cpp +++ b/Examples/ADC/Scope-QT-src/jz_adc_peripheral.cpp @@ -45,15 +45,3 @@ jz_adc_init() return virt_addr; } - -void -jz_adc_config(JZ_REG * addr, int BUFFER, uchar CLK_DIV, uchar CMD) -{ - addr[0] = (BUFFER << 16) + (CLK_DIV<<8) + CMD; -} - -int -jz_adc_check_buffer(JZ_REG * addr) -{ - return addr[0]&0x00000010; -} diff --git a/Examples/ADC/QT_src/jz_adc_peripheral.h b/Examples/ADC/Scope-QT-src/jz_adc_peripheral.h similarity index 91% rename from Examples/ADC/QT_src/jz_adc_peripheral.h rename to Examples/ADC/Scope-QT-src/jz_adc_peripheral.h index d92bff4..9617df2 100644 --- a/Examples/ADC/QT_src/jz_adc_peripheral.h +++ b/Examples/ADC/Scope-QT-src/jz_adc_peripheral.h @@ -24,7 +24,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "jz47xx_gpio.h" #define ADC_CMD_NONE 0x00 /* Nothing to do */ -#define ADC_CMD_SET_SPI_CLKDIV 0x90 /* Set clock divider for ADC sclk */ +#define ADC_CMD_SET_SPI_CLKDIV 0x00 /* Set clock divider for ADC sclk */ #define ADC_CMD_SET_CHANNEL0 0x30 /* Set channel 0 */ #define ADC_CMD_READ_CHANNEL0 0x20 /* Read channel 0 */ @@ -54,7 +54,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define ADC_CMD_SET_FAST_CONV 0X39 /* Initialize ADC Fast Convertion(<10us)*/ -#define ADC_CMD_SET_LOW_CONV 0X3A /* Initialize ADC Fast Convertion(<40us)*/ +#define ADC_CMD_SET_LOW_CONV 0X3A /* Initialize ADC Slow Convertion(<40us)*/ #define ADC_CMD_SET_AUTOSELFT_1 0x3B /* Set Autoselft ADC {(Vref+)-(Vref-)}/2*/ #define ADC_CMD_READ_AUTOSELFT_1 0x2B /* Read Autoselft ADC 1 (0x0200) */ @@ -68,7 +68,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define ADC_SPI_CLKDIV_MIN 0x08 /* 50/(2*9) -> 2.78MHz (MAX=2.8MHz) */ #define ADC_SPI_CLKDIV_MAX 0xFF /* 50/(2*256) -> 97.65KHz */ -#define ADC_MAX_BUFFER 0x3FE/* 1022 reads/commands */ +#define ADC_MAX_BUFFER 0x3F0/* 1008 reads/commands */ #define CS2_PORT JZ_GPIO_PORT_B #define CS2_PIN 26 @@ -77,8 +77,4 @@ typedef unsigned char uchar; JZ_REG *jz_adc_init(); -void jz_adc_config(JZ_REG * addr, int BUFFER, uchar CLK_DIV, uchar CMD); - -int jz_adc_check_buffer(JZ_REG * addr); - #endif diff --git a/Examples/ADC/QT_src/main.cpp b/Examples/ADC/Scope-QT-src/main.cpp similarity index 100% rename from Examples/ADC/QT_src/main.cpp rename to Examples/ADC/Scope-QT-src/main.cpp diff --git a/Examples/ADC/Scope-QT-src/mainwindow.cpp b/Examples/ADC/Scope-QT-src/mainwindow.cpp new file mode 100755 index 0000000..0c6da83 --- /dev/null +++ b/Examples/ADC/Scope-QT-src/mainwindow.cpp @@ -0,0 +1,63 @@ +#include "mainwindow.h" +#include "ui_mainwindow.h" +#include + +#include +#include + +MainWindow::MainWindow(QWidget *parent) + : QMainWindow(parent), ui(new Ui::MainWindow) +{ + ui->setupUi(this); + connect(this,SIGNAL(refresh()),ui->Graph, SLOT(repaint())); + ui->Graph->setPointsPerPlot(120); + ui->Graph->setVoltsPerDiv(205); + + timer1 = new QTimer(this); + timer1->start(50); + connect(timer1, SIGNAL(timeout()), this, SLOT(updateGraph())); + + CHANNEL = 1; + ADC1 = new ADCw; + ADC1->testADC(); + ADC1->setBufferLen(120); + ADC1->setClockDiv(ADC_SPI_CLKDIV_MAX); //Maximun speed + printf("\nTaking 300 samples each 50ms from Channel 0,1 at Fs=99KHz \n"); +} + +MainWindow::~MainWindow() +{ + delete ui; +} + +void MainWindow::updateGraph() +{ + JZ_REG * dataADC; + + int tempD; + + //CHANNEL 0 + dataADC=ADC1->takeSamplesADC(0); + for(int i=0; i< 120/2; i++) + { + //printf("[%08X]",dataADC[i]); + tempD = dataADC[i]&0xFFFF; + ui->Graph->addPoint1(tempD+0x3ff); + tempD = dataADC[i]>>16; + ui->Graph->addPoint1(tempD+0x3ff); + } + CHANNEL = 1; + + //CHANNEL 1 + dataADC=ADC1->takeSamplesADC(1); + for(int i=0; i< 120/2; i++) + { + //printf("[%08X]",dataADC[i]); + tempD = dataADC[i]&0xFFFF; + ui->Graph->addPoint2(tempD); + tempD = dataADC[i]>>16; + ui->Graph->addPoint2(tempD); + } + + emit refresh(); +} diff --git a/Examples/ADC/QT_src/mainwindow.h b/Examples/ADC/Scope-QT-src/mainwindow.h similarity index 96% rename from Examples/ADC/QT_src/mainwindow.h rename to Examples/ADC/Scope-QT-src/mainwindow.h index f87f85c..f06f4ba 100755 --- a/Examples/ADC/QT_src/mainwindow.h +++ b/Examples/ADC/Scope-QT-src/mainwindow.h @@ -27,6 +27,7 @@ private: Ui::MainWindow *ui; QTimer *timer1; ADCw *ADC1; + bool CHANNEL; }; #endif // MAINWINDOW_H diff --git a/Examples/ADC/QT_src/mainwindow.ui b/Examples/ADC/Scope-QT-src/mainwindow.ui similarity index 100% rename from Examples/ADC/QT_src/mainwindow.ui rename to Examples/ADC/Scope-QT-src/mainwindow.ui diff --git a/Examples/ADC/QT_src/signaldisplay.cpp b/Examples/ADC/Scope-QT-src/signaldisplay.cpp similarity index 51% rename from Examples/ADC/QT_src/signaldisplay.cpp rename to Examples/ADC/Scope-QT-src/signaldisplay.cpp index d50868f..8bcd53f 100755 --- a/Examples/ADC/QT_src/signaldisplay.cpp +++ b/Examples/ADC/Scope-QT-src/signaldisplay.cpp @@ -4,7 +4,8 @@ SignalDisplay::SignalDisplay(QWidget *&parent):QWidget(parent) { - colorTrace = Qt::black; + colorTrace1 = Qt::blue; + colorTrace2 = Qt::red; secsPerDiv = 1.0/600.0; voltsPerDiv = 20; setPointsPerPlot(10); @@ -13,8 +14,9 @@ SignalDisplay::SignalDisplay(QWidget *&parent):QWidget(parent) void SignalDisplay::setPointsPerPlot(int value) { pointsPerPlot = value; - waves = new QPoint[pointsPerPlot]; - secsIdx = 0; + wave1 = new QPoint[pointsPerPlot]; + wave2 = new QPoint[pointsPerPlot]; + secsIdx1 = 0; secsIdx2 = 0; } void SignalDisplay::drawGrid(QPainter &p, QColor colorGrid, int x, int y, int w, int h, int nx, int ny){ @@ -35,26 +37,25 @@ void SignalDisplay::paintEvent(QPaintEvent *event){ ox = w; oy = h; painter.fillRect(0,0,w,h,Qt::white); - //painter.setPen(Qt::white); - //painter.drawLine(secsIdx*w/10/60.0/pointsPerPlot/secsPerDiv,0, \ - // secsIdx*w/10/60.0/pointsPerPlot/secsPerDiv,h); drawGrid(painter, Qt::lightGray,0,0,w,h,5, 10); - - /*for(int i = 0; i < pointsPerPlot; i++) - { - painter.fillRect(waves[i].x()-w/pointsPerPlot/2,waves[i].y(), \ - w/pointsPerPlot,h-waves[i].y(), Qt::blue); - }*/ - painter.setPen(colorTrace); - painter.drawPolyline(waves,pointsPerPlot); - + painter.setPen(colorTrace1); + painter.drawPolyline(wave1,pointsPerPlot); + painter.setPen(colorTrace2); + painter.drawPolyline(wave2,pointsPerPlot); } -void SignalDisplay::addPoint( int value1) +void SignalDisplay::addPoint1( int value) { - waves[secsIdx] = QPoint(secsIdx*w/10/60.0/pointsPerPlot/secsPerDiv+w/(2*pointsPerPlot), \ - oy-value1*h/voltsPerDiv/10); - secsIdx = (secsIdx+1) % pointsPerPlot; + wave1[secsIdx1] = QPoint(secsIdx1*w/10/60.0/pointsPerPlot/secsPerDiv+w/(2*pointsPerPlot), \ + oy-value*h/voltsPerDiv/10); + secsIdx1 = (secsIdx1+1) % pointsPerPlot; +} + +void SignalDisplay::addPoint2( int value) +{ + wave2[secsIdx2] = QPoint(secsIdx2*w/10/60.0/pointsPerPlot/secsPerDiv+w/(2*pointsPerPlot), \ + oy-value*h/voltsPerDiv/10); + secsIdx2 = (secsIdx2+1) % pointsPerPlot; } //EOF diff --git a/Examples/ADC/QT_src/signaldisplay.h b/Examples/ADC/Scope-QT-src/signaldisplay.h similarity index 71% rename from Examples/ADC/QT_src/signaldisplay.h rename to Examples/ADC/Scope-QT-src/signaldisplay.h index 8229c1c..4b87a86 100755 --- a/Examples/ADC/QT_src/signaldisplay.h +++ b/Examples/ADC/Scope-QT-src/signaldisplay.h @@ -9,21 +9,23 @@ class SignalDisplay : public QWidget { public: SignalDisplay(QWidget *&parent); - void addPoint( int value1); + void addPoint1( int value); + void addPoint2( int value); void setSecsPerDiv( float value ){ secsPerDiv = fabs(value);} void setVoltsPerDiv( float value ){ voltsPerDiv = fabs(value);} float getSecsPerDiv(){ return secsPerDiv; } void setPointsPerPlot(int value); - void setColorTrace(QColor color){colorTrace=color;}; + void setColorTrace1(QColor color){colorTrace1=color;} + void setColorTrace2(QColor color){colorTrace2=color;} private: void paintEvent(QPaintEvent *event); void drawGrid(QPainter &p, QColor colorGrid, int x, int y, int w, int h, int nx, int ny); - QPoint *waves; + QPoint *wave1, *wave2; float voltsPerDiv; float secsPerDiv; - QColor colorTrace; - int secsIdx; + QColor colorTrace1,colorTrace2; + int secsIdx1, secsIdx2; int w, h, ox, oy; int pointsPerPlot; }; diff --git a/Examples/ADC/logic/ADC.bit b/Examples/ADC/logic/ADC.bit new file mode 100644 index 0000000000000000000000000000000000000000..b984bf9b9b4e0e8993e3eb22664afd3da0a0c574 GIT binary patch literal 169292 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 NPyKVlKa|Gr{{uNX*+T#T literal 0 HcmV?d00001 diff --git a/Examples/ADC/logic/ADC.v b/Examples/ADC/logic/ADC.v index 2956edb..0871f7f 100644 --- a/Examples/ADC/logic/ADC.v +++ b/Examples/ADC/logic/ADC.v @@ -77,14 +77,14 @@ module ADC(clk, sram_data, addr, nwe, ncs, noe, reset, led, ADC_EOC, wire [7:0] rdBus0, rdBus1, rdBus2, rdBus3; assign csN = buffer_addr[12]? (buffer_addr[11]? 4'b1000: - 4'b0100) + 4'b0100) : (buffer_addr[11]? 4'b0010: - 4'b0001); + 4'b0001); assign rdBus = buffer_addr[12]? (buffer_addr[11]? rdBus3: - rdBus2) + rdBus2) : (buffer_addr[11]? rdBus1: - rdBus0); + rdBus0); // Peripheral instantiation ADC_peripheral P1( diff --git a/Examples/ADC/logic/ADC_peripheral.v b/Examples/ADC/logic/ADC_peripheral.v index b28dd13..185ae3a 100644 --- a/Examples/ADC/logic/ADC_peripheral.v +++ b/Examples/ADC/logic/ADC_peripheral.v @@ -47,12 +47,12 @@ module ADC_peripheral( clk, reset, cs, ADC_EOC, ADC_CS, ADC_CSTART, .DOB(), // Port B 8-bit Data Output .DOPA(), // Port A 1-bit Parity Output .DOPB(), // Port B 1-bit Parity Output - .ADDRA(addr), // Port A 11-bit Address Input - .ADDRB(addr2), // Port B 11-bit Address Input + .ADDRA(addr[10:0]), // Port A 11-bit Address Input + .ADDRB(addr2[10:0]), // Port B 11-bit Address Input .CLKA(~clk), // Port A Clock .CLKB(~clk), // Port B Clock - .DIA(wrBus), // Port A 8-bit Data Input - .DIB(wrBus2), // Port B 8-bit Data Input + .DIA(wrBus[7:0]), // Port A 8-bit Data Input + .DIB(wrBus2[7:0]), // Port B 8-bit Data Input .DIPA(1'b0), // Port A 1-bit parity Input .DIPB(1'b0), // Port-B 1-bit parity Input .ENA(1'b1), // Port A RAM Enable Input @@ -141,7 +141,7 @@ module ADC_peripheral( clk, reset, cs, ADC_EOC, ADC_CS, ADC_CSTART, /**************************************************************************/ // REGISTER BANK: Write control - always @(posedge clk) + always @(negedge clk) if(reset) {CMD_START, CMD_TYP,CMD_ADC,SIZEB,we1} <= 0; else if(we & cs) begin @@ -175,21 +175,21 @@ module ADC_peripheral( clk, reset, cs, ADC_EOC, ADC_CS, ADC_CSTART, // CONTROL always @(posedge clk) - if(reset) + if(reset) begin {w_st0, SPI_wr} <= 0; + ADC_CS <=1; + end else begin case (w_st0) 0: begin - rstStart <= 0; loadB <= 0; ADC_CS <=0; initB<=0; + rstStart <= 0; loadB <= 0; initB<=0; if(CMD_START) begin - initB<=1; + ADC_CS <=0; + SPI_wr <= 1; w_st0 <=1; end - end + end 1: begin - SPI_wr <= 1; w_st0 <=2; - end - 2: begin SPI_wr <= 0; if(!busy && ADC_EOC) begin ADC_CS <=1; @@ -198,12 +198,12 @@ module ADC_peripheral( clk, reset, cs, ADC_EOC, ADC_CS, ADC_CSTART, w_st0<= 0; end else begin - loadB <= 1; - w_st0<= 0; + initB<=1; + w_st0<= 2; end end end - + 2: begin loadB <= 1; w_st0<= 0; end endcase end diff --git a/Examples/ADC/logic/Makefile b/Examples/ADC/logic/Makefile index af4144b..6c1d966 100644 --- a/Examples/ADC/logic/Makefile +++ b/Examples/ADC/logic/Makefile @@ -18,7 +18,6 @@ remake: clean-build all clean: rm -f *~ */*~ a.out *.log *.key *.edf *.ps trace.dat - rm *.bit clean-build: clean rm -rf build diff --git a/Examples/ADC/src/Makefile b/Examples/ADC/src/Makefile deleted file mode 100644 index a4ad1eb..0000000 --- a/Examples/ADC/src/Makefile +++ /dev/null @@ -1,36 +0,0 @@ -CC = mipsel-openwrt-linux-gcc - -all: upload - -DEBUG = -O3 -g0 - -COMMON_SOURCES = jz47xx_gpio.c jz47xx_mmap.c jz_adc_peripheral.c - -H_SOURCES = jz47xx_gpio.h jz47xx_mmap.h jz_adc_peripheral.h - -INCLUDE = -I. - -WARNINGS= -Wcast-align -Wpacked -Wpadded -Wall - -CCFLAGS = ${INCLUDE} ${DEBUG} ${WARNINGS} - -LDFLAGS = - -COMMON_OBJECTS = $(COMMON_SOURCES:.c=.o) - -NANO_IP = 192.168.254.101 - -jz_test_adc: $(COMMON_OBJECTS) - $(CC) $(LDFLAGS) $(COMMON_OBJECTS) jz_test_adc.c -o jz_test_adc - -.c.o: - $(CC) -c $(CCFLAGS) $< -o $@ - -upload: jz_test_adc - scp jz_test_adc root@$(NANO_IP):/root/ - -clean: - rm -f *.o jz_test_adc ${EXEC} *~ - -indent: - indent -bad -bap -nbc -bl -nce -i2 --no-tabs --line-length120 $(COMMON_SOURCES) $(H_SOURCES) diff --git a/Examples/ADC/src/jz47xx_gpio.c b/Examples/ADC/src/jz47xx_gpio.c deleted file mode 100644 index affa85e..0000000 --- a/Examples/ADC/src/jz47xx_gpio.c +++ /dev/null @@ -1,108 +0,0 @@ -/* - JZ47xx GPIO at userspace - - Copyright (C) 2010 Andres Calderon andres.calderon@emqbit.com - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include - -#include -#include - - -#define JZ_GPIO_BASE 0x10010000 - -void -jz_gpio_as_output (JZ_PIO * pio, unsigned int o) -{ - pio->PXFUNC = (1 << (o)); - pio->PXSELC = (1 << (o)); - pio->PXDIRS = (1 << (o)); -} - -void -jz_gpio_as_input (JZ_PIO * pio, unsigned int o) -{ - pio->PXFUNC = (1 << (o)); - pio->PXSELC = (1 << (o)); - pio->PXDIRC = (1 << (o)); -} - -void -jz_gpio_set_pin (JZ_PIO * pio, unsigned int o) -{ - pio->PXDATS = (1 << (o)); -} - -void -jz_gpio_clear_pin (JZ_PIO * pio, unsigned int o) -{ - pio->PXDATC = (1 << (o)); -} - -void -jz_gpio_out (JZ_PIO * pio, unsigned int o, unsigned int val) -{ - if (val == 0) - pio->PXDATC = (1 << (o)); - else - pio->PXDATS = (1 << (o)); -} - -unsigned int -jz_gpio_get_pin (JZ_PIO * pio, unsigned int o) -{ - return (pio->PXPIN & (1 << o)) ? 1 : 0; -} - -int -jz_gpio_as_func (JZ_PIO * pio, unsigned int o, int func) -{ - switch (func) - { - case 0: - pio->PXFUNS = (1 << o); - pio->PXTRGC = (1 << o); - pio->PXSELC = (1 << o); - return 1; - - case 1: - pio->PXFUNS = (1 << o); - pio->PXTRGC = (1 << o); - pio->PXSELS = (1 << o); - return 1; - - case 2: - pio->PXFUNS = (1 << o); - pio->PXTRGS = (1 << o); - pio->PXSELC = (1 << o); - return 1; - } - return 0; -} - -JZ_PIO * -jz_gpio_map (int port) -{ - JZ_PIO *pio; - - pio = (JZ_PIO *) jz_mmap (JZ_GPIO_BASE); - pio = (JZ_PIO *) ((unsigned int) pio + port * 0x100); - - return pio; -} diff --git a/Examples/ADC/src/jz47xx_gpio.h b/Examples/ADC/src/jz47xx_gpio.h deleted file mode 100644 index d8b0113..0000000 --- a/Examples/ADC/src/jz47xx_gpio.h +++ /dev/null @@ -1,84 +0,0 @@ -/* - JZ47xx GPIO at userspace - - Copyright (C) 2010 Andres Calderon andres.calderon@emqbit.com - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __jz47xx_gpio_h__ -#define __jz47xx_gpio_h__ - -#define JZ_GPIO_PORT_A 0 -#define JZ_GPIO_PORT_B 1 -#define JZ_GPIO_PORT_C 2 -#define JZ_GPIO_PORT_D 3 - -typedef volatile unsigned int JZ_REG; /* Hardware register definition */ - -typedef struct _JZ_PIO -{ - JZ_REG PXPIN; /* PIN Level Register */ - JZ_REG Reserved0; - JZ_REG Reserved1; - JZ_REG Reserved2; - JZ_REG PXDAT; /* Port Data Register */ - JZ_REG PXDATS; /* Port Data Set Register */ - JZ_REG PXDATC; /* Port Data Clear Register */ - JZ_REG Reserved3; - JZ_REG PXIM; /* Interrupt Mask Register */ - JZ_REG PXIMS; /* Interrupt Mask Set Reg */ - JZ_REG PXIMC; /* Interrupt Mask Clear Reg */ - JZ_REG Reserved4; - JZ_REG PXPE; /* Pull Enable Register */ - JZ_REG PXPES; /* Pull Enable Set Reg. */ - JZ_REG PXPEC; /* Pull Enable Clear Reg. */ - JZ_REG Reserved5; - JZ_REG PXFUN; /* Function Register */ - JZ_REG PXFUNS; /* Function Set Register */ - JZ_REG PXFUNC; /* Function Clear Register */ - JZ_REG Reserved6; - JZ_REG PXSEL; /* Select Register */ - JZ_REG PXSELS; /* Select Set Register */ - JZ_REG PXSELC; /* Select Clear Register */ - JZ_REG Reserved7; - JZ_REG PXDIR; /* Direction Register */ - JZ_REG PXDIRS; /* Direction Set Register */ - JZ_REG PXDIRC; /* Direction Clear Register */ - JZ_REG Reserved8; - JZ_REG PXTRG; /* Trigger Register */ - JZ_REG PXTRGS; /* Trigger Set Register */ - JZ_REG PXTRGC; /* Trigger Set Register */ - JZ_REG Reserved9; - JZ_REG PXFLG; /* Port Flag Register */ - JZ_REG PXFLGC; /* Port Flag clear Register */ -} JZ_PIO, *PJZ_PIO; - -void jz_gpio_as_output (JZ_PIO * pio, unsigned int o); - -void jz_gpio_as_input (JZ_PIO * pio, unsigned int o); - -void jz_gpio_set_pin (JZ_PIO * pio, unsigned int o); - -void jz_gpio_clear_pin (JZ_PIO * pio, unsigned int o); - -void jz_gpio_out (JZ_PIO * pio, unsigned int o, unsigned int val); - -unsigned int jz_gpio_get_pin (JZ_PIO * pio, unsigned int o); - -int jz_gpio_as_func (JZ_PIO * pio, unsigned int o, int func); - -JZ_PIO *jz_gpio_map (int port); - -#endif diff --git a/Examples/ADC/src/jz47xx_mmap.c b/Examples/ADC/src/jz47xx_mmap.c deleted file mode 100644 index e8cf317..0000000 --- a/Examples/ADC/src/jz47xx_mmap.c +++ /dev/null @@ -1,39 +0,0 @@ -/* - * JZ47xx GPIO lines - * - * Written 2010 by Andres Calderon andres.calderon@emqbit.com - */ - -#include -#include -#include -#include -#include -#include - -#include - - -void * -jz_mmap (off_t address) -{ - int fd; - - void *pio; - - if ((fd = open ("/dev/mem", O_RDWR | O_SYNC)) == -1) - { - fprintf (stderr, "Cannot open /dev/mem.\n"); - return 0; - } - - pio = (void *) mmap (0, getpagesize (), PROT_READ | PROT_WRITE, MAP_SHARED, fd, address); - - if (pio == (void *) -1) - { - fprintf (stderr, "Cannot mmap.\n"); - return 0; - } - - return pio; -} diff --git a/Examples/ADC/src/jz47xx_mmap.h b/Examples/ADC/src/jz47xx_mmap.h deleted file mode 100644 index 492825b..0000000 --- a/Examples/ADC/src/jz47xx_mmap.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - * JZ47xx GPIO lines - * - * Written 2010 by Andres Calderon andres.calderon@emqbit.com - */ - -#ifndef __jz47xx_mmap_h__ -#define __jz47xx_mmap_h__ - -#include - -void *jz_mmap (off_t address); - -#endif diff --git a/Examples/ADC/src/jz_adc_peripheral.c b/Examples/ADC/src/jz_adc_peripheral.c deleted file mode 100644 index e5f9cd1..0000000 --- a/Examples/ADC/src/jz_adc_peripheral.c +++ /dev/null @@ -1,36 +0,0 @@ -/* ADC Peripheral.c - -Copyright (C) 2010 Carlos Camargo cicamargoba@unal.edu.co - Andres Calderon andres.calderon@emqbit.com - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include - -#include "jz_adc_peripheral.h" - -void -jz_adc_config(JZ_REG * addr, uchar BUFFER, uchar CLK_DIV, uchar CMD) -{ - addr[0] = (BUFFER << 16) + (CLK_DIV<<8) + CMD; -} - -int -jz_adc_check_buffer(JZ_REG * addr) -{ - return addr[0]&0x00FF0000; -} - diff --git a/Examples/ADC/src/jz_adc_peripheral.h b/Examples/ADC/src/jz_adc_peripheral.h deleted file mode 100644 index de55827..0000000 --- a/Examples/ADC/src/jz_adc_peripheral.h +++ /dev/null @@ -1,78 +0,0 @@ -/* ADC Peripheral.h - -Copyright (C) 2010 Carlos Camargo cicamargoba@unal.edu.co - Andres Calderon andres.calderon@emqbit.com - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __adc_peropheral_h__ -#define __adc_peropheral_h__ - -#include "jz47xx_gpio.h" - -#define ADC_CMD_NONE 0x00 /* Nothing to do */ -#define ADC_CMD_SET_SPI_CLKDIV 0x90 /* Set clock divider for ADC sclk */ - -#define ADC_CMD_SET_CHANNEL0 0x50 /* Set channel 0 */ -#define ADC_CMD_READ_CHANNEL0 0x60 /* Read channel 0 */ - -#define ADC_CMD_SET_CHANNEL1 0x51 /* Set channel 1 */ -#define ADC_CMD_READ_CHANNEL1 0x61 /* Read channel 1 */ - -#define ADC_CMD_SET_CHANNEL2 0x52 /* Set channel 2 */ -#define ADC_CMD_READ_CHANNEL2 0x62 /* Read channel 2 */ - -#define ADC_CMD_SET_CHANNEL3 0x53 /* Set channel 3 */ -#define ADC_CMD_READ_CHANNEL3 0x63 /* Read channel 3 */ - -#define ADC_CMD_SET_CHANNEL4 0x54 /* Set channel 4 */ -#define ADC_CMD_READ_CHANNEL4 0x64 /* Read channel 4 */ - -#define ADC_CMD_SET_CHANNEL5 0x55 /* Set channel 5 */ -#define ADC_CMD_READ_CHANNEL5 0x65 /* Read channel 5 */ - -#define ADC_CMD_SET_CHANNEL6 0x56 /* Set channel 6 */ -#define ADC_CMD_READ_CHANNEL6 0x66 /* Read channel 6 */ - -#define ADC_CMD_SET_CHANNEL7 0x57 /* Set channel 7 */ -#define ADC_CMD_READ_CHANNEL7 0x67 /* Read channel 8 */ - -#define ADC_CMD_SET_POWER_DOWN 0X58 /* Set ADC power down mode (1uA) */ - -#define ADC_CMD_SET_FAST_CONV 0X59 /* Initialize ADC Fast Convertion(<10us)*/ - -#define ADC_CMD_SET_LOW_CONV 0X5A /* Initialize ADC Fast Convertion(<40us)*/ - -#define ADC_CMD_SET_AUTOSELFT_1 0x5B /* Set Autoselft ADC {(Vref+)-(Vref-)}/2*/ -#define ADC_CMD_READ_AUTOSELFT_1 0x6B /* Read Autoselft ADC 1 (0x0200) */ - -#define ADC_CMD_SET_AUTOSELFT_2 0x5C /* Set Autoselft ADC (Vref-) */ -#define ADC_CMD_READ_AUTOSELFT_2 0x6C /* Read Autoselft ADC 2 (0x0000) */ - -#define ADC_CMD_SET_AUTOSELFT_3 0x5D /* Set Autoselft ADC (Vref+) */ -#define ADC_CMD_READ_AUTOSELFT_3 0x6D /* Read Autoselft ADC 3 (0x03FF) */ - -#define ADC_SPI_CLKDIV_MIN 0x09 /* 50/(2*9) -> 2.7MHz (MAX=2.8MHz) */ -#define ADC_SPI_CLKDIV_MAX 0xFF /* 50/(2*255) -> 98.04KHz */ - -#define ADC_MAX_BUFFER 0xFE /* 254 reads/commands */ - -typedef unsigned char uchar; - -void jz_adc_config(JZ_REG * addr, uchar BUFFER, uchar CLK_DIV, uchar CMD); - -int jz_adc_check_buffer(JZ_REG * addr); - -#endif diff --git a/Examples/ADC/src/jz_test_adc.c b/Examples/ADC/src/jz_test_adc.c deleted file mode 100644 index eda939c..0000000 --- a/Examples/ADC/src/jz_test_adc.c +++ /dev/null @@ -1,110 +0,0 @@ -/* ADC TEST - -Copyright (C) 2010 Carlos Camargo cicamargoba@unal.edu.co - Andres Calderon andres.calderon@emqbit.com - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include - -#include "jz47xx_gpio.h" -#include "jz47xx_mmap.h" -#include "jz_adc_peripheral.h" - -#define TEST_PORT JZ_GPIO_PORT_B -#define TEST_PIN 26 - -int -main () -{ - int i,j; - JZ_PIO *pio; - JZ_REG *virt_addr; - - pio = jz_gpio_map (TEST_PORT); - jz_gpio_as_func (pio, TEST_PIN, 0); - - virt_addr = (JZ_REG *) (jz_mmap (0x13010000) + 0x18); - - if (*virt_addr != 0x0FFF7700) - { - *virt_addr = 0x0FFF7700; - printf ("Configuring CS2 32 bits and 0 WS: %08X\n", *virt_addr); - } - else - printf ("CS2, already configured: %08X\n", *virt_addr); - - virt_addr = (JZ_REG *) jz_mmap (0x14000000); - - /*************************Clean FPGA RAM memory****************************/ - for (i = 0; i < 512; i++) //RAMB16_s9_s9 has 2048 bytes 8-bit - { - virt_addr[i] = 0x00000000; //Clean 4 register by cicle - } - - /****************Configure ADC register on FPGA RAM memory*****************/ - uchar LENB = 0x01; // 1 read/cmd - jz_adc_config(virt_addr, LENB, ADC_SPI_CLKDIV_MAX, ADC_CMD_SET_SPI_CLKDIV); - usleep (100); - jz_adc_config(virt_addr, LENB, ADC_SPI_CLKDIV_MAX, ADC_CMD_SET_FAST_CONV); - usleep (100); - printf("\nADC in Fast Convertion Mode (10us) and Fs=9.8KHz (Min)\n"); - - LENB = ADC_MAX_BUFFER; // 254 read/cmd - - /******************************* TEST 1 ***********************************/ - printf("\nINIT TEST1: Autoselft {(Vref+) - (Vref-)}/2 -> Return 0x0200 \n"); - jz_adc_config(virt_addr, LENB, ADC_SPI_CLKDIV_MAX, ADC_CMD_SET_AUTOSELFT_1); - usleep (100); - jz_adc_config(virt_addr, LENB, ADC_SPI_CLKDIV_MAX, ADC_CMD_READ_AUTOSELFT_1); - printf("[%08X]", virt_addr[0]); - while(jz_adc_check_buffer(virt_addr)) - { - printf("[%08X]-", virt_addr[0]); - fflush (stdout); - usleep (10000); - } - for(i=1; i< LENB/2+1; i++) - printf("[%08X]", virt_addr[i]); - - /******************************* TEST 2 ***********************************/ - printf("\n\nINIT TEST2: Autoselft (Vref-) -> Return 0x0000 \n"); - jz_adc_config(virt_addr, LENB, ADC_SPI_CLKDIV_MAX, ADC_CMD_SET_AUTOSELFT_2); - usleep (100); - jz_adc_config(virt_addr, LENB, ADC_SPI_CLKDIV_MAX, ADC_CMD_READ_AUTOSELFT_2); - while(jz_adc_check_buffer(virt_addr)){usleep (100);} - for(i=1; i< LENB/2+1; i++) - printf("[%08X]", virt_addr[i]); - - /******************************* TEST 3 ***********************************/ - printf("\n\nINIT TEST3: Autoselft (Vref+) -> Return 0x03FF \n"); - jz_adc_config(virt_addr, LENB, ADC_SPI_CLKDIV_MAX, ADC_CMD_SET_AUTOSELFT_3); - usleep (100); - jz_adc_config(virt_addr, LENB, ADC_SPI_CLKDIV_MAX, ADC_CMD_READ_AUTOSELFT_3); - while(jz_adc_check_buffer(virt_addr)){usleep (100);} - for(i=1; i< LENB/2+1; i++) - printf("[%08X]", virt_addr[i]); - - printf("\n\nTESTS complete\n"); - - LENB = 0x01; // 1 read/cmd - jz_adc_config(virt_addr, LENB, ADC_SPI_CLKDIV_MAX, ADC_CMD_SET_POWER_DOWN); - printf("\nADC in Power Down Mode \n"); - - return 0; -} - - diff --git a/docs/wiki/.~lock.ADC.odg# b/docs/wiki/.~lock.ADC.odg# deleted file mode 100644 index 66c0037..0000000 --- a/docs/wiki/.~lock.ADC.odg# +++ /dev/null @@ -1 +0,0 @@ -Juan64Bits ,juan64bits,Maximus,07.04.2010 18:22,file:///home/juan64bits/.openoffice.org/3; \ No newline at end of file diff --git a/docs/wiki/ADC.odg b/docs/wiki/ADC.odg index a0afee9e13a5ef50c03fda2c7c14825a185f69d0..43f4f288225eafc7e687740f4bd9d8f30cb665f5 100644 GIT binary patch delta 18737 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 delta 16705 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 Zoq<6VMbSOq$p=EkC(A?&ux0pzWB^-@Ott_3