##// END OF EJS Templates
Added OpenOCD target for olimex-arm-usb-tiny....
jeandet -
r103:3311a844031e dev_alexis
parent child
Show More
@@ -0,0 +1,4
1 [Paths]
2 Prefix=..
3 Examples=../../Examples/Qt-5.4
4 Documentation=../../Docs/Qt-5.4
This diff has been collapsed as it changes many lines, (1227 lines changed) Show them Hide them
@@ -0,0 +1,1227
1 #!/usr/bin/env perl
2 #############################################################################
3 ##
4 ## Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
5 ## Contact: http://www.qt-project.org/legal
6 ##
7 ## This file is part of the build configuration tools of the Qt Toolkit.
8 ##
9 ## $QT_BEGIN_LICENSE:LGPL$
10 ## Commercial License Usage
11 ## Licensees holding valid commercial Qt licenses may use this file in
12 ## accordance with the commercial license agreement provided with the
13 ## Software or, alternatively, in accordance with the terms contained in
14 ## a written agreement between you and Digia. For licensing terms and
15 ## conditions see http://qt.digia.com/licensing. For further information
16 ## use the contact form at http://qt.digia.com/contact-us.
17 ##
18 ## GNU Lesser General Public License Usage
19 ## Alternatively, this file may be used under the terms of the GNU Lesser
20 ## General Public License version 2.1 as published by the Free Software
21 ## Foundation and appearing in the file LICENSE.LGPL included in the
22 ## packaging of this file. Please review the following information to
23 ## ensure the GNU Lesser General Public License version 2.1 requirements
24 ## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
25 ##
26 ## In addition, as a special exception, Digia gives you certain additional
27 ## rights. These rights are described in the Digia Qt LGPL Exception
28 ## version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
29 ##
30 ## GNU General Public License Usage
31 ## Alternatively, this file may be used under the terms of the GNU
32 ## General Public License version 3.0 as published by the Free Software
33 ## Foundation and appearing in the file LICENSE.GPL included in the
34 ## packaging of this file. Please review the following information to
35 ## ensure the GNU General Public License version 3.0 requirements will be
36 ## met: http://www.gnu.org/copyleft/gpl.html.
37 ##
38 ##
39 ## $QT_END_LICENSE$
40 ##
41 #############################################################################
42
43 #
44 # Synchronizes Qt header files - internal development tool.
45 #
46
47 # use packages -------------------------------------------------------
48 use File::Basename;
49 use File::Path;
50 use File::Spec;
51 use Cwd;
52 use Cwd 'abs_path';
53 use Config;
54 use strict;
55 use warnings;
56 use English qw(-no_match_vars );
57
58 my $normalizePath_fixDrive = ($^O eq "msys" ? 1 : 0);
59
60 ######################################################################
61 # Syntax: normalizePath(\$path)
62 # Params: Reference to a path that's going to be normalized.
63 #
64 # Purpose: Converts the path into a form that can be used as include
65 # path from C++ sources and qmake's .pro files.
66 # Only relevant on Windows.
67 # Returns: -none-
68 ######################################################################
69 sub normalizePath {
70 my $s = shift;
71 $$s =~ s=\\=/=g;
72 if ($normalizePath_fixDrive && ($$s =~ m,^/([a-zA-Z])/(.*), || $$s =~ m,^([a-zA-Z]):/(.*),)) {
73 $$s = lc($1) . ":/$2";
74 }
75 }
76
77 # set output basedir to be where ever syncqt is run from
78 our $out_basedir = getcwd();
79 normalizePath(\$out_basedir);
80 our $basedir;
81 our $quoted_basedir;
82
83 # Make sure we use Windows line endings for chomp and friends on Windows.
84 $INPUT_RECORD_SEPARATOR = "\r\n" if ($^O eq "msys");
85
86 # will be defined based on the modules sync.profile
87 our (%modules, %moduleheaders, @allmoduleheadersprivate, %classnames, %deprecatedheaders);
88 our @qpa_headers = ();
89
90 # will be derived from sync.profile
91 our %reverse_classnames = ();
92
93 # global variables (modified by options)
94 my $isunix = 0;
95 my $module = 0;
96 my $showonly = 0;
97 my $verbose_level = 1;
98 my $remove_stale = 1;
99 my $force_win = 0;
100 my $force_relative = 0;
101 my $check_includes = 0;
102 my $copy_headers = 0;
103 my $create_private_headers = 1;
104 my $minimal = 0;
105 my $module_version = 0;
106 my @modules_to_sync ;
107 $force_relative = 1 if ( -d "/System/Library/Frameworks" );
108
109
110 # functions ----------------------------------------------------------
111
112 ######################################################################
113 # Syntax: showUsage()
114 # Params: -none-
115 #
116 # Purpose: Show the usage of the script.
117 # Returns: -none-
118 ######################################################################
119 sub showUsage
120 {
121 print "$0 usage:\n";
122 print " <module directory> Specifies which module to sync header files for (required for shadow builds!)\n\n";
123
124 print " -copy Copy headers instead of include-fwd(default: " . ($copy_headers ? "yes" : "no") . ")\n";
125 print " -remove-stale Removes stale headers (default: " . ($remove_stale ? "yes" : "no") . ")\n";
126 print " -relative Force relative symlinks (default: " . ($force_relative ? "yes" : "no") . ")\n";
127 print " -windows Force platform to Windows (default: " . ($force_win ? "yes" : "no") . ")\n";
128 print " -showonly Show action but not perform (default: " . ($showonly ? "yes" : "no") . ")\n";
129 print " -minimal Do not create CamelCase headers (default: " . ($minimal ? "yes" : "no") . ")\n";
130 print " -outdir <PATH> Specify output directory for sync (default: $out_basedir)\n";
131 print " -version <VERSION> Specify the module's version (default: detect from qglobal.h)\n";
132 print " -quiet Only report problems, not activity (same as -verbose 0)\n";
133 print " -v, -verbose <level> Sets the verbosity level (max. 4) (default: $verbose_level)\n";
134 print " The short form increases the level by +1\n";
135 print " -separate-module <NAME>:<PROFILEDIR>:<HEADERDIR>\n";
136 print " Create headers for <NAME> with original headers in\n";
137 print " <HEADERDIR> relative to <PROFILEDIR> \n";
138 print " -private Force copy private headers (default: " . ($create_private_headers ? "yes" : "no") . ")\n";
139 print " -help This help\n";
140 exit 0;
141 }
142
143 ######################################################################
144 # Syntax: checkUnix()
145 # Params: -none-
146 #
147 # Purpose: Check if script runs on a Unix system or not. Cygwin
148 # systems are _not_ detected as Unix systems.
149 # Returns: 1 if a unix system, else 0.
150 ######################################################################
151 sub checkUnix {
152 my ($r) = 0;
153 if ( $force_win != 0) {
154 return 0;
155 } elsif ( -f "/bin/uname" ) {
156 $r = 1;
157 (-f "\\bin\\uname") && ($r = 0);
158 } elsif ( -f "/usr/bin/uname" ) {
159 $r = 1;
160 (-f "\\usr\\bin\\uname") && ($r = 0);
161 }
162 if($r) {
163 $_ = $Config{'osname'};
164 $r = 0 if( /(ms)|(cyg)win/i );
165 }
166 return $r;
167 }
168
169 sub checkRelative {
170 my ($dir) = @_;
171 return 0 if($dir =~ /^\//);
172 return 0 if(!checkUnix() && $dir =~ /[a-zA-Z]:[\/\\]/);
173 return 1;
174 }
175
176 ######################################################################
177 # Syntax: shouldMasterInclude(iheader)
178 # Params: iheader, string, filename to verify inclusion
179 #
180 # Purpose: Determines if header should be in the master include file.
181 # Returns: 0 if file contains "#pragma qt_no_master_include" or not
182 # able to open, else 1.
183 ######################################################################
184 sub shouldMasterInclude {
185 my ($iheader) = @_;
186 return 0 if (basename($iheader) =~ /_/);
187 return 0 if (basename($iheader) =~ /qconfig/);
188 if (open(F, "<$iheader")) {
189 while (<F>) {
190 chomp;
191 return 0 if (/^\#pragma qt_no_master_include$/);
192 }
193 close(F);
194 } else {
195 return 0;
196 }
197 return 1;
198 }
199
200 ######################################################################
201 # Syntax: classNames(iheader)
202 # Params: iheader, string, filename to parse for classname "symlinks"
203 #
204 # Purpose: Scans through iheader to find all classnames that should be
205 # synced into library's include structure.
206 # Returns: List of all class names in a file.
207 ######################################################################
208 sub classNames {
209 my @ret;
210 my ($iheader) = @_;
211
212 my $ihdrbase = basename($iheader);
213 my $classname = $classnames{$ihdrbase};
214 push @ret, split(/,/, $classname) if ($classname);
215
216 my $parsable = "";
217 if(open(F, "<$iheader")) {
218 while(<F>) {
219 my $line = $_;
220 chomp $line;
221 chop $line if ($line =~ /\r$/);
222 if($line =~ /^\#/) {
223 return @ret if($line =~ m/^#pragma qt_sync_stop_processing/);
224 push(@ret, $1) if($line =~ m/^#pragma qt_class\(([^)]*)\)[\r\n]*$/);
225 $line = 0;
226 }
227 if($line) {
228 $line =~ s,//.*$,,; #remove c++ comments
229 $line .= ";" if($line =~ m/^Q_[A-Z_]*\(.*\)[\r\n]*$/); #qt macro
230 $line .= ";" if($line =~ m/^QT_(BEGIN|END)_HEADER[\r\n]*$/); #qt macro
231 $line .= ";" if($line =~ m/^QT_(BEGIN|END)_NAMESPACE(_[A-Z]+)*[\r\n]*$/); #qt macro
232 $line .= ";" if($line =~ m/^QT_MODULE\(.*\)[\r\n]*$/); # QT_MODULE macro
233 $parsable .= " " . $line;
234 }
235 }
236 close(F);
237 }
238
239 my $last_definition = 0;
240 my @namespaces;
241 for(my $i = 0; $i < length($parsable); $i++) {
242 my $definition = 0;
243 my $character = substr($parsable, $i, 1);
244 if($character eq "/" && substr($parsable, $i+1, 1) eq "*") { #I parse like this for greedy reasons
245 for($i+=2; $i < length($parsable); $i++) {
246 my $end = substr($parsable, $i, 2);
247 if($end eq "*/") {
248 $last_definition = $i+2;
249 $i++;
250 last;
251 }
252 }
253 } elsif($character eq "{") {
254 my $brace_depth = 1;
255 my $block_start = $i + 1;
256 BLOCK: for($i+=1; $i < length($parsable); $i++) {
257 my $ignore = substr($parsable, $i, 1);
258 if($ignore eq "{") {
259 $brace_depth++;
260 } elsif($ignore eq "}") {
261 $brace_depth--;
262 unless($brace_depth) {
263 for(my $i2 = $i+1; $i2 < length($parsable); $i2++) {
264 my $end = substr($parsable, $i2, 1);
265 if($end eq ";" || $end ne " ") {
266 $definition = substr($parsable, $last_definition, $block_start - $last_definition) . "}";
267 $i = $i2 if($end eq ";");
268 $last_definition = $i + 1;
269 last BLOCK;
270 }
271 }
272 }
273 }
274 }
275 } elsif($character eq ";") {
276 $definition = substr($parsable, $last_definition, $i - $last_definition + 1);
277 $last_definition = $i + 1;
278 } elsif($character eq "}") {
279 # a naked } must be a namespace ending
280 # if it's not a namespace, it's eaten by the loop above
281 pop @namespaces;
282 $last_definition = $i + 1;
283 }
284
285 if (substr($parsable, $last_definition, $i - $last_definition + 1) =~ m/ namespace ([^ ]*) /
286 && substr($parsable, $i+1, 1) eq "{") {
287 push @namespaces, $1;
288
289 # Eat the opening { so that the condensing loop above doesn't see it
290 $i++;
291 $last_definition = $i + 1;
292 }
293
294 if($definition) {
295 $definition =~ s=[\n\r]==g;
296 my @symbols;
297 my $post_kw = qr/Q_DECL_FINAL|final|sealed/; # add here macros and keywords that go after the class-name of a class definition
298 if($definition =~ m/^ *typedef *.*\(\*([^\)]*)\)\(.*\);$/) {
299 push @symbols, $1;
300 } elsif($definition =~ m/^ *typedef +(.*) +([^ ]*);$/) {
301 push @symbols, $2;
302 } elsif($definition =~ m/^ *(template *<.*> *)?(class|struct) +([^ <>]* +)?((?!$post_kw)[^<\s]+) ?(<[^>]*> ?)?\s*(?:$post_kw)?\s*((,|:)\s*(public|protected|private) *.*)? *\{\}$/o) {
303 push @symbols, $4;
304 } elsif($definition =~ m/^ *Q_DECLARE_.*ITERATOR\((.*)\);$/) {
305 push @symbols, "Q" . $1 . "Iterator";
306 push @symbols, "QMutable" . $1 . "Iterator";
307 }
308
309 our $publicclassregexp;
310 foreach my $symbol (@symbols) {
311 $symbol = (join("::", @namespaces) . "::" . $symbol) if (scalar @namespaces);
312
313 my $revhdr = $reverse_classnames{$symbol};
314 next if (defined($revhdr) and $revhdr ne $ihdrbase);
315 if ($symbol =~ /^Q[^:]*$/) { # no-namespace, starting with Q
316 push @ret, $symbol;
317 } elsif (defined($publicclassregexp)) {
318 push @ret, $symbol if ($symbol =~ $publicclassregexp);
319 }
320 }
321 }
322 }
323 return @ret;
324 }
325
326 sub make_path {
327 my ($dir, $lib, $be_verbose) = @_;
328 unless(-e $dir) {
329 mkpath $dir;
330 $dir = "<outbase>" . substr($dir, length($out_basedir)) if ($be_verbose < 3);
331 print "$lib: mkpath $dir\n" if ($be_verbose > 1);
332 }
333 }
334
335 ######################################################################
336 # Syntax: syncHeader(header, iheader, copy, timestamp)
337 # Params: header, string, filename to create "symlink" for
338 # iheader, string, destination name of symlink
339 # copy, forces header to be a copy of iheader
340 # timestamp, the requested modification time if copying
341 #
342 # Purpose: Syncronizes header to iheader
343 # Returns: 1 if successful, else 0.
344 ######################################################################
345 sub syncHeader {
346 my ($lib, $header, $iheader, $copy, $ts) = @_;
347 normalizePath(\$iheader);
348 normalizePath(\$header);
349 return copyFile($lib, $iheader, $header) if($copy);
350
351 unless(-e $header) {
352 my $header_dir = dirname($header);
353 make_path($header_dir, $lib, $verbose_level);
354
355 #write it
356 my $iheader_out = fixPaths($iheader, $header_dir);
357 open(HEADER, ">$header") || die "Could not open $header for writing: $!\n";
358 print HEADER "#include \"$iheader_out\"\n";
359 close HEADER;
360 if(defined($ts)) {
361 utime(time, $ts, $header) or die "$iheader, $header";
362 }
363 return 1;
364 }
365 return 0;
366 }
367
368 ######################################################################
369 # Syntax: fixPaths(file, dir)
370 # Params: file, string, filepath to be made relative to dir
371 # dir, string, dirpath for point of origin
372 #
373 # Purpose: file is made relative (if possible) of dir.
374 # Returns: String with the above applied conversion.
375 ######################################################################
376
377 sub cleanupPath {
378 my ($file) = @_;
379 normalizePath(\$file);
380 while ($file =~ s,/[^/]+/\.\./,/,) {}
381 return $file;
382 }
383
384 sub fixPaths {
385 my ($file, $dir) = @_;
386
387 my $out = File::Spec->abs2rel(cleanupPath($file), cleanupPath($dir));
388 $out =~ s,\\,/,g;
389 return $out;
390 }
391
392 ######################################################################
393 # Syntax: fileContents(filename)
394 # Params: filename, string, filename of file to return contents
395 #
396 # Purpose: Get the contents of a file.
397 # Returns: String with contents of the file, or empty string if file
398 # doens't exist.
399 # Warning: Dies if it does exist but script cannot get read access.
400 ######################################################################
401 sub fileContents {
402 my ($filename) = @_;
403 my $filecontents = "";
404 if (-e $filename) {
405 open(I, "< $filename") || die "Could not open $filename for reading, read block?";
406 local $/;
407 binmode I;
408 $filecontents = <I>;
409 close I;
410 }
411 return $filecontents;
412 }
413
414 ######################################################################
415 # Syntax: writeFile(filename, contents)
416 # Params: filename, string, filename of file to write
417 # contents, string, new contents for the file
418 #
419 # Purpose: Write file with given contents. If new contents match old
420 # ones, do no change the file's timestamp.
421 # Returns: 1 if the file's contents changed.
422 ######################################################################
423 sub writeFile {
424 my ($filename, $contents, $lib, $what) = @_;
425 my $oldcontents = fileContents($filename);
426 $oldcontents =~ s/\r//g; # remove \r's , so comparison is ok on all platforms
427 if ($oldcontents ne $contents) {
428 open(O, "> " . $filename) || die "Could not open $filename for writing: $!\n";
429 print O $contents;
430 close O;
431 if ($lib && $verbose_level) {
432 my $action = ($oldcontents eq "") ? "created" : "updated";
433 print "$lib: $action $what\n";
434 }
435 return 1;
436 }
437 return 0;
438 }
439
440 ######################################################################
441 # Syntax: fileCompare(file1, file2)
442 # Params: file1, string, filename of first file
443 # file2, string, filename of second file
444 #
445 # Purpose: Determines if files are equal, and which one is newer.
446 # Returns: 0 if files are equal no matter the timestamp, -1 if file1
447 # is newer, 1 if file2 is newer.
448 ######################################################################
449 sub fileCompare {
450 my ($file1, $file2) = @_;
451 my $file1contents = fileContents($file1);
452 my $file2contents = fileContents($file2);
453 if (! -e $file1) { return 1; }
454 if (! -e $file2) { return -1; }
455 return $file1contents ne $file2contents ? (stat($file2))[9] <=> (stat($file1))[9] : 0;
456 }
457
458 ######################################################################
459 # Syntax: copyFile(file, ifile)
460 # Params: file, string, filename to create duplicate for
461 # ifile, string, destination name of duplicate
462 #
463 # Purpose: Keeps files in sync so changes in the newer file will be
464 # written to the other.
465 # Returns: 1 if files were synced, else 0.
466 # Warning: Dies if script cannot get write access.
467 ######################################################################
468 sub copyFile
469 {
470 my ($lib, $file,$ifile, $copy,$knowdiff,$filecontents,$ifilecontents) = @_;
471 # Bi-directional synchronization
472 open( I, "< " . $file ) || die "Could not open $file for reading";
473 local $/;
474 binmode I;
475 $filecontents = <I>;
476 close I;
477 if ( open(I, "< " . $ifile) ) {
478 local $/;
479 binmode I;
480 $ifilecontents = <I>;
481 close I;
482 $copy = fileCompare($file, $ifile);
483 $knowdiff = 0,
484 } else {
485 $copy = -1;
486 $knowdiff = 1;
487 }
488
489 if ( $knowdiff || ($filecontents ne $ifilecontents) ) {
490 if ( $copy > 0 ) {
491 my $file_dir = dirname($file);
492 make_path($file_dir, $lib, $verbose_level);
493 open(O, "> " . $file) || die "Could not open $file for writing (no write permission?)";
494 local $/;
495 binmode O;
496 print O $ifilecontents;
497 close O;
498 utime time, (stat($ifile))[9], $file;
499 return 1;
500 } elsif ( $copy < 0 ) {
501 my $ifile_dir = dirname($ifile);
502 make_path($ifile_dir, $lib, $verbose_level);
503 open(O, "> " . $ifile) || die "Could not open $ifile for writing (no write permission?)";
504 local $/;
505 binmode O;
506 print O $filecontents;
507 close O;
508 utime time, (stat($file))[9], $ifile;
509 return 1;
510 }
511 }
512 return 0;
513 }
514
515 ######################################################################
516 # Syntax: findFiles(dir, match, descend)
517 # Params: dir, string, directory to search for name
518 # match, string, regular expression to match in dir
519 # descend, integer, 0 = non-recursive search
520 # 1 = recurse search into subdirectories
521 #
522 # Purpose: Finds files matching a regular expression.
523 # Returns: List of matching files.
524 #
525 # Examples:
526 # findFiles("/usr","\.cpp$",1) - finds .cpp files in /usr and below
527 # findFiles("/tmp","^#",0) - finds #* files in /tmp
528 ######################################################################
529 sub findFiles {
530 my ($dir,$match,$descend) = @_;
531 my ($file,$p,@files);
532 local(*D);
533 normalizePath(\$dir);
534 ($dir eq "") && ($dir = ".");
535 if ( opendir(D,$dir) ) {
536 if ( $dir eq "." ) {
537 $dir = "";
538 } else {
539 ($dir =~ /\/$/) || ($dir .= "/");
540 }
541 foreach $file ( sort readdir(D) ) {
542 next if ( $file =~ /^\.\.?$/ );
543 $p = $file;
544 ($file =~ /$match/) && (push @files, $p);
545 if ( $descend && -d $p && ! -l $p ) {
546 push @files, &findFiles($p,$match,$descend);
547 }
548 }
549 closedir(D);
550 }
551 return @files;
552 }
553
554 sub listSubdirs {
555 my @subdirs = @_;
556 foreach my $subdir (@subdirs) {
557 opendir DIR, $subdir or die "Huh, directory ".$subdir." cannot be opened.";
558 foreach my $t (sort readdir(DIR)) {
559 push @subdirs, "$subdir/$t" if(-d "$subdir/$t" && !($t eq ".") &&
560 !($t eq "..") && !($t eq ".obj") &&
561 !($t eq ".moc") && !($t eq ".rcc") &&
562 !($t eq ".uic") && !($t eq "build") &&
563 !($t eq "doc"));
564 }
565 closedir DIR;
566 }
567 return @subdirs;
568 }
569
570 ######################################################################
571 # Syntax: loadSyncProfile()
572 #
573 # Purpose: Locates the sync.profile.
574 # Returns: Hashmap of module name -> directory.
575 ######################################################################
576 sub loadSyncProfile {
577 my ($srcbase, $outbase) = @_;
578 if ($verbose_level) {
579 print("<srcbase> = $$srcbase \n");
580 print("<outbase> = $$outbase \n");
581 }
582
583 my $syncprofile = "$$srcbase/sync.profile";
584 my $result;
585 unless ($result = do "$syncprofile") {
586 die "syncqt couldn't parse $syncprofile: $@" if $@;
587 die "syncqt couldn't execute $syncprofile: $!" unless defined $result;
588 }
589
590 for my $fn (keys %classnames) {
591 for my $cn (split(/,/, $classnames{$fn})) {
592 $reverse_classnames{$cn} = $fn;
593 }
594 }
595
596 return $result;
597 }
598
599 sub basePrettify {
600 my ($arg) = @_;
601 $$arg =~ s,^\Q$basedir\E,<srcbase>,;
602 $$arg =~ s,^\Q$out_basedir\E,<outbase>,;
603 }
604
605 sub cleanPath {
606 my ($arg) = @_;
607 while ($arg =~ s,[^/]+/\.\.(/|$),,) {}
608 return $arg;
609 }
610
611 sub locateSyncProfile
612 {
613 my ($directory) = @_;
614 $directory = abs_path($directory);
615 while (1) {
616 my $file = $directory."/sync.profile";
617 return $file if (-e $file);
618 my $odir = $directory;
619 $directory = dirname($directory);
620 return undef if ($directory eq $odir);
621 }
622 }
623
624 sub isQpaHeader
625 {
626 my ($header) = @_;
627 foreach my $qpa_header (@qpa_headers) {
628 return 1 if ($header =~ $qpa_header);
629 }
630 return 0;
631 }
632
633 # check if this is an in-source build, and if so use that as the basedir too
634 $basedir = locateSyncProfile($out_basedir);
635 if ($basedir) {
636 $basedir = dirname($basedir) ;
637 normalizePath(\$basedir);
638 $quoted_basedir = "\Q$basedir";
639 }
640
641 # --------------------------------------------------------------------
642 # "main" function
643 # --------------------------------------------------------------------
644
645 while ( @ARGV ) {
646 my $var = 0;
647 my $val = 0;
648
649 #parse
650 my $arg = shift @ARGV;
651 if ($arg eq "-h" || $arg eq "-help" || $arg eq "-?" || $arg eq "?") {
652 $var = "show_help";
653 $val = "yes";
654 } elsif($arg eq "-copy") {
655 $var = "copy";
656 $val = "yes";
657 } elsif($arg eq "-o" || $arg eq "-outdir") {
658 $var = "output";
659 $val = shift @ARGV;
660 } elsif($arg eq "-showonly" || $arg eq "-remove-stale" || $arg eq "-windows" ||
661 $arg eq "-relative" || $arg eq "-check-includes") {
662 $var = substr($arg, 1);
663 $val = "yes";
664 } elsif($arg =~ /^-no-(.*)$/) {
665 $var = $1;
666 $val = "no";
667 #these are for commandline compat
668 } elsif($arg eq "-inc") {
669 $var = "output";
670 $val = shift @ARGV;
671 } elsif($arg eq "-module") {
672 $var = "module";
673 $val = shift @ARGV;
674 } elsif($arg eq "-separate-module") {
675 $var = "separate-module";
676 $val = shift @ARGV;
677 } elsif($arg eq "-show") {
678 $var = "showonly";
679 $val = "yes";
680 } elsif($arg eq "-quiet") {
681 $var = "verbose";
682 $val = "0";
683 } elsif($arg eq "-v") {
684 $var = "verbose";
685 $val = "yes";
686 } elsif($arg eq "-verbose") {
687 $var = "verbose";
688 $val = shift @ARGV;
689 } elsif($arg eq "-minimal") {
690 $var = "minimal";
691 $val = "yes";
692 } elsif($arg eq "-private") {
693 $var = "create_private_headers";
694 $val = "yes";
695 } elsif($arg eq "-version") {
696 $var = "version";
697 $val = shift @ARGV;
698 } elsif($arg =~/^-/) {
699 print "Unknown option: $arg\n\n" if(!$var);
700 showUsage();
701 } else {
702 $basedir = locateSyncProfile($arg);
703 die "Could not find a sync.profile for '$arg'\n" if (!$basedir);
704 $basedir = dirname($basedir);
705 normalizePath(\$basedir);
706 $quoted_basedir = "\Q$basedir";
707 $var = "ignore";
708 }
709
710 #do something
711 if(!$var || $var eq "show_help") {
712 print "Unknown option: $arg\n\n" if(!$var);
713 showUsage();
714 } elsif ($var eq "copy") {
715 if($val eq "yes") {
716 $copy_headers++;
717 } elsif($showonly) {
718 $copy_headers--;
719 }
720 } elsif ($var eq "showonly") {
721 if($val eq "yes") {
722 $showonly++;
723 } elsif($showonly) {
724 $showonly--;
725 }
726 } elsif ($var eq "verbose") {
727 if($val eq "yes") {
728 $verbose_level++;
729 } elsif($val eq "no" && $verbose_level) {
730 $verbose_level--;
731 } else {
732 $verbose_level = int($val);
733 }
734 } elsif ($var eq "check-includes") {
735 if($val eq "yes") {
736 $check_includes++;
737 } elsif($check_includes) {
738 $check_includes--;
739 }
740 } elsif ($var eq "remove-stale") {
741 if($val eq "yes") {
742 $remove_stale++;
743 } elsif($remove_stale) {
744 $remove_stale--;
745 }
746 } elsif ($var eq "windows") {
747 if($val eq "yes") {
748 $force_win++;
749 } elsif($force_win) {
750 $force_win--;
751 }
752 } elsif ($var eq "relative") {
753 if($val eq "yes") {
754 $force_relative++;
755 } elsif($force_relative) {
756 $force_relative--;
757 }
758 } elsif ($var eq "minimal") {
759 if($val eq "yes") {
760 $minimal++;
761 } elsif($minimal) {
762 $minimal--;
763 }
764 } elsif ($var eq "module") {
765 push @modules_to_sync, $val;
766 } elsif ($var eq "separate-module") {
767 my ($module, $prodir, $headerdir) = split(/:/, $val);
768 $modules{$module} = $prodir;
769 push @modules_to_sync, $module;
770 $moduleheaders{$module} = $headerdir;
771 } elsif ($var eq "version") {
772 if($val) {
773 $module_version = $val;
774 } else {
775 die "The -version option requires an argument";
776 }
777 } elsif ($var eq "output") {
778 my $outdir = $val;
779 if(checkRelative($outdir)) {
780 $out_basedir = getcwd();
781 chomp $out_basedir;
782 $out_basedir .= "/" . $outdir;
783 } else {
784 $out_basedir = $outdir;
785 }
786 normalizePath(\$out_basedir);
787 }
788 }
789
790 # if we have no $basedir we cannot be sure which sources you want, so die
791 die "Could not find any sync.profile for your module!\nPass <module directory> to syncqt to sync your header files.\nsyncqt failed" if (!$basedir);
792
793 our @ignore_headers = ();
794 our @ignore_for_master_contents = ();
795 our @ignore_for_include_check = ();
796 our @ignore_for_qt_begin_namespace_check = ();
797 our @ignore_for_qt_module_check = ();
798 our %inject_headers = ();
799
800 # load the module's sync.profile here, before we can
801 loadSyncProfile(\$basedir, \$out_basedir);
802
803 @modules_to_sync = keys(%modules) if($#modules_to_sync == -1);
804
805 my %allmoduleheadersprivate = map { $_ => 1 } @allmoduleheadersprivate;
806
807 $isunix = checkUnix; #cache checkUnix
808
809 if (!$module_version) {
810 my $filco = fileContents($basedir."/src/corelib/global/qglobal.h");
811 if ($filco !~ m,.*^#[ \t]*define[ \t]+QT_VERSION_STR[ \t]+"([^"]+)".*,sm) {
812 die "Cannot determine Qt/Module version. Use -version.\n";
813 }
814 $module_version = $1;
815 }
816 foreach my $lib (@modules_to_sync) {
817 die "No such module: $lib" unless(defined $modules{$lib});
818
819 #iteration info
820 my $module = $modules{$lib};
821 my $is_qt = !($module =~ s/^!//);
822 my @dirs = split(/;/, $module);
823 my $dir = $dirs[0];
824
825 my $pathtoheaders = "";
826 $pathtoheaders = $moduleheaders{$lib} if ($moduleheaders{$lib});
827
828 my $allheadersprivate = 0;
829 $allheadersprivate = 1 if $allmoduleheadersprivate{$lib};
830
831 #information used after the syncing
832 my $pri_install_classes = "";
833 my $pri_install_files = "";
834 my $pri_install_pfiles = "";
835 my $pri_install_qpafiles = "";
836 my $pri_injections = "";
837
838 my $libcapitals = uc($lib);
839 my $master_contents =
840 "#ifndef QT_".$libcapitals."_MODULE_H\n" .
841 "#define QT_".$libcapitals."_MODULE_H\n" .
842 "#include <$lib/${lib}Depends>\n";
843
844 #remove the old files
845 if($remove_stale) {
846 my %injections = ();
847 for my $p (keys %inject_headers) {
848 next unless ($p =~ /^\Q$dir\E(\/|$)/);
849 my $sp = $p;
850 $sp =~ s,^\Q$basedir\E/,$out_basedir/,;
851 for my $n (@{$inject_headers{$p}}) {
852 $injections{$sp."/".$n} = 1;
853 }
854 }
855 my @subdirs = ("$out_basedir/include/$lib");
856 foreach my $subdir (@subdirs) {
857 if (opendir DIR, $subdir) {
858 foreach my $t (sort { $b cmp $a } readdir(DIR)) {
859 my $file = "$subdir/$t";
860 if(-d $file) {
861 push @subdirs, $file unless($t eq "." || $t eq "..");
862 } else {
863 my @files = ($file);
864 #push @files, "$out_basedir/include/Qt/$t" if(-e "$out_basedir/include/Qt/$t");
865 foreach my $file (@files) {
866 my $remove_file = 0;
867 if(open(F, "<$file")) {
868 while(my $line = <F>) {
869 chomp $line;
870 if($line =~ /^\#include \"([^\"]*)\"$/) {
871 my $include = $1;
872 $include = $subdir . "/" . $include unless(substr($include, 0, 1) eq "/");
873 $remove_file = 1 unless(-e $include or defined $injections{cleanPath($include)});
874 } else {
875 $remove_file = 0;
876 last;
877 }
878 }
879 close(F);
880 unlink $file if($remove_file);
881 }
882 }
883 }
884 }
885 closedir DIR;
886 }
887
888 }
889 }
890
891 #create the new ones
892 foreach my $current_dir (@dirs) {
893 my $thisprivate = 0;
894 ($current_dir =~ s/^\^//) and $thisprivate = 1;
895 my @headers_paths = split(/;/, $pathtoheaders);
896 if (@headers_paths) {
897 @headers_paths = map { "$current_dir/$_" } @headers_paths;
898 } else {
899 push @headers_paths, $current_dir;
900 }
901
902 foreach my $headers_dir (@headers_paths) {
903 #calc subdirs
904 my @subdirs = listSubdirs($headers_dir);
905
906 #calc files and "copy" them
907 foreach my $subdir (@subdirs) {
908 my @headers = findFiles($subdir, "^[-a-z0-9_]*\\.h\$" , 0);
909 if (defined $inject_headers{$subdir}) {
910 foreach my $if (@{$inject_headers{$subdir}}) {
911 @headers = grep(!/^\Q$if\E$/, @headers); #in case we configure'd previously
912 push @headers, "*".$if;
913 }
914 }
915 my $header_dirname = "";
916 foreach my $header (@headers) {
917 my $shadow = ($header =~ s/^\*//);
918 $header = 0 if($header =~ /^ui_.*.h/);
919 foreach (@ignore_headers) {
920 $header = 0 if($header eq $_);
921 }
922 if($header) {
923 my $header_copies = 0;
924 #figure out if it is a public header
925 my $public_header = $header;
926 my $qpa_header = 0;
927 if(isQpaHeader($public_header)) {
928 $public_header = 0;
929 $qpa_header = 1;
930 } elsif($allheadersprivate || $thisprivate || $public_header =~ /_p.h$/ || $public_header =~ /_pch.h$/) {
931 $public_header = 0;
932 } else {
933 foreach (@ignore_for_master_contents) {
934 $public_header = 0 if($header eq $_);
935 }
936 }
937
938 my $iheader = $subdir . "/" . $header;
939 $iheader =~ s/^\Q$basedir\E/$out_basedir/ if ($shadow);
940 my @classes = $public_header && (!$minimal && $is_qt) ? classNames($iheader) : ();
941 if($showonly) {
942 print "$header [$lib]\n";
943 foreach(@classes) {
944 print "SYMBOL: $_\n";
945 }
946 } else {
947 my $ts = $shadow ? 0 : (stat($iheader))[9];
948 #find out all the places it goes..
949 my $oheader;
950 if ($public_header) {
951 $oheader = "$out_basedir/include/$lib/$header";
952 foreach my $full_class (@classes) {
953 my $header_base = basename($header);
954 # Strip namespaces:
955 my $class = $full_class;
956 $class =~ s/^.*:://;
957 # if ($class =~ m/::/) {
958 # class =~ s,::,/,g;
959 # }
960
961 $header_copies++ if (!$shadow && syncHeader($lib, "$out_basedir/include/$lib/$class", "$out_basedir/include/$lib/$header", 0, $ts));
962 }
963 } elsif ($create_private_headers && !$qpa_header) {
964 $oheader = "$out_basedir/include/$lib/$module_version/$lib/private/$header";
965 } elsif ($create_private_headers) {
966 $oheader = "$out_basedir/include/$lib/$module_version/$lib/qpa/$header";
967 }
968 $header_copies++ if (!$shadow && syncHeader($lib, $oheader, $iheader, $copy_headers, $ts));
969
970 my $pri_install_iheader = fixPaths($iheader, $dir);
971 my $injection = "";
972 if($public_header) {
973 #put it into the master file
974 $master_contents .= "#include \"$public_header\"\n" if (!$shadow && shouldMasterInclude($iheader));
975
976 #deal with the install directives
977 foreach my $class (@classes) {
978 # Strip namespaces:
979 $class =~ s/^.*:://;
980 # if ($class =~ m/::/) {
981 # $class =~ s,::,/,g;
982 # }
983 my $class_header = fixPaths("$out_basedir/include/$lib/$class", $dir) . " ";
984 $pri_install_classes .= $class_header
985 unless($pri_install_classes =~ $class_header);
986 $injection .= ":$class";
987 }
988 $pri_install_files.= "$pri_install_iheader ";;
989 }
990 elsif ($qpa_header) {
991 $pri_install_qpafiles.= "$pri_install_iheader ";;
992 }
993 else {
994 $pri_install_pfiles.= "$pri_install_iheader ";;
995 }
996 $pri_injections .= fixPaths($iheader, "$out_basedir/include/$lib")
997 .":".fixPaths($oheader, "$out_basedir/include/$lib")
998 .$injection." " if ($shadow);
999 }
1000
1001 if ($verbose_level && $header_copies) {
1002 my $new_header_dirname = dirname($iheader);
1003 basePrettify(\$new_header_dirname) if ($new_header_dirname && $verbose_level < 2);
1004 my $header_base = basename($iheader);
1005 if ($verbose_level < 3) {
1006 my $line_prefix = ",";
1007 if ($new_header_dirname ne $header_dirname) {
1008 $line_prefix = "$lib: created fwd-include header(s) for $new_header_dirname/ {";
1009 $line_prefix = " }\n".$line_prefix if ($header_dirname);
1010 $header_dirname = $new_header_dirname;
1011 } else {
1012 $line_prefix = ",";
1013 }
1014 print "$line_prefix $header_base ($header_copies)";
1015 } else { # $verbose_level >= 3
1016 basePrettify(\$iheader) if ($verbose_level == 3);
1017 print "$lib: created $header_copies fwd-include headers for $iheader\n";
1018 }
1019 }
1020 }
1021 }
1022 print " }\n" if ($header_dirname && $verbose_level > 0 && $verbose_level < 3);
1023 }
1024 }
1025 }
1026
1027 # close the master include:
1028 $master_contents .=
1029 "#include \"".lc($lib)."version.h\"\n" .
1030 "#endif\n";
1031
1032 unless ($showonly || $minimal || !$is_qt) {
1033 # create deprecated headers
1034 my $first = 1;
1035 while (my ($header, $include) = each %{$deprecatedheaders{$lib}}) {
1036 my $public_header = 0;
1037 $public_header = 1 unless ($allheadersprivate || ($header =~ /_p\.h$/));
1038 next unless ($public_header || $create_private_headers);
1039
1040 my $header_path = "$out_basedir/include/$lib/";
1041 unless ($public_header) {
1042 $header_path .= "$module_version/$lib/private/";
1043 }
1044 $header_path .= "$header";
1045
1046 unless (-e $header_path) {
1047 my $guard = "DEPRECATED_HEADER_" . $lib . "_" . $header;
1048 $guard =~ s/([^a-zA-Z0-9_])/_/g;
1049
1050 my $header_dir = dirname($header_path);
1051 make_path($header_dir, $lib, $verbose_level);
1052
1053 my $hdrcont =
1054 "#ifndef $guard\n" .
1055 "#define $guard\n";
1056 my $warning = "Header <$lib/";
1057 $warning .= "private/" unless ($public_header);
1058 $warning .= "$header> is deprecated. Please include <$include> instead.";
1059 $hdrcont .=
1060 "#if defined(__GNUC__)\n" .
1061 "# warning $warning\n" .
1062 "#elif defined(_MSC_VER)\n" .
1063 "# pragma message (\"$warning\")\n" .
1064 "#endif\n" .
1065 "#include <$include>\n";
1066 if ($public_header) {
1067 $hdrcont .=
1068 "#if 0\n" .
1069 "#pragma qt_no_master_include\n" .
1070 "#endif\n";
1071 }
1072 $hdrcont .=
1073 "#endif\n";
1074 if (writeFile($header_path, $hdrcont)) {
1075 if ($verbose_level < 3) {
1076 my $line_prefix = ",";
1077 $line_prefix = "$lib: created deprecated header(s) {" if ($first);
1078 print "$line_prefix $header";
1079 } else {
1080 print "$lib: created deprecated header $header => $include\n";
1081 }
1082 $first = 0;
1083 }
1084 }
1085
1086 my $addendum = fixPaths($header_path, $dir) . " ";
1087 if ($public_header) {
1088 $pri_install_files .= $addendum;
1089 } else {
1090 $pri_install_pfiles .= $addendum;
1091 }
1092 }
1093 if ($verbose_level < 3) {
1094 print " }\n" unless ($first);
1095 }
1096
1097 # module version header
1098 my $vheader = "$out_basedir/include/$lib/".lc($lib)."version.h";
1099 my $VHeader = "$out_basedir/include/$lib/${lib}Version";
1100 syncHeader($lib, $VHeader, $vheader, 0);
1101 $pri_install_files .= fixPaths($vheader, $dir) . " ";
1102 $pri_install_classes .= fixPaths($VHeader, $dir) . " ";
1103 my @versions = split(/\./, $module_version);
1104 my $modulehexstring = sprintf("0x%02X%02X%02X", $versions[0], $versions[1], $versions[2]);
1105 my $vhdrcont =
1106 "/* This file was generated by syncqt. */\n".
1107 "#ifndef QT_".uc($lib)."_VERSION_H\n".
1108 "#define QT_".uc($lib)."_VERSION_H\n".
1109 "\n".
1110 "#define ".uc($lib)."_VERSION_STR \"".$module_version."\"\n".
1111 "\n".
1112 "#define ".uc($lib)."_VERSION ".$modulehexstring."\n".
1113 "\n".
1114 "#endif // QT_".uc($lib)."_VERSION_H\n";
1115 writeFile($vheader, $vhdrcont, $lib, "version header");
1116
1117 my $master_include = "$out_basedir/include/$lib/$lib";
1118 $pri_install_files .= fixPaths($master_include, $dir) . " ";
1119 writeFile($master_include, $master_contents, $lib, "master header");
1120 }
1121
1122 unless ($showonly || $minimal) {
1123 #handle the headers.pri for each module
1124 my $headers_pri_contents = "";
1125 $headers_pri_contents .= "SYNCQT.HEADER_FILES = $pri_install_files\n";
1126 $headers_pri_contents .= "SYNCQT.HEADER_CLASSES = $pri_install_classes\n";
1127 $headers_pri_contents .= "SYNCQT.PRIVATE_HEADER_FILES = $pri_install_pfiles\n";
1128 $headers_pri_contents .= "SYNCQT.QPA_HEADER_FILES = $pri_install_qpafiles\n";
1129 $headers_pri_contents .= "SYNCQT.INJECTIONS = $pri_injections\n";
1130 my $headers_pri_file = "$out_basedir/include/$lib/headers.pri";
1131 writeFile($headers_pri_file, $headers_pri_contents, $lib, "headers.pri file");
1132 }
1133 }
1134
1135 if($check_includes) {
1136 foreach my $lib (@modules_to_sync) {
1137 next if ($modules{$lib} =~ /^!/);
1138 #calc subdirs
1139 my @subdirs = listSubdirs(map { s/^\^//; $_ } split(/;/, $modules{$lib}));
1140
1141 foreach my $subdir (@subdirs) {
1142 my @headers = findFiles($subdir, "^[-a-z0-9_]*\\.h\$" , 0);
1143 foreach my $header (@headers) {
1144 my $header_skip_qt_begin_namespace_test = 0;
1145 $header = 0 if($header =~ /^ui_.*.h/);
1146 $header = 0 if ($header eq lc($lib)."version.h");
1147 foreach (@ignore_headers) {
1148 $header = 0 if($header eq $_);
1149 }
1150 if($header) {
1151 my $public_header = $header;
1152 if($public_header =~ /_p.h$/ || $public_header =~ /_pch.h$/) {
1153 $public_header = 0;
1154 } elsif (isQpaHeader($public_header)) {
1155 $public_header = 0;
1156 } else {
1157 foreach (@ignore_for_master_contents) {
1158 $public_header = 0 if($header eq $_);
1159 }
1160 if($public_header) {
1161 foreach (@ignore_for_include_check) {
1162 $public_header = 0 if($header eq $_);
1163 }
1164 foreach(@ignore_for_qt_begin_namespace_check) {
1165 $header_skip_qt_begin_namespace_test = 1 if ($header eq $_);
1166 }
1167 }
1168 }
1169
1170 my $iheader = $subdir . "/" . $header;
1171 if($public_header) {
1172 if(open(F, "<$iheader")) {
1173 my $qt_begin_namespace_found = 0;
1174 my $qt_end_namespace_found = 0;
1175 my $qt_namespace_suffix = "";
1176 my $line;
1177 my $stop_processing = 0;
1178 while($line = <F>) {
1179 chomp $line;
1180 my $output_line = 1;
1181 if($line =~ /^ *\# *pragma (qt_no_included_check|qt_sync_stop_processing)/) {
1182 $stop_processing = 1;
1183 last;
1184 } elsif($line =~ /^ *\# *include/) {
1185 my $include = $line;
1186 if($line =~ /<.*>/) {
1187 $include =~ s,.*<(.*)>.*,$1,;
1188 } elsif($line =~ /".*"/) {
1189 $include =~ s,.*"(.*)".*,$1,;
1190 } else {
1191 $include = 0;
1192 }
1193 if($include) {
1194 for my $trylib (keys(%modules)) {
1195 if(-e "$out_basedir/include/$trylib/$include") {
1196 print "$lib: WARNING: $iheader includes $include when it should include $trylib/$include\n";
1197 }
1198 }
1199 }
1200 } elsif ($header_skip_qt_begin_namespace_test == 0 and $line =~ /^QT_BEGIN_NAMESPACE(_[A-Z_]+)?\s*$/) {
1201 $qt_namespace_suffix = defined($1) ? $1 : "";
1202 $qt_begin_namespace_found = 1;
1203 } elsif ($header_skip_qt_begin_namespace_test == 0 and $line =~ /^QT_END_NAMESPACE$qt_namespace_suffix\s*$/) {
1204 $qt_end_namespace_found = 1;
1205 }
1206 }
1207
1208 if ($header_skip_qt_begin_namespace_test == 0 and $stop_processing == 0) {
1209 if ($qt_begin_namespace_found == 0) {
1210 print "$lib: WARNING: $iheader does not include QT_BEGIN_NAMESPACE\n";
1211 }
1212
1213 if ($qt_begin_namespace_found && $qt_end_namespace_found == 0) {
1214 print "$lib: WARNING: $iheader has QT_BEGIN_NAMESPACE$qt_namespace_suffix but no QT_END_NAMESPACE$qt_namespace_suffix\n";
1215 }
1216 }
1217
1218 close(F);
1219 }
1220 }
1221 }
1222 }
1223 }
1224 }
1225 }
1226
1227 exit 0;
@@ -0,0 +1,22
1 TEMPLATE = lib
2
3 TARGET=bsp
4
5 CONFIG += bsp
6 CONFIG += gui power
7
8 BSP = SOSmartPSU
9
10 UCMODEL=stm32f4
11
12 SOURCES += bsp.c
13
14 HEADERS += bsp.h
15
16 LIBS+= -lgpio -luart -li2c -lspi -lpwm
17
18
19 BSPFILE = bsp.pri
20
21
22
This diff has been collapsed as it changes many lines, (516 lines changed) Show them Hide them
@@ -0,0 +1,516
1 /*------------------------------------------------------------------------------
2 -- This file is a part of the libuc, microcontroler library
3 -- Copyright (C) 2011, Alexis Jeandet
4 --
5 -- This program is free software; you can redistribute it and/or modify
6 -- it under the terms of the GNU General Public License as published by
7 -- the Free Software Foundation; either version 3 of the License, or
8 -- (at your option) any later version.
9 --
10 -- This program is distributed in the hope that it will be useful,
11 -- but WITHOUT ANY WARRANTY; without even the implied warranty of
12 -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 -- GNU General Public License for more details.
14 --
15 -- You should have received a copy of the GNU General Public License
16 -- along with this program; if not, write to the Free Software
17 -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 -------------------------------------------------------------------------------
19 -- Author : Alexis Jeandet
20 -- Mail : alexis.jeandet@member.fsf.org
21 -------------------------------------------------------------------------------*/
22 #include "bsp.h"
23 #include <streamdevices.h>
24 #include <malloc.h>
25 #include <gpio.h>
26 #include <uart.h>
27 #include <stdio.h>
28 #include <stm32f4xx_gpio.h>
29 #include <stm32f4xx_fsmc.h>
30 #include <i2c.h>
31 #include <core.h>
32 #include <terminal.h>
33 #include <pwm.h>
34 #include <spi.h>
35
36 uint32_t OSC0 =12000000;
37 uint32_t INTOSC =16000000;
38 uint32_t RTCOSC =32768;
39 uint32_t currentCpuFreq=0;
40 extern streamdevice* __opnfiles__[__MAX_OPENED_FILES__];
41 gpio_t TickLed = LED1;
42
43 LCD_IF_t lcdIF0={
44 .init = &bsp_FSMC_init,
45 .status = &bsp_lcd0_status,
46 .writereg = &bsp_lcd0_write_reg,
47 .readreg = &bsp_lcd0_read_reg,
48 .writeGRAM = &bsp_lcd0_writeGRAM,
49 .readGRAM = &bsp_lcd0_readGRAM
50 };
51
52 LCD_t lcd0={
53 .interface = &lcdIF0,
54 .init = &D51E5TA7601init,
55 .paint = &D51E5TA7601paint,
56 .paintFB = D51E5TA7601paintFB,
57 .setFrame = &D51E5TA7601setFrame,
58 .paintText = &D51E5TA7601paintText,
59 .paintFilRect = &D51E5TA7601paintFilRect,
60 .getPix = &D51E5TA7601getPix,
61 .refreshenable = &D51E5TA7601refreshenable,
62 .width= 320,
63 .height = 480,
64 .isFrameBuffer = 0
65 };
66
67 terminal_t terminal0;
68
69 volatile int16_t* lcd0_CMD=(volatile int16_t*)0x60000000;
70 volatile int16_t* lcd0_DATA=(volatile int16_t*)0x61FFFFF0;
71 volatile int16_t* SRAM_DATA=(volatile int16_t*)0x64000000;
72
73 // Frame buffers 300kB per buffer, RAM size=1M*16 -> 6.8 buffers max
74 volatile int16_t* FRAME_BUFFER0_data=(volatile int16_t*)0x64000000;
75 volatile int16_t* FRAME_BUFFER1_data=((volatile int16_t*)0x64000000)+(320*480); //300kB per buffer
76 LCD_t __attribute__ ((aligned (4))) FRAME_BUFFER0=
77 {
78 .interface.buffer=(int16_t*)0x64000000,
79 .init = &D51E5TA7601init_FrameBuff,
80 .paint = &D51E5TA7601paint_FrameBuff,
81 .setFrame = &D51E5TA7601setFrame_FrameBuff,
82 .paintText = &D51E5TA7601paintText_FrameBuff,
83 .paintFilRect = &D51E5TA7601paintFilRect_FrameBuff,
84 .getPix = &D51E5TA7601getPix_FrameBuff,
85 .refreshenable = &D51E5TA7601refreshenable_FrameBuff,
86 .width= 480,
87 .height = 320,
88 .isFrameBuffer = 1
89 };
90
91 LCD_t __attribute__ ((aligned (4))) FRAME_BUFFER1=
92 {
93 .interface.buffer=(((int16_t*)0x64000000)+(320*480)),
94 .init = &D51E5TA7601init_FrameBuff,
95 .paint = &D51E5TA7601paint_FrameBuff,
96 .setFrame = &D51E5TA7601setFrame_FrameBuff,
97 .paintText = &D51E5TA7601paintText_FrameBuff,
98 .paintFilRect = &D51E5TA7601paintFilRect_FrameBuff,
99 .getPix = &D51E5TA7601getPix_FrameBuff,
100 .refreshenable = &D51E5TA7601refreshenable_FrameBuff,
101 .width= 480,
102 .height = 320,
103 .isFrameBuffer = 1
104 };
105 LCD_t* FRAME_BUFFER=&FRAME_BUFFER0;
106
107 float VREF0 =(float)3.3;
108
109 int bsp_init()
110 {
111 int i=0;
112 for(i=0;i<32;i++)
113 {
114 __opnfiles__[i] = NULL;
115 }
116 bsp_GPIO_init();
117 // bsp_uart_init();
118 bsp_iic_init();
119 bsp_spi_init();
120 bsp_TC_init();
121 bsp_FSMC_init();
122 bsp_GTerm_init();
123 printf("\r=====================\n\r");
124 printf( "=====================\n\r");
125 printf(BSP);
126 printf(" initialised\n\r");
127 printf( "=====================\n\r");
128 return 1;
129 }
130
131 void bsp_GPIO_init()
132 {
133 gpio_t gpio1 = gpioopen(LED1);
134 gpio_t gpio2 = gpioopen(LED2);
135 gpio_t gpio3 = gpioopen(LED3);
136 gpio_t gpio4 = gpioopen(PSU_DISABLE);
137 gpio_t gpio5 = gpioopen(PSU_ALERT_5V);
138 gpio_t gpio6 = gpioopen(PSU_ALERT_1_5V);
139 gpio_t gpio7 = gpioopen(PSU_ALERT_3_3V);
140 gpio_t gpio8 = gpioopen(BP1);
141 gpio_t gpio9 = gpioopen(BP2);
142 gpio_t gpio10 = gpioopen(BP3);
143 gpio_t gpio11 = gpioopen(BP4);
144 gpio_t gpio12 = gpioopen(TC_IRQ);
145 gpiosetspeed(&gpio1,gpiohighspeed);
146 gpiosetspeed(&gpio2,gpiohighspeed);
147 gpiosetspeed(&gpio3,gpiohighspeed);
148 gpiosetspeed(&gpio4,gpiohighspeed);
149 gpiosetspeed(&gpio5,gpiohighspeed);
150 gpiosetspeed(&gpio6,gpiohighspeed);
151 gpiosetspeed(&gpio7,gpiohighspeed);
152 gpiosetspeed(&gpio8,gpiohighspeed);
153 gpiosetspeed(&gpio9,gpiohighspeed);
154 gpiosetspeed(&gpio10,gpiohighspeed);
155 gpiosetspeed(&gpio11,gpiohighspeed);
156 gpiosetspeed(&gpio12,gpiohighspeed);
157 gpioclr(PSU_DISABLE);
158 gpiosetdir(&gpio1,gpiooutdir);
159 gpiosetdir(&gpio3,gpiooutdir);
160 gpiosetdir(&gpio2,gpiooutdir);
161 gpiosetdir(&gpio4,gpiooutdir);
162 gpiosetdir(&gpio5,gpioindir);
163 gpiosetdir(&gpio6,gpioindir);
164 gpiosetdir(&gpio7,gpioindir);
165 gpiosetdir(&gpio8,gpioindir);
166 gpiosetdir(&gpio9,gpioindir);
167 gpiosetdir(&gpio10,gpioindir);
168 gpiosetdir(&gpio11,gpioindir);
169 gpiosetdir(&gpio12,gpioindir);
170 gpiosetpulltype(&gpio4,gpiopushpulltype);
171 gpiosetpulltype(&gpio12,gpiopulluptype);
172 gpioclr(PSU_DISABLE);
173 pwmopen(PWM9_CH2,LCD_BACKLIGHT);
174 int error = pwmsetconfig(PWM9_CH2,100,80.0);
175 }
176
177 void bsp_uart_init()
178 {
179 if(__opnfiles__[1]==NULL)
180 {
181 streamdevice* fd1 = (streamdevice*)malloc(sizeof(streamdevice));
182 uart_t uart = uartopenandconfig(uart1,uartparitynone | uart8bits | uartonestop,115200,PA9,PA10,-1,-1);
183 uartmkstreamdev(uart,fd1);
184 __opnfiles__[1] = fd1;
185 }
186 else
187 {
188 uartopenandconfig(uart1,uartparitynone | uart8bits | uartonestop,115200,PA9,PA10,-1,-1);
189 }
190 }
191
192
193
194 int bsp_FSMC_init()
195 {
196 #define GPIOGETPORT(gpio) ((GPIO_TypeDef*)(((((uint32_t)gpio) & (uint32_t)0x0000FF00)*(uint32_t)4) + (uint32_t)GPIOA))
197 #define GPIOPORTNUM(gpio) (((uint32_t)(gpio) & (uint32_t)0x0000FF00)>>(uint32_t)8)
198
199 gpio_t gpio1 = gpioopen(LCD_RESET);
200 gpiosetspeed(&gpio1,gpiohighspeed);
201 gpiosetdir(&gpio1,gpiooutdir);
202 gpioclr(LCD_RESET);
203
204 gpio_t LCD_DBxList[]={
205 LCD_CS,
206 LCD_RS,
207 LCD_WR,
208 LCD_RD,
209 LCD_D0,
210 LCD_D1,
211 LCD_D2,
212 LCD_D3,
213 LCD_D4,
214 LCD_D5,
215 LCD_D6,
216 LCD_D7,
217 LCD_D8,
218 LCD_D9,
219 LCD_D10,
220 LCD_D11,
221 LCD_D12,
222 LCD_D13,
223 LCD_D14,
224 LCD_D15};
225
226 for(int i=0;i<20;i++)
227 {
228 gpio_t LCD_DBx = gpioopen(LCD_DBxList[i]);
229 LCD_DBx |= gpiohighspeed | gpioaf | gpiopushpulltype | gpionopulltype;
230 gpiosetconfig(&LCD_DBx);
231 GPIO_PinAFConfig(GPIOGETPORT(LCD_DBx), (uint8_t)(LCD_DBx & 0xF), GPIO_AF_FSMC);
232 }
233
234 FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
235 FSMC_NORSRAMTimingInitTypeDef p,readtim;
236
237 /* Enable FSMC clock */
238 RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE);
239
240 /*-- FSMC Configuration ------------------------------------------------------*/
241 /*----------------------- SRAM Bank 3 ----------------------------------------*/
242 /* FSMC_Bank1_NORSRAM3 configuration */
243 p.FSMC_AddressSetupTime = 0xf;
244 p.FSMC_AddressHoldTime = 0xf;
245 //ili9328 -> data setup time > 10ns
246 p.FSMC_DataSetupTime = 0xf;
247 if(getCpuFreq()>100*1000*1000)
248 p.FSMC_DataSetupTime = 0xf;// 11;
249 p.FSMC_BusTurnAroundDuration = 0xf;
250 p.FSMC_CLKDivision = 0;
251 p.FSMC_DataLatency = 0xf;
252 //ili9328 -> data hold time > 15ns
253 if(getCpuFreq()>66*1000*1000)
254 p.FSMC_DataLatency = 0xf;
255 p.FSMC_AccessMode = FSMC_AccessMode_A;
256
257 readtim.FSMC_AddressSetupTime = 0xf;
258 readtim.FSMC_AddressHoldTime = 0xf;
259 //p.FSMC_DataSetupTime = 9;
260 readtim.FSMC_DataSetupTime = 0xf ;// 11;
261 if(getCpuFreq()>100*1000*1000)
262 readtim.FSMC_DataSetupTime = 0xf;// 11;
263 readtim.FSMC_BusTurnAroundDuration = 0xf;
264 readtim.FSMC_CLKDivision = 2;
265 readtim.FSMC_DataLatency = 0xf;
266 if(getCpuFreq()>66*1000*1000)
267 readtim.FSMC_DataLatency = 0xf;
268 readtim.FSMC_AccessMode = FSMC_AccessMode_A;
269
270 FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;
271 FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
272 FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;
273 FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
274 FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
275 FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;
276 FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
277 FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
278 FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
279 FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
280 FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
281 FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
282 FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
283 FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readtim;
284 FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;
285
286 FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);
287
288 /* Enable FSMC NOR/SRAM Bank1 */
289 FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);
290 gpio_t SRAM_DBxList[]={
291 SRAM_A0,
292 SRAM_A1,
293 SRAM_A2,
294 SRAM_A3,
295 SRAM_A4,
296 SRAM_A5,
297 SRAM_A6,
298 SRAM_A7,
299 SRAM_A8,
300 SRAM_A9,
301 SRAM_A10,
302 SRAM_A11,
303 SRAM_A12,
304 SRAM_A13,
305 SRAM_A14,
306 SRAM_A15,
307 SRAM_A16,
308 SRAM_A17,
309 SRAM_A18,
310 SRAM_A19,
311 SRAM_NBL0,
312 SRAM_NBL1,
313 SRAM_NCE
314 };
315
316 for(int i=0;i<23;i++)
317 {
318 gpio_t SRAM_DBx = gpioopen(SRAM_DBxList[i]);
319 SRAM_DBx |= gpiohighspeed | gpioaf | gpiopushpulltype | gpionopulltype;
320 gpiosetconfig(&SRAM_DBx);
321 GPIO_PinAFConfig(GPIOGETPORT(SRAM_DBx), (uint8_t)(SRAM_DBx & 0xF), GPIO_AF_FSMC);
322 }
323 /*-- FSMC Configuration ------------------------------------------------------*/
324 // p.FSMC_AddressSetupTime = 3;
325 p.FSMC_AddressSetupTime = 1;
326 p.FSMC_AddressHoldTime = 1;
327 // p.FSMC_DataSetupTime = 6;
328 p.FSMC_DataSetupTime = 1;
329 p.FSMC_BusTurnAroundDuration = 1;
330 p.FSMC_CLKDivision = 0;
331 p.FSMC_DataLatency = 1;
332 p.FSMC_AccessMode = FSMC_AccessMode_A;
333
334 FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM2;
335 FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
336 FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_PSRAM;
337 FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
338 FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
339 FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;
340 FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
341 FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
342 FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
343 FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
344 FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
345 FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
346 FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
347 FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;
348 FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;
349
350 FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);
351
352 /*!< Enable FSMC Bank1_SRAM2 Bank */
353 FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM2, ENABLE);
354 gpioset(LCD_RESET);
355 delay_100us(500);
356 gpioclr(LCD_RESET);
357 delay_100us(500);
358 gpioset(LCD_RESET);
359 lcd0.init(&lcd0);
360 return 1;
361 }
362
363 void bsp_spi_init()
364 {
365
366 // ads7843init(&tc_dev,spi1,ADS7843_POWER_ADC_ON|ADS7843_MODE_12BITS,&TC_setnCS,&TC_busy);
367 spiopenandconfig(spi1,spimaster|spi8bits|spimsbfirst|spiclkfirstedge,10000000,TC_DIN,TC_DOUT,TC_CLK,-1);
368 }
369
370
371 void bsp_iic_init()
372 {
373 i2copenandconfig(i2c3,0,10000,PH8,PH7);
374 }
375
376 void bsp_SD_init()
377 {
378
379 }
380
381 void vs10XXclearXCS(){}
382 void vs10XXsetXCS(){}
383 int vs10XXDREQ()
384 {
385 return 1;
386 }
387
388
389 void bsppowersdcard(char onoff) //always ON
390 {
391
392 }
393
394 char bspsdcardpresent()
395 {
396 return 0;
397 }
398
399 char bspsdcardwriteprotected()
400 {
401 return 0;
402 }
403
404 void bspsdcardselect(char YESNO)
405 {
406
407 }
408
409
410 void bsp_lcd0_write_reg(uint32_t reg,uint32_t data)
411 {
412 *lcd0_CMD=(uint16_t)reg;
413 *lcd0_DATA=(uint16_t)data;
414 }
415
416 uint32_t bsp_lcd0_read_reg(uint32_t reg)
417 {
418 uint16_t value;
419 *lcd0_CMD=(uint16_t)reg;
420 value = *lcd0_DATA;
421 value = *lcd0_DATA;
422 return value;
423 }
424
425 void bsp_lcd0_writeGRAM(void* buffer,uint32_t count)
426 {
427 *lcd0_CMD=(uint16_t)D51E5TA7601_REGISTER_WRITEDATATOGRAM;
428 uint16_t* castedBuff=(uint16_t*)buffer;
429 for(int i=0;i<(int)count;i++)
430 {
431 *lcd0_DATA=castedBuff[i];
432 }
433 }
434
435 void bsp_lcd0_setGRAM()
436 {
437 *lcd0_CMD=(uint16_t)D51E5TA7601_REGISTER_WRITEDATATOGRAM;
438 }
439
440 void bsp_lcd0_readGRAM(void* buffer,uint32_t count)
441 {
442 uint16_t* castedBuff=(uint16_t*)buffer;
443 *lcd0_CMD=(uint16_t)D51E5TA7601_REGISTER_WRITEDATATOGRAM;
444 castedBuff[0]=lcd0_DATA[0];
445 for(int i=0;i<(int)count;i++)
446 {
447 castedBuff[i]=lcd0_DATA[0];
448 }
449 }
450
451 uint32_t bsp_lcd0_status()
452 {
453 uint16_t status = lcd0_CMD[0];
454 return (uint32_t)status;
455 }
456
457 void TC_setnCS(char val)
458 {
459 return gpiosetval(TC_BUSY,val);
460 }
461
462 int TC_busy()
463 {
464 return gpiogetval(TC_BUSY);
465 }
466
467 void bsp_TC_init()
468 {
469 #define GPIOGETPORT(gpio) ((GPIO_TypeDef*)(((((uint32_t)gpio) & (uint32_t)0x0000FF00)*(uint32_t)4) + (uint32_t)GPIOA))
470 #define GPIOPORTNUM(gpio) (((uint32_t)(gpio) & (uint32_t)0x0000FF00)>>(uint32_t)8)
471
472 gpio_t gpio1 = gpioopen(TC_BUSY);
473 gpio1 |= gpiohighspeed | gpioindir | gpionopulltype;
474 gpiosetconfig(&gpio1);
475
476 gpio1 = gpioopen(TC_IRQ);
477 gpio1 |= gpiohighspeed | gpioindir | gpiopulluptype;
478 gpiosetconfig(&gpio1);
479
480 gpio1 = gpioopen(TC_CS);
481 gpio1 |= gpiohighspeed | gpiooutdir | gpionopulltype;
482 gpiosetconfig(&gpio1);
483
484 gpio1 = gpioopen(TC_CLK);
485 gpio1 |= gpiohighspeed | gpioaf | gpionopulltype;
486 gpiosetconfig(&gpio1);
487 GPIO_PinAFConfig(GPIOGETPORT(TC_CLK), (uint8_t)(TC_CLK & 0xF), GPIO_AF_SPI1);
488
489 gpio1 = gpioopen(TC_DIN);
490 gpio1 |= gpiohighspeed | gpioaf | gpionopulltype;
491 gpiosetconfig(&gpio1);
492 GPIO_PinAFConfig(GPIOGETPORT(gpio1), (uint8_t)(gpio1 & 0xF), GPIO_AF_SPI1);
493
494 gpio1 = gpioopen(TC_DOUT);
495 gpio1 |= gpiohighspeed | gpioaf | gpionopulltype;
496 gpiosetconfig(&gpio1);
497 GPIO_PinAFConfig(GPIOGETPORT(gpio1), (uint8_t)(gpio1 & 0xF), GPIO_AF_SPI1);
498 }
499
500
501 void bsp_GTerm_init()
502 {
503 FRAME_BUFFER->init(FRAME_BUFFER);
504 if(__opnfiles__[1]==NULL)
505 {
506 //uart_t* uart1 = (uart_t*)malloc(sizeof(uart_t));
507 streamdevice* fd1 = (streamdevice*)malloc(sizeof(streamdevice));
508 terminal_init(&terminal0 ,FRAME_BUFFER,&ComicSansMS_8,fd1);
509 __opnfiles__[1] = fd1;
510 }
511 else
512 {
513
514 }
515 }
516
@@ -0,0 +1,202
1 /*------------------------------------------------------------------------------
2 -- This file is a part of the libuc, microcontroler library
3 -- Copyright (C) 2011, Alexis Jeandet
4 --
5 -- This program is free software; you can redistribute it and/or modify
6 -- it under the terms of the GNU General Public License as published by
7 -- the Free Software Foundation; either version 3 of the License, or
8 -- (at your option) any later version.
9 --
10 -- This program is distributed in the hope that it will be useful,
11 -- but WITHOUT ANY WARRANTY; without even the implied warranty of
12 -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 -- GNU General Public License for more details.
14 --
15 -- You should have received a copy of the GNU General Public License
16 -- along with this program; if not, write to the Free Software
17 -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 -------------------------------------------------------------------------------
19 -- Author : Alexis Jeandet
20 -- Mail : alexis.jeandet@member.fsf.org
21 -------------------------------------------------------------------------------*/
22 #ifndef BSP_H
23 #define BSP_H
24 #include <stm32f4xx.h>
25 #include <stm32f4xx_gpio.h>
26 #include <stm32f4xx_rcc.h>
27 #include <gpio.h>
28 #include <ili9328.h>
29 #include <D51E5TA7601.h>
30 #include <genericLCD_Controler.h>
31
32 #define __MAX_OPENED_FILES__ 4
33 #define __FS_ROOT_SIZE__ 4
34 /*
35 #ifndef PD8
36 #define PD8
37 #endif
38 #ifndef PD9
39 #define PD9
40 #endif
41 */
42
43
44 #define LED1 PF6
45 #define LED2 PF7
46 #define LED3 PF8
47
48 #define PSU_DISABLE PH2
49 #define DCIN_ALERT PH12
50 #define PSU_ALERT_5V PH9
51 #define PSU_ALERT_1_5V PH10
52 #define PSU_ALERT_3_3V PH11
53
54 #define LCD_RESET PE2
55 #define LCD_BACKLIGHT PE6
56 #define BP1 PI1
57 #define BP2 PI2
58 #define BP3 PD2
59 #define BP4 PD3
60
61 #define TC_IRQ PA3
62 #define TC_CS PA4
63 #define TC_CLK PA5
64 #define TC_DOUT PA6
65 #define TC_DIN PA7
66 #define TC_BUSY PB0
67
68
69
70 //LCD Signals
71 #define LCD_CS PD7 //FSMC_NE1
72 #define LCD_RS PE4 //FSMC_A20
73 #define LCD_WR PD5 //FSMC_NWE
74 #define LCD_RD PD4 //FSMC_NOE
75 #define LCD_RST PE2
76
77 #define LCD_D0 PD14
78 #define LCD_D1 PD15
79 #define LCD_D2 PD0
80 #define LCD_D3 PD1
81 #define LCD_D4 PE7
82 #define LCD_D5 PE8
83 #define LCD_D6 PE9
84 #define LCD_D7 PE10
85 #define LCD_D8 PE11
86 #define LCD_D9 PE12
87 #define LCD_D10 PE13
88 #define LCD_D11 PE14
89 #define LCD_D12 PE15
90 #define LCD_D13 PD8
91 #define LCD_D14 PD9
92 #define LCD_D15 PD10
93
94 //SSRAM Signals
95 #define SRAM_NBL0 PE0 //FSMC_NBL0
96 #define SRAM_NBL1 PE1 //FSMC_NBL1
97 #define SRAM_NOE PD4 //FSMC_NOE
98 #define SRAM_NWE PD5 //FSMC_NWE
99 #define SRAM_NCE PG9 //FSMC_NE2
100
101 #define SRAM_A0 PF0 //FSMC_A0
102 #define SRAM_A1 PF1 //FSMC_A1
103 #define SRAM_A2 PF2 //FSMC_A2
104 #define SRAM_A3 PF3 //FSMC_A3
105 #define SRAM_A4 PF4 //FSMC_A4
106 #define SRAM_A5 PF5 //FSMC_A5
107 #define SRAM_A6 PF12 //FSMC_A6
108 #define SRAM_A7 PF13 //FSMC_A7
109 #define SRAM_A8 PF14 //FSMC_A8
110 #define SRAM_A9 PF15 //FSMC_A9
111 #define SRAM_A10 PG0 //FSMC_A10
112 #define SRAM_A11 PG1 //FSMC_A11
113 #define SRAM_A12 PG2 //FSMC_A12
114 #define SRAM_A13 PG3 //FSMC_A13
115 #define SRAM_A14 PG4 //FSMC_A14
116 #define SRAM_A15 PG5 //FSMC_A15
117 #define SRAM_A16 PD11 //FSMC_A16
118 #define SRAM_A17 PD12 //FSMC_A17
119 #define SRAM_A18 PD13 //FSMC_A18
120 #define SRAM_A19 PE3 //FSMC_A19
121
122 #define SRAM_D0 PD14
123 #define SRAM_D1 PD15
124 #define SRAM_D2 PD0
125 #define SRAM_D3 PD1
126 #define SRAM_D4 PE7
127 #define SRAM_D5 PE8
128 #define SRAM_D6 PE9
129 #define SRAM_D7 PE10
130 #define SRAM_D8 PE11
131 #define SRAM_D9 PE12
132 #define SRAM_D10 PE13
133 #define SRAM_D11 PE14
134 #define SRAM_D12 PE15
135 #define SRAM_D13 PD8
136 #define SRAM_D14 PD9
137 #define SRAM_D15 PD10
138
139
140 extern float VREF0;
141
142 extern uint32_t currentCpuFreq;
143 extern LCD_t lcd0;
144
145 extern LCD_t* FRAME_BUFFER;
146 extern LCD_t FRAME_BUFFER0;
147 extern LCD_t FRAME_BUFFER1;
148
149
150 extern int bsp_init();
151
152 extern void bsp_GPIO_init();
153 extern void bsp_uart_init();
154 extern void bsp_iic_init();
155 extern void bsp_spi_init();
156 extern void bsp_SD_init();
157 extern void bsp_TC_init();
158 extern void bsp_GTerm_init();
159 extern int bsp_FSMC_init();
160
161 extern void TC_setnCS(char val);
162 extern int TC_busy();
163
164 /* VS1053 */
165 extern void clearXCS();
166 extern void setXCS();
167 extern int vs10XXDREQ();
168
169 /* SD CARD */
170 void bsppowersdcard(char onoff);
171 char bspsdcardpresent();
172 void bspsdcardselect(char YESNO);
173 char bspsdcardwriteprotected();
174
175
176 void bsp_lcd0_write_reg(uint32_t reg,uint32_t data);
177 uint32_t bsp_lcd0_read_reg(uint32_t reg);
178 void bsp_lcd0_writeGRAM(void *buffer, uint32_t count);
179 void bsp_lcd0_readGRAM(void *buffer, uint32_t count);
180 uint32_t bsp_lcd0_status();
181 void bsp_lcd0_setGRAM();
182
183 #endif
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
@@ -0,0 +1,4
1 CPU=stm32f4xxxG
2 DEFINES+=BSP=\\\"SOSmartPSU\\\"
3
4 UCMODEL=stm32f4
@@ -0,0 +1,53
1 /*------------------------------------------------------------------------------
2 -- This file is a part of the libuc, microcontroler library
3 -- Copyright (C) 2015, Alexis Jeandet
4 --
5 -- This program is free software; you can redistribute it and/or modify
6 -- it under the terms of the GNU General Public License as published by
7 -- the Free Software Foundation; either version 3 of the License, or
8 -- (at your option) any later version.
9 --
10 -- This program is distributed in the hope that it will be useful,
11 -- but WITHOUT ANY WARRANTY; without even the implied warranty of
12 -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 -- GNU General Public License for more details.
14 --
15 -- You should have received a copy of the GNU General Public License
16 -- along with this program; if not, write to the Free Software
17 -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 -------------------------------------------------------------------------------
19 -- Author : Alexis Jeandet
20 -- Mail : alexis.jeandet@gmail.com
21 -------------------------------------------------------------------------------*/
22
23 #ifndef DMA_H
24 #define DMA_H
25 #include <streamdevices.h>
26
27 #ifdef __cplusplus
28 extern "C" {
29 #endif
30
31 typedef int dmaID_t;
32
33 dmaID_t dmacopy(uint32_t source, uint32_t dest, int size, int count, char incSrc, char incDest);
34 dmaID_t dmamemset(uint32_t dest,int val, int size);
35 int dmaIsReady(dmaID_t dmaID);
36 int dmaLockStream(int stream,int dmaDev);
37
38 #ifdef __cplusplus
39 }
40 #endif
41 #endif //DMA_H
42
43
44
45
46
47
48
49
50
51
52
53
@@ -0,0 +1,4
1 CPU=stm32f4xxxG
2 DEFINES+=BSP=\\\"SOSmartPSU\\\"
3
4 UCMODEL=stm32f4
@@ -0,0 +1,362
1 /*------------------------------------------------------------------------------
2 -- This file is a part of the libuc, microcontroler library
3 -- Copyright (C) 2012, Alexis Jeandet
4 --
5 -- This program is free software; you can redistribute it and/or modify
6 -- it under the terms of the GNU General Public License as published by
7 -- the Free Software Foundation; either version 3 of the License, or
8 -- (at your option) any later version.
9 --
10 -- This program is distributed in the hope that it will be useful,
11 -- but WITHOUT ANY WARRANTY; without even the implied warranty of
12 -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 -- GNU General Public License for more details.
14 --
15 -- You should have received a copy of the GNU General Public License
16 -- along with this program; if not, write to the Free Software
17 -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 -------------------------------------------------------------------------------
19 -- Author : Alexis Jeandet
20 -- Mail : alexis.jeandet@member.fsf.org
21 -------------------------------------------------------------------------------*/
22 #include <dma.h>
23 #include <stm32f4xx_gpio.h>
24 #include <stm32f4xx_rcc.h>
25 #include <stm32f4xx_dma.h>
26 #include <misc.h>
27
28 #define GPIOGETPORT(gpio) ((GPIO_TypeDef*)(((((uint32_t)gpio) & (uint32_t)0x0000FF00)*(uint32_t)4) + (uint32_t)GPIOA))
29 #define GPIOPORTNUM(gpio) (((uint32_t)(gpio) & (uint32_t)0x0000FF00)>>(uint32_t)8)
30 typedef enum dmaStreamState
31 {
32 avail=0,
33 inUse=1,
34 locked=2,
35 }dmaStreamState;
36
37 char __DMA2_streams__[8]={avail,avail,avail,avail,avail,avail,avail,avail};
38 DMA_Stream_TypeDef* __DMA2_streams_list__[8]={DMA2_Stream0,DMA2_Stream1,DMA2_Stream2,DMA2_Stream3,DMA2_Stream4,DMA2_Stream5,DMA2_Stream6,DMA2_Stream7};
39 int __DMA2_streams_channels__[8]={DMA_Channel_1,DMA_Channel_3,DMA_Channel_2,DMA_Channel_0,DMA_Channel_3,DMA_Channel_5,DMA_Channel_3,DMA_Channel_3};
40 uint32_t __DMA2_streams_remainig_data__[8]={0,0,0,0,0,0,0,0};
41 int __DMA_Csts__[8]={0,0,0,0,0,0,0,0};
42 char __dma_is_initialised =0;
43 typedef struct _dma_config_
44 {
45 uint32_t source;
46 uint32_t dest;
47 int size;
48 int count;
49 char incSrc;
50 char incDest;
51 }_dma_config_;
52
53 _dma_config_ __DMA2_streams_config__[8];
54
55 void __set_DMA_inc__(DMA_InitTypeDef* DMA_InitStructure,int* incsz,int*datacnt)
56 {
57 switch (*incsz) {
58 case 1:
59 DMA_InitStructure->DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
60 DMA_InitStructure->DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
61 break;
62 case 2:
63 DMA_InitStructure->DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
64 DMA_InitStructure->DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
65 break;
66 case 4:
67 DMA_InitStructure->DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
68 DMA_InitStructure->DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
69 break;
70 default:
71 DMA_InitStructure->DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
72 DMA_InitStructure->DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
73 (*datacnt)*=(*incsz);
74 *incsz=1;
75 break;
76 }
77 }
78
79 void __DMA2_init()
80 {
81 int irq[8]={DMA2_Stream0_IRQn,DMA2_Stream1_IRQn,DMA2_Stream2_IRQn,DMA2_Stream3_IRQn,DMA2_Stream4_IRQn,DMA2_Stream5_IRQn,DMA2_Stream6_IRQn,DMA2_Stream7_IRQn};
82 NVIC_InitTypeDef NVIC_InitStructure;
83 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
84
85 for(int i=0;i<8;i++)
86 {
87 if(__DMA2_streams__[i]!=locked)
88 {
89 DMA_DeInit(__DMA2_streams_list__[i]);
90 DMA_ITConfig(__DMA2_streams_list__[i], DMA_IT_TC, ENABLE);
91 NVIC_InitStructure.NVIC_IRQChannel = irq[i];
92 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
93 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
94 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
95 NVIC_Init(&NVIC_InitStructure);
96 }
97 }
98 __dma_is_initialised = 1;
99 }
100
101 void __dmacopy__(uint32_t source, uint32_t dest, int size, int count,char incSrc,char incDest,int streamIndex)
102 {
103 DMA_InitTypeDef DMA_InitStructure;
104 DMA_Stream_TypeDef* stream=__DMA2_streams_list__[streamIndex];
105 while (DMA_GetCmdStatus(stream) != DISABLE);
106 __set_DMA_inc__(&DMA_InitStructure,&size,&count);
107 DMA_InitStructure.DMA_Channel = __DMA2_streams_channels__[streamIndex];
108 DMA_InitStructure.DMA_PeripheralBaseAddr = source;
109 DMA_InitStructure.DMA_Memory0BaseAddr = dest;
110 DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToMemory;
111 if(count>65535)
112 {
113 DMA_InitStructure.DMA_BufferSize = 65535;
114 __DMA2_streams_config__[streamIndex].count = count-65535;
115 }
116 else
117 {
118 DMA_InitStructure.DMA_BufferSize = count;
119 __DMA2_streams_config__[streamIndex].count = 0;
120 }
121 __DMA2_streams_config__[streamIndex].incDest = incDest;
122 __DMA2_streams_config__[streamIndex].incSrc = incSrc;
123 __DMA2_streams_config__[streamIndex].size = size;
124 if(incSrc)
125 {
126 __DMA2_streams_config__[streamIndex].source = source+(DMA_InitStructure.DMA_BufferSize*size);
127 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;
128 }
129 else
130 {
131 __DMA2_streams_config__[streamIndex].source = source;
132 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
133 }
134 if(incDest)
135 {
136 __DMA2_streams_config__[streamIndex].dest = dest+(DMA_InitStructure.DMA_BufferSize*size);
137 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
138 }
139 else
140 {
141 __DMA2_streams_config__[streamIndex].dest = dest;
142 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
143 }
144 DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
145 DMA_InitStructure.DMA_Priority = DMA_Priority_High;
146 DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
147 DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
148 DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
149 DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
150 DMA_Init(stream, &DMA_InitStructure);
151 DMA_Cmd(stream, ENABLE);
152 }
153
154 dmaID_t dmacopy(uint32_t source, uint32_t dest, int size, int count,char incSrc,char incDest)
155 {
156 int streamIndex;
157 if(!__dma_is_initialised)
158 {
159 __DMA2_init();
160 }
161 for(int i=0;i<8;i++)
162 {
163 if(__DMA2_streams__[i]==avail)
164 {
165 streamIndex=i;
166 __DMA2_streams__[i]=inUse;
167 break;
168 }
169 }
170 __dmacopy__(source,dest,size,count,incSrc,incDest,streamIndex);
171 return streamIndex;
172 }
173
174 void DMA2_continueCp(int streamIndex)
175 {
176 DMA_InitTypeDef DMA_InitStructure;
177 DMA_Stream_TypeDef* stream = __DMA2_streams_list__[streamIndex];
178 if ((DMA_GetCmdStatus(stream) != DISABLE) && (__DMA2_streams__[streamIndex]==inUse))
179 {
180 return;
181 }
182 if(__DMA2_streams_config__[streamIndex].count==0)
183 {
184 __DMA2_streams__[streamIndex]=avail;
185 return;
186 }
187 __set_DMA_inc__(&DMA_InitStructure,&(__DMA2_streams_config__[streamIndex].size),&(__DMA2_streams_config__[streamIndex].count));
188 DMA_InitStructure.DMA_Channel = __DMA2_streams_channels__[streamIndex];
189 DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToMemory;
190 DMA_InitStructure.DMA_PeripheralBaseAddr = __DMA2_streams_config__[streamIndex].source;
191 DMA_InitStructure.DMA_Memory0BaseAddr = __DMA2_streams_config__[streamIndex].dest;
192 if(__DMA2_streams_config__[streamIndex].count>65535)
193 {
194 DMA_InitStructure.DMA_BufferSize = 65535;
195 __DMA2_streams_config__[streamIndex].count = __DMA2_streams_config__[streamIndex].count-65535;
196 }
197 else
198 {
199 DMA_InitStructure.DMA_BufferSize = __DMA2_streams_config__[streamIndex].count;
200 __DMA2_streams_config__[streamIndex].count = 0;
201 }
202 if(__DMA2_streams_config__[streamIndex].incSrc)
203 {
204 __DMA2_streams_config__[streamIndex].source +=(DMA_InitStructure.DMA_BufferSize*__DMA2_streams_config__[streamIndex].size);
205 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;
206 }
207 else
208 {
209 __DMA2_streams_config__[streamIndex].source = __DMA2_streams_config__[streamIndex].source;
210 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
211 }
212 if(__DMA2_streams_config__[streamIndex].incDest)
213 {
214 __DMA2_streams_config__[streamIndex].dest +=(DMA_InitStructure.DMA_BufferSize*__DMA2_streams_config__[streamIndex].size);
215 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
216 }
217 else
218 {
219 __DMA2_streams_config__[streamIndex].dest = __DMA2_streams_config__[streamIndex].dest;
220 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
221 }
222 DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
223 DMA_InitStructure.DMA_Priority = DMA_Priority_High;
224 DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
225 DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
226 DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
227 DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
228 DMA_Init(stream, &DMA_InitStructure);
229 DMA_Cmd(stream, ENABLE);
230 }
231
232 void DMA2_Stream0_IRQHandler(void)
233 {
234 if(DMA_GetITStatus(DMA2_Stream0, DMA_IT_TCIF0))
235 {
236 /* Clear DMA Stream Transfer Complete interrupt pending bit */
237 DMA_ClearITPendingBit(DMA2_Stream0, DMA_IT_TCIF0);
238 DMA2_continueCp(0);
239 }
240 }
241
242 void DMA2_Stream1_IRQHandler(void)
243 {
244 if(DMA_GetITStatus(DMA2_Stream1, DMA_IT_TCIF1))
245 {
246 /* Clear DMA Stream Transfer Complete interrupt pending bit */
247 DMA_ClearITPendingBit(DMA2_Stream1, DMA_IT_TCIF1);
248 DMA2_continueCp(1);
249 }
250
251 }
252
253 void DMA2_Stream2_IRQHandler(void)
254 {
255 if(DMA_GetITStatus(DMA2_Stream2, DMA_IT_TCIF2))
256 {
257 /* Clear DMA Stream Transfer Complete interrupt pending bit */
258 DMA_ClearITPendingBit(DMA2_Stream2, DMA_IT_TCIF2);
259 DMA2_continueCp(2);
260 }
261 }
262
263 void DMA2_Stream3_IRQHandler(void)
264 {
265 if(DMA_GetITStatus(DMA2_Stream3, DMA_IT_TCIF3))
266 {
267 /* Clear DMA Stream Transfer Complete interrupt pending bit */
268 DMA_ClearITPendingBit(DMA2_Stream3, DMA_IT_TCIF3);
269 DMA2_continueCp(3);
270 }
271 }
272
273 void DMA2_Stream4_IRQHandler(void)
274 {
275 if(DMA_GetITStatus(DMA2_Stream4, DMA_IT_TCIF4))
276 {
277 /* Clear DMA Stream Transfer Complete interrupt pending bit */
278 DMA_ClearITPendingBit(DMA2_Stream4, DMA_IT_TCIF4);
279 DMA2_continueCp(4);
280 }
281 }
282
283 void DMA2_Stream5_IRQHandler(void)
284 {
285 if(DMA_GetITStatus(DMA2_Stream5, DMA_IT_TCIF5))
286 {
287 /* Clear DMA Stream Transfer Complete interrupt pending bit */
288 DMA_ClearITPendingBit(DMA2_Stream5, DMA_IT_TCIF5);
289 DMA2_continueCp(5);
290 }
291 }
292
293 void DMA2_Stream6_IRQHandler(void)
294 {
295 if(DMA_GetITStatus(DMA2_Stream6, DMA_IT_TCIF6))
296 {
297 /* Clear DMA Stream Transfer Complete interrupt pending bit */
298 DMA_ClearITPendingBit(DMA2_Stream6, DMA_IT_TCIF6);
299 DMA2_continueCp(6);
300 }
301 }
302
303 void DMA2_Stream7_IRQHandler(void)
304 {
305 if(DMA_GetITStatus(DMA2_Stream7, DMA_IT_TCIF7))
306 {
307 /* Clear DMA Stream Transfer Complete interrupt pending bit */
308 DMA_ClearITPendingBit(DMA2_Stream7, DMA_IT_TCIF7);
309 DMA2_continueCp(7);
310 }
311 }
312
313
314 int dmaIsReady(dmaID_t dmaID)
315 {
316 if(!__dma_is_initialised)
317 {
318 __DMA2_init();
319 }
320 return __DMA2_streams__[dmaID]==avail;
321 }
322
323
324 int dmaLockStream(int stream, int dmaDev)
325 {
326 if(!__dma_is_initialised)
327 {
328 __DMA2_init();
329 }
330 if(dmaDev==2)
331 {
332 if(__DMA2_streams__[stream]==locked)
333 {
334 return 0;
335 }
336 while(__DMA2_streams__[stream]==inUse);
337 __DMA2_streams__[stream]=locked;
338 return 1;
339 }
340 }
341
342
343 dmaID_t dmamemset(uint32_t dest, int val, int size)
344 {
345 int streamIndex;
346 if(!__dma_is_initialised)
347 {
348 __DMA2_init();
349 }
350 for(int i=0;i<8;i++)
351 {
352 if(__DMA2_streams__[i]==avail)
353 {
354 streamIndex=i;
355 __DMA2_streams__[i]=inUse;
356 break;
357 }
358 }
359 __DMA_Csts__[streamIndex]=val;
360 __dmacopy__((uint32_t)(__DMA_Csts__ + streamIndex),dest,1,size,0,1,streamIndex);
361 return streamIndex;
362 }
@@ -0,0 +1,13
1 TEMPLATE = lib
2 CONFIG += libuc2lib
3
4 SOURCES += dma.c
5
6 UCMODEL=stm32f4
7
8 HEADERS += \
9 ../../../include/PERIPHERALS/dma.h
10
11
12
13
@@ -1,9 +1,9
1 1 CPU=stm32f4xxxG
2 2 DEFINES+=BSP=\\\"BEAGLESYNTH\\\"
3 3 beagleCp.target = beagleCp
4 beagleCp.commands = cd bin && scp $(QMAKE_TARGET).bin root@192.168.7.2://opt/stm32flashAje/hello.bin
4 beagleCp.commands = cd $(DESTDIR) && scp $(QMAKE_TARGET).bin root@192.168.7.2://opt/stm32flashAje/hello.bin
5 5 beagleCp131.target = beagleCp131
6 beagleCp131.commands = cd bin && scp $(QMAKE_TARGET).bin root@129.104.27.131://opt/stm32flashAje/hello.bin
6 beagleCp131.commands = cd $(DESTDIR) && scp $(QMAKE_TARGET).bin root@129.104.27.131://opt/stm32flashAje/hello.bin
7 7 QMAKE_EXTRA_TARGETS += beagleCp beagleCp131
8 8
9 9 UCMODEL=stm32f4
@@ -1,204 +1,204
1 1 /*------------------------------------------------------------------------------
2 2 -- This file is a part of the libuc, microcontroler library
3 3 -- Copyright (C) 2013, Alexis Jeandet
4 4 --
5 5 -- This program is free software; you can redistribute it and/or modify
6 6 -- it under the terms of the GNU General Public License as published by
7 7 -- the Free Software Foundation; either version 3 of the License, or
8 8 -- (at your option) any later version.
9 9 --
10 10 -- This program is distributed in the hope that it will be useful,
11 11 -- but WITHOUT ANY WARRANTY; without even the implied warranty of
12 12 -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 13 -- GNU General Public License for more details.
14 14 --
15 15 -- You should have received a copy of the GNU General Public License
16 16 -- along with this program; if not, write to the Free Software
17 17 -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 18 -------------------------------------------------------------------------------
19 19 -- Author : Alexis Jeandet
20 20 -- Mail : alexis.jeandet@member.fsf.org
21 21 -------------------------------------------------------------------------------*/
22 22 #include "bsp.h"
23 23 #include <streamdevices.h>
24 24 #include <malloc.h>
25 25 #include <gpio.h>
26 26 #include <uart.h>
27 27 #include <stdio.h>
28 28 #include <stm32f4xx_gpio.h>
29 29 #include <stm32f4xx_fsmc.h>
30 30 #include <i2c.h>
31 31 #include <core.h>
32 32 #include <terminal.h>
33 33 #include "bsp_gpio.h"
34 34 #include "bsp_i2c.h"
35 35 #include "bsp_i2c.h"
36 36
37 37 uint32_t OSC0 =8000000;
38 38 uint32_t INTOSC =16000000;
39 39 uint32_t RTCOSC =32768;
40 40 uint32_t currentCpuFreq=0;
41 41 extern streamdevice* __opnfiles__[__MAX_OPENED_FILES__];
42 42 gpio_t TickLed = LED1;
43 43
44 44
45 45 LCD_IF_t lcdIF0={
46 46 .init = &bsp_FSMC_init,
47 47 .writereg = &bsp_lcd0_write_reg,
48 48 .readreg = &bsp_lcd0_read_reg,
49 49 .writeGRAM = &bsp_lcd0_writeGRAM,
50 50 .readGRAM = &bsp_lcd0_readGRAM
51 51 };
52 52
53 53 LCD_t lcd0={
54 54 .interface = &lcdIF0,
55 55 .init = &ili9328init,
56 56 .paint = &ili9328paint,
57 57 .paintText = &ili9328paintText,
58 58 .paintFilRect = &ili9328paintFilRect,
59 59 .getPix = &ili9328getPix,
60 60 .refreshenable = &ili9328refreshenable,
61 61 .width= 240,
62 62 .height = 320
63 63 };
64 64
65 65 terminal_t terminal0;
66 66
67 67
68 68
69 69 float VREF0 =(float)3.3;
70 70 volatile vs10XXDev audioCodec0;
71 71
72 72 ADS7843_t TC0;
73 73
74 74 sdcardDev sdcard2;
75 75 blkdevice sdcard2blkdev;
76 76 dikpartition sdcard2Part1;
77 77 FAT32fs sdcard2FAT32part1;
78 78 dikpartition sdcard2Part2;
79 79 FAT32fs sdcard2FAT32part2;
80 80 dikpartition sdcard2Part3;
81 81 FAT32fs sdcard2FAT32part3;
82 82 dikpartition sdcard2Part4;
83 83 FAT32fs sdcard2FAT32part4;
84 84
85 85 int bsp_init()
86 86 {
87 87 int i=0;
88 88 for(i=0;i<__MAX_OPENED_FILES__;i++)
89 89 {
90 90 __opnfiles__[i] = NULL;
91 91 }
92 92 bsp_GPIO_init();
93 93 bsp_uart_init();
94 94 bsp_iic_init();
95 95 bsp_FSMC_init();
96 96 bsp_GTerm_init();
97 97 bsp_spi_init();
98 98 bsp_SD_init();
99 99 bsp_Audio_init();
100 100 bsp_TC_init();
101 101 printf("\r=====================\n\r");
102 102 printf( "=====================\n\r");
103 103 printf(BSP);
104 104 printf(" initialised\n\r");
105 105 printf( "=====================\n\r");
106 106 #if __BYTE_ORDER__==__ORDER_BIG_ENDIAN__
107 107 printf( "BIG ENDIAN MACHINE\n\r");
108 108 #else
109 109 printf( "LITLE ENDIAN MACHINE\n\r");
110 110 #endif
111 111 return 1;
112 112 }
113 113
114 114 void bsp_GPIO_init()
115 115 {
116 116 gpio_t GPIO_Out_init_List[]={LED1,LED2,LCD_RESET,LCD_BACKL,VS1053xCS,VS1053xDCS,\
117 117 VS1053xRESET,SDCARD2CS,LCD_RS,LCD_CS,TC_CS};
118 118
119 119 gpio_t GPIO_In_init_List[]={VS1053DREQ,SDCARD2CD,BP3,TC_BUSY};
120 120
121 121 bsp_gpio_set_outputs(GPIO_Out_init_List,11);
122 122 bsp_gpio_set_inputs(GPIO_In_init_List,4);
123 123
124 124 gpioclr(VS1053xRESET);
125 125 gpioset(VS1053xCS);
126 126 gpioset(VS1053xDCS);
127 127 gpioset(SDCARD2CS);
128 128 gpioclr(LCD_RESET);
129 129 gpioclr(LCD_BACKL);
130 130 }
131 131
132 132 void bsp_uart_init()
133 133 {
134 134
135 135 }
136 136
137 137
138 138
139 139
140 140
141 141 int bsp_TC_init()
142 142 {
143 ads7843init(&TC0,TC_SPI,tcsetncs,tcbusy);
143 ads7843init(&TC0,TC_SPI,ADS7843_POWER_ADC_ON|ADS7843_MODE_12BITS,tcsetncs,tcbusy);
144 144 }
145 145
146 146
147 147
148 148
149 149 void bsp_iic_init()
150 150 {
151 151 // i2copenandconfig(i2c2,0,10000,PF0,PF1);
152 152 }
153 153
154 154
155 155
156 156
157 157 void tcsetncs(char val)
158 158 {
159 159 if(val)
160 160 gpioset(TC_CS);
161 161 else
162 162 gpioclr(TC_CS);
163 163 }
164 164
165 165 int tcbusy()
166 166 {
167 167 return gpiogetval(TC_BUSY);
168 168 }
169 169
170 170
171 171
172 172
173 173
174 174 void bsp_GTerm_init()
175 175 {
176 176 if(__opnfiles__[1]==NULL)
177 177 {
178 178 streamdevice* fd1 = (streamdevice*)malloc(sizeof(streamdevice));
179 179 terminal_init(&terminal0 ,&lcd0,&ComicSansMS_8,fd1);
180 180 terminal_settextColor(&terminal0,0);
181 181 __opnfiles__[1] = fd1;
182 182 }
183 183 else
184 184 {
185 185
186 186 }
187 187 }
188 188
189 189
190 190
191 191
192 192
193 193
194 194
195 195
196 196
197 197
198 198
199 199
200 200
201 201
202 202
203 203
204 204
@@ -1,21 +1,22
1 1 TEMPLATE = subdirs
2 2 CONFIG += ordered
3 3 SUBDIRS += STM32F4Discovery \
4 4 M4Stick \
5 5 M4StickV2 \
6 6 SOLAR_LFR_PSU \
7 7 BEAGLESYNTH \
8 8 STM32F4Eval \
9 9 STM32F4Discovery-EXT \
10 10 STM32F4Discovery-ILI9328-8bits \
11 11 OPLAYER \
12 12 STM32-E407 \
13 13 STM32F429Discovery \
14 STM32F4Discovery_35LCD
14 STM32F4Discovery_35LCD \
15 SOSmartPSU
15 16
16 17
17 18
18 19
19 20
20 21
21 22
@@ -1,19 +1,20
1 1 TEMPLATE = app
2 2
3 3 contains( UCMODEL , simulator ) {
4 4 BSP = SIMULATOR
5 5 }
6 6 contains( UCMODEL , stm32f4 ) {
7 BSP = STM32F4Eval
7 #BSP = STM32F4Eval
8 BSP = SOSmartPSU
8 9 }
9 10
10 11 SOURCES += \
11 12 main.c
12 13
13 14
14 15
15 16
16 17
17 18
18 19
19 20
@@ -1,110 +1,139
1 1 /*------------------------------------------------------------------------------
2 2 -- This file is a part of the libuc, microcontroler library
3 3 -- Copyright (C) 2012, Alexis Jeandet
4 4 --
5 5 -- This program is free software; you can redistribute it and/or modify
6 6 -- it under the terms of the GNU General Public License as published by
7 7 -- the Free Software Foundation; either version 3 of the License, or
8 8 -- (at your option) any later version.
9 9 --
10 10 -- This program is distributed in the hope that it will be useful,
11 11 -- but WITHOUT ANY WARRANTY; without even the implied warranty of
12 12 -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 13 -- GNU General Public License for more details.
14 14 --
15 15 -- You should have received a copy of the GNU General Public License
16 16 -- along with this program; if not, write to the Free Software
17 17 -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 18 -------------------------------------------------------------------------------
19 19 -- Author : Alexis Jeandet
20 20 -- Mail : alexis.jeandet@gmail.com
21 21 -------------------------------------------------------------------------------*/
22 22 #ifndef D51E5TA7601_H
23 23 #define D51E5TA7601_H
24 24
25 25 /**
26 26 @todo Make an abstract layer for framebuffer devices and a painting api for it.
27 27 */
28 28
29 29
30 30 #include <genericLCD_Controler.h>
31 31
32 32 /**
33 33 * @brief ili9328init
34 34 * @param LCD
35 35 * @return
36 36 */
37 37
38 38 extern int D51E5TA7601init(struct LCD_t* LCD);
39 39 extern void D51E5TA7601setFrame(LCD_t* LCD,uint16_t X,uint16_t Y,uint16_t W,uint16_t H);
40 40 extern void D51E5TA7601setGRAMaddress(LCD_t* LCD,uint16_t Haddress,uint16_t Vaddress);
41 41 extern void D51E5TA7601paint(LCD_t* LCD,void* buffer,uint16_t Xpos,uint16_t Ypos,uint16_t Width,uint16_t Height);
42 extern void D51E5TA7601paintFB(struct LCD_t* LCD,struct LCD_t* frameBuffer);
42 43 extern void D51E5TA7601paintText(LCD_t* LCD,char* buffer,uint16_t Xpos,uint16_t Ypos,sFONT *font,uint32_t color);
43 44 extern void D51E5TA7601paintFilRect(LCD_t* LCD,uint16_t Xpos,uint16_t Ypos,uint16_t w,uint16_t h,uint32_t contColor,uint16_t contSz,uint32_t fillColor);
44 45 extern void D51E5TA7601paintFilCirc(LCD_t* LCD,uint16_t Xpos,uint16_t Ypos,uint16_t r,uint32_t contColor,uint16_t contSz,uint32_t fillColor);
45 46 extern void D51E5TA7601paintFilCircMidPoint(LCD_t* LCD,uint16_t Xpos,uint16_t Ypos,uint16_t r,uint32_t contColor,uint16_t contSz,uint32_t fillColor);
46 47 extern void D51E5TA7601getPix(struct LCD_t* LCD,uint16_t* buffer,uint16_t Xpos,uint16_t Ypos,uint16_t w,uint16_t h);
47 48 extern void D51E5TA7601refreshenable(struct LCD_t* LCD,int enable);
48 49 extern void D51E5TA7601paintChar(LCD_t* LCD,char buffer,uint16_t Xpos,uint16_t Ypos,sFONT* font,uint32_t color);
49 50
50 #define ILI9328_REGISTER_DRIVERCODEREAD ((uint32_t) 0x0000 )
51 #define ILI9328_REGISTER_DRIVEROUTPUTCONTROL1 ((uint32_t) 0x0001 )
52 #define ILI9328_REGISTER_LCDDRIVINGCONTROL ((uint32_t) 0x0002 )
53 #define ILI9328_REGISTER_ENTRYMODE ((uint32_t) 0x0003 )
54 #define ILI9328_REGISTER_RESIZECONTROL ((uint32_t) 0x0004 )
55 #define ILI9328_REGISTER_DISPLAYCONTROL1 ((uint32_t) 0x0007 )
56 #define ILI9328_REGISTER_DISPLAYCONTROL2 ((uint32_t) 0x0008 )
57 #define ILI9328_REGISTER_DISPLAYCONTROL3 ((uint32_t) 0x0009 )
58 #define ILI9328_REGISTER_DISPLAYCONTROL4 ((uint32_t) 0x000A )
59 #define ILI9328_REGISTER_RGBDISPLAYINTERFACECONTROL1 ((uint32_t) 0x000C )
60 #define ILI9328_REGISTER_FRAMEMAKERPOSITION ((uint32_t) 0x000D )
61 #define ILI9328_REGISTER_RGBDISPLAYINTERFACECONTROL2 ((uint32_t) 0x000F )
62 #define ILI9328_REGISTER_POWERCONTROL1 ((uint32_t) 0x0010 )
63 #define ILI9328_REGISTER_POWERCONTROL2 ((uint32_t) 0x0011 )
64 #define ILI9328_REGISTER_POWERCONTROL3 ((uint32_t) 0x0012 )
65 #define ILI9328_REGISTER_POWERCONTROL4 ((uint32_t) 0x0013 )
66 #define ILI9328_REGISTER_HORIZONTALGRAMADDRESSSET ((uint32_t) 0x0020 )
67 #define ILI9328_REGISTER_VERTICALGRAMADDRESSSET ((uint32_t) 0x0021 )
68 #define ILI9328_REGISTER_WRITEDATATOGRAM ((uint32_t) 0x0022 )
69 #define ILI9328_REGISTER_POWERCONTROL7 ((uint32_t) 0x0029 )
70 #define ILI9328_REGISTER_FRAMERATEANDCOLORCONTROL ((uint32_t) 0x002B )
71 #define ILI9328_REGISTER_GAMMACONTROL1 ((uint32_t) 0x0030 )
72 #define ILI9328_REGISTER_GAMMACONTROL2 ((uint32_t) 0x0031 )
73 #define ILI9328_REGISTER_GAMMACONTROL3 ((uint32_t) 0x0032 )
74 #define ILI9328_REGISTER_GAMMACONTROL4 ((uint32_t) 0x0035 )
75 #define ILI9328_REGISTER_GAMMACONTROL5 ((uint32_t) 0x0036 )
76 #define ILI9328_REGISTER_GAMMACONTROL6 ((uint32_t) 0x0037 )
77 #define ILI9328_REGISTER_GAMMACONTROL7 ((uint32_t) 0x0038 )
78 #define ILI9328_REGISTER_GAMMACONTROL8 ((uint32_t) 0x0039 )
79 #define ILI9328_REGISTER_GAMMACONTROL9 ((uint32_t) 0x003C )
80 #define ILI9328_REGISTER_GAMMACONTROL10 ((uint32_t) 0x003D )
81 #define ILI9328_REGISTER_HORIZONTALADDRESSSTARTPOSITION ((uint32_t) 0x0050 )
82 #define ILI9328_REGISTER_HORIZONTALADDRESSENDPOSITION ((uint32_t) 0x0051 )
83 #define ILI9328_REGISTER_VERTICALADDRESSSTARTPOSITION ((uint32_t) 0x0052 )
84 #define ILI9328_REGISTER_VERTICALADDRESSENDPOSITION ((uint32_t) 0x0053 )
85 #define ILI9328_REGISTER_DRIVEROUTPUTCONTROL2 ((uint32_t) 0x0060 )
86 #define ILI9328_REGISTER_BASEIMAGEDISPLAYCONTROL ((uint32_t) 0x0061 )
87 #define ILI9328_REGISTER_VERTICALSCROLLCONTROL ((uint32_t) 0x006A )
88 #define ILI9328_REGISTER_PARTIALIMAGE1DISPLAYPOSITION ((uint32_t) 0x0080 )
89 #define ILI9328_REGISTER_PARTIALIMAGE1AREASTARTLINE ((uint32_t) 0x0081 )
90 #define ILI9328_REGISTER_PARTIALIMAGE1AREAENDLINE ((uint32_t) 0x0082 )
91 #define ILI9328_REGISTER_PARTIALIMAGE2DISPLAYPOSITION ((uint32_t) 0x0083 )
92 #define ILI9328_REGISTER_PARTIALIMAGE2AREASTARTLINE ((uint32_t) 0x0084 )
93 #define ILI9328_REGISTER_PARTIALIMAGE2AREAENDLINE ((uint32_t) 0x0085 )
94 #define ILI9328_REGISTER_PANELINTERFACECONTROL1 ((uint32_t) 0x0090 )
95 #define ILI9328_REGISTER_PANELINTERFACECONTROL2 ((uint32_t) 0x0092 )
96 #define ILI9328_REGISTER_PANELINTERFACECONTROL4 ((uint32_t) 0x0095 )
97 #define ILI9328_REGISTER_OTPVCMPROGRAMMINGCONTROL ((uint32_t) 0x00A1 )
98 #define ILI9328_REGISTER_OTPVCMSTATUSANDENABLE ((uint32_t) 0x00A2 )
99 #define ILI9328_REGISTER_OTPPROGRAMMINGIDKEY ((uint32_t) 0x00A5 )
51
52
53 extern int D51E5TA7601init_FrameBuff(struct LCD_t* LCD);
54 extern void D51E5TA7601setFrame_FrameBuff(LCD_t* LCD,uint16_t X,uint16_t Y,uint16_t W,uint16_t H);
55 extern void D51E5TA7601paint_FrameBuff(LCD_t *frameBuff, void *buffer, uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height);
56 extern void D51E5TA7601paintText_FrameBuff(LCD_t *frameBuff,char* buffer,uint16_t Xpos,uint16_t Ypos,sFONT *font,uint32_t color);
57 extern void D51E5TA7601paintFilRect_FrameBuff(LCD_t *frameBuff,uint16_t Xpos,uint16_t Ypos,uint16_t w,uint16_t h,uint32_t contColor,uint16_t contSz,uint32_t fillColor);
58 extern void D51E5TA7601getPix_FrameBuff(LCD_t *frameBuff,uint16_t* buffer,uint16_t Xpos,uint16_t Ypos,uint16_t w,uint16_t h);
59 extern void D51E5TA7601refreshenable_FrameBuff(struct LCD_t* LCD,int enable);
60
61
62
63 #define D51E5TA7601_DEV_ID ((uint32_t) 0x7601 )
64
65 #define D51E5TA7601_REGISTER_DRIVERCODEREAD ((uint32_t) 0x0000 )
66 #define D51E5TA7601_REGISTER_STARTOSCILATION ((uint32_t) 0x0000 )
67 #define D51E5TA7601_REGISTER_DRIVEROUTPUTCONTROL1 ((uint32_t) 0x0001 )
68 #define D51E5TA7601_REGISTER_LCDDRIVINGCONTROL ((uint32_t) 0x0002 )
69 #define D51E5TA7601_REGISTER_ENTRYMODE ((uint32_t) 0x0003 )
70 #define D51E5TA7601_REGISTER_DISPLAYCONTROL1 ((uint32_t) 0x0004 )
71 #define D51E5TA7601_REGISTER_DISPLAYCONTROL2 ((uint32_t) 0x0005 )
72 #define D51E5TA7601_REGISTER_DISPLAYCONTROL3 ((uint32_t) 0x0006 )
73 #define D51E5TA7601_REGISTER_DISPLAYCONTROL4 ((uint32_t) 0x0007 )
74 #define D51E5TA7601_REGISTER_BLANKPERDIODCTRL ((uint32_t) 0x0008 )
75 #define D51E5TA7601_REGISTER_DISPLAYCONTROL5 ((uint32_t) 0x0009 )
76 #define D51E5TA7601_REGISTER_FRAMECYCLECONTROL ((uint32_t) 0x000A )
77 #define D51E5TA7601_REGISTER_EXTERNALDISPLAYCTRL ((uint32_t) 0x000B )
78 #define D51E5TA7601_REGISTER_LCDINTERFACECONTROL ((uint32_t) 0x000C )
79 #define D51E5TA7601_REGISTER_GATESCANPOSITIONCTRL ((uint32_t) 0x000D )
80 #define D51E5TA7601_REGISTER_FRAMESIGNALCONTROL ((uint32_t) 0x000E )
81 #define D51E5TA7601_REGISTER_DISPLAYCONTROL6 ((uint32_t) 0x000F )
82 #define D51E5TA7601_REGISTER_POWERCONTROL1 ((uint32_t) 0x0010 )
83 #define D51E5TA7601_REGISTER_POWERCONTROL2 ((uint32_t) 0x0011 )
84 #define D51E5TA7601_REGISTER_POWERCONTROL3 ((uint32_t) 0x0012 )
85 #define D51E5TA7601_REGISTER_POWERCONTROL4 ((uint32_t) 0x0013 )
86 #define D51E5TA7601_REGISTER_POWERCONTROL5 ((uint32_t) 0x0014 )
87 #define D51E5TA7601_REGISTER_POWERCONTROL6 ((uint32_t) 0x0015 )
88 #define D51E5TA7601_REGISTER_POWERCONTROL7 ((uint32_t) 0x0016 )
89 #define D51E5TA7601_REGISTER_VERTICALGRAMADDRESSSET ((uint32_t) 0x0020 )
90 #define D51E5TA7601_REGISTER_HORIZONTALGRAMADDRESSSET ((uint32_t) 0x0021 )
91 #define D51E5TA7601_REGISTER_WRITEDATATOGRAM ((uint32_t) 0x0022 )
92
93 #define D51E5TA7601_REGISTER_GAMMACONTROL1 ((uint32_t) 0x0028 )
94 #define D51E5TA7601_REGISTER_GAMMACONTROL2 ((uint32_t) 0x0029 )
95 #define D51E5TA7601_REGISTER_GAMMACONTROL3 ((uint32_t) 0x002A)
96 #define D51E5TA7601_REGISTER_GAMMACONTROL4 ((uint32_t) 0x002B )
97 #define D51E5TA7601_REGISTER_GAMMACONTROL5 ((uint32_t) 0x002C )
98 #define D51E5TA7601_REGISTER_GAMMACONTROL6 ((uint32_t) 0x002D )
99 #define D51E5TA7601_REGISTER_GAMMACONTROL7 ((uint32_t) 0x002E )
100 #define D51E5TA7601_REGISTER_GAMMACONTROL8 ((uint32_t) 0x002F )
101 #define D51E5TA7601_REGISTER_GAMMACONTROL9 ((uint32_t) 0x0030 )
102 #define D51E5TA7601_REGISTER_GAMMACONTROL10 ((uint32_t) 0x0031 )
103 #define D51E5TA7601_REGISTER_GAMMACONTROL11 ((uint32_t) 0x0032 )
104 #define D51E5TA7601_REGISTER_GAMMACONTROL12 ((uint32_t) 0x0033 )
105 #define D51E5TA7601_REGISTER_GAMMACONTROL13 ((uint32_t) 0x0034 )
106 #define D51E5TA7601_REGISTER_GAMMACONTROL14 ((uint32_t) 0x0035 )
107 #define D51E5TA7601_REGISTER_GAMMACONTROL15 ((uint32_t) 0x0036 )
108 #define D51E5TA7601_REGISTER_GAMMACONTROL16 ((uint32_t) 0x0037 )
109 #define D51E5TA7601_REGISTER_GAMMACONTROL17 ((uint32_t) 0x0038 )
110 #define D51E5TA7601_REGISTER_GAMMACONTROL18 ((uint32_t) 0x0039 )
111 #define D51E5TA7601_REGISTER_GAMMACONTROL19 ((uint32_t) 0x003A )
112 #define D51E5TA7601_REGISTER_GAMMACONTROL20 ((uint32_t) 0x003B )
113 #define D51E5TA7601_REGISTER_GAMMACONTROL21 ((uint32_t) 0x003C )
114 #define D51E5TA7601_REGISTER_PARTIALSPLTSCREENS1 ((uint32_t) 0x0040 )
115 #define D51E5TA7601_REGISTER_PARTIALSPLTSCREENE1 ((uint32_t) 0x0041 )
116 #define D51E5TA7601_REGISTER_PARTIALSPLTSCREENS2 ((uint32_t) 0x0042 )
117 #define D51E5TA7601_REGISTER_PARTIALSPLTSCREENE2 ((uint32_t) 0x0043 )
118 #define D51E5TA7601_REGISTER_HORIZONTALADDRESSSTARTPOSITION ((uint32_t) 0x0045 )
119 #define D51E5TA7601_REGISTER_HORIZONTALADDRESSENDPOSITION ((uint32_t) 0x0044 )
120 #define D51E5TA7601_REGISTER_VERTICALADDRESSSTARTPOSITION ((uint32_t) 0x0047 )
121 #define D51E5TA7601_REGISTER_VERTICALADDRESSENDPOSITION ((uint32_t) 0x0046 )
122 #define D51E5TA7601_REGISTER_BACKLIGHTCONTROL1 ((uint32_t) 0x0048 )
123 #define D51E5TA7601_REGISTER_BACKLIGHTCONTROL2 ((uint32_t) 0x0049 )
124 #define D51E5TA7601_REGISTER_BACKLIGHTCONTROL3 ((uint32_t) 0x004A )
125 #define D51E5TA7601_REGISTER_BACKLIGHTCONTROL4 ((uint32_t) 0x004B )
126 #define D51E5TA7601_REGISTER_VCOMCONTROL1 ((uint32_t) 0x0050 )
127 #define D51E5TA7601_REGISTER_VCOMCONTROL2 ((uint32_t) 0x0051 )
128 #define D51E5TA7601_REGISTER_CABCCONTROL ((uint32_t) 0x0067 )
100 129
101 130 #ifdef _PRVATE_D51E5TA7601_
102 131 void ili9328cpFrame(LCD_t* LCD,void* buffer,int x,int y,int w, int h);
103 132 #endif
104 133
105 134 #endif
106 135
107 136
108 137
109 138
110 139
@@ -1,75 +1,86
1 1 /*------------------------------------------------------------------------------
2 2 -- This file is a part of the libuc, microcontroler library
3 3 -- Copyright (C) 2012, Alexis Jeandet
4 4 --
5 5 -- This program is free software; you can redistribute it and/or modify
6 6 -- it under the terms of the GNU General Public License as published by
7 7 -- the Free Software Foundation; either version 3 of the License, or
8 8 -- (at your option) any later version.
9 9 --
10 10 -- This program is distributed in the hope that it will be useful,
11 11 -- but WITHOUT ANY WARRANTY; without even the implied warranty of
12 12 -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 13 -- GNU General Public License for more details.
14 14 --
15 15 -- You should have received a copy of the GNU General Public License
16 16 -- along with this program; if not, write to the Free Software
17 17 -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 18 -------------------------------------------------------------------------------
19 19 -- Author : Alexis Jeandet
20 20 -- Mail : alexis.jeandet@gmail.com
21 21 -------------------------------------------------------------------------------*/
22 22 #ifndef GENERICLCD_CONTROLER_H
23 23 #define GENERICLCD_CONTROLER_H
24 24
25 25 #include <uhandle.h>
26 26 #include <fonts.h>
27 27
28 28
29 29 typedef struct LCD_IF_t
30 30 {
31 31 int (*init)();
32 uint32_t (*status)();
32 33 void (*writereg)(uint32_t reg,uint32_t data);
33 34 uint32_t (*readreg)(uint32_t reg);
34 35 void (*writeGRAM)(void* buffer,uint32_t count);
35 36 void (*readGRAM)(void* buffer,uint32_t count);
36 37 }LCD_IF_t;
37 38
38 39 /**
39 40 * @brief Lcd buffer
40 41 *
41 42 * This structure contains a W width an H height buffer poiter to be copied to the screen at X;Y position.
42 43 */
43 44
44 45 typedef struct LCD_BUFFER_t
45 46 {
46 void* buffer; /**< Buffer pointer write on pixels you want to print*/
47 volatile void* buffer; /**< Buffer pointer write on pixels you want to print*/
47 48 uint32_t size; /**< The size of the buffer in bytes*/
48 49 uint16_t X; /**< The X position of the buffer*/
49 50 uint16_t Y; /**< The Y position of the buffer*/
50 51 uint16_t W; /**< The width of the buffer*/
51 52 uint16_t H; /**< The height of the buffer*/
52 53 }LCD_BUFFER_t;
53 54
55 typedef union interface_u
56 {
57 LCD_IF_t* lcd_interface;
58 volatile void* buffer;
59 }interface_u;
60
54 61 typedef struct LCD_t
55 62 {
56 LCD_IF_t* interface;
63 // LCD_IF_t* interface;
64 interface_u interface;
57 65 int (*init)(struct LCD_t* LCD);
58 66 void (*paint)(struct LCD_t* LCD,void* buffer,uint16_t Xpos,uint16_t Ypos,uint16_t Width,uint16_t Height);
67 void (*paintFB)(struct LCD_t* LCD,struct LCD_t* frameBuffer);
68 void (*setFrame)(struct LCD_t* LCD,uint16_t X,uint16_t Y,uint16_t W,uint16_t H);
59 69 void (*paintText)(struct LCD_t* LCD,char* buffer,uint16_t Xpos,uint16_t Ypos,sFONT *font,uint32_t color);
60 70 void (*paintFilRect)(struct LCD_t* LCD,uint16_t Xpos,uint16_t Ypos,uint16_t w,uint16_t h,uint32_t contColor,uint16_t contSz,uint32_t fillColor);
61 71 void (*getPix)(struct LCD_t* LCD,uint16_t* buffer,uint16_t Xpos,uint16_t Ypos,uint16_t w,uint16_t h);
62 72 void (*refreshenable)(struct LCD_t* LCD,int enable);
63 LCD_BUFFER_t* (*getBuffer)(struct LCD_t* LCD);
73 // LCD_BUFFER_t* (*getBuffer)(struct LCD_t* LCD);
64 74 void (*writeBuffer)(struct LCD_t* LCD,LCD_BUFFER_t* buffer);
65 75 uint16_t width;
66 76 uint16_t height;
77 char isFrameBuffer;
67 78 }LCD_t;
68 79
69 80
70 81 #endif /*GENERICLCD_CONTROLER_H*/
71 82
72 83
73 84
74 85
75 86
@@ -1,60 +1,102
1 1 /*------------------------------------------------------------------------------
2 2 -- This file is a part of the libuc, microcontroler library
3 3 -- Copyright (C) 2013, Alexis Jeandet
4 4 --
5 5 -- This program is free software; you can redistribute it and/or modify
6 6 -- it under the terms of the GNU General Public License as published by
7 7 -- the Free Software Foundation; either version 3 of the License, or
8 8 -- (at your option) any later version.
9 9 --
10 10 -- This program is distributed in the hope that it will be useful,
11 11 -- but WITHOUT ANY WARRANTY; without even the implied warranty of
12 12 -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 13 -- GNU General Public License for more details.
14 14 --
15 15 -- You should have received a copy of the GNU General Public License
16 16 -- along with this program; if not, write to the Free Software
17 17 -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 18 -------------------------------------------------------------------------------
19 19 -- Author : Alexis Jeandet
20 20 -- Mail : alexis.jeandet@member.fsf.org
21 21 -------------------------------------------------------------------------------*/
22 22 #ifndef STMPE811_H
23 23 #define STMPE811_H
24 24 #include <stdio.h>
25 25 #include <genericTC_Controler.h>
26 26 #include <spi.h>
27 27
28 #define ADS7843_CONFIG_MASK 0x0F
29 #define ADS7843_MODE_8BITS 0x08
30 #define ADS7843_MODE_12BITS 0x00
31 #define ADS7843_REFMODE_SINGLE 0x04
32 #define ADS7843_REFMODE_DIFF 0x00
33 #define ADS7843_POWER_ADC_ON 0x01
34 #define ADS7843_POWER_ADC_OFF 0x00
35 #define ADS7843_POWER_REF_ON 0x02
36 #define ADS7843_POWER_REF_OFF 0x00
37 #define ADS7843_START 0x80
38 #define ADS7843_MEAS_X_POS 0x50
39 #define ADS7843_MEAS_Y_POS 0x10
40 #define ADS7843_MEAS_Z1_POS 0x30
41 #define ADS7843_MEAS_Z2_POS 0x40
42
43 #define ADS7843_MEAS_X_POS_SINGLE (ADS7843_MEAS_X_POS |ADS7843_REFMODE_SINGLE)
44 #define ADS7843_MEAS_Y_POS_SINGLE (ADS7843_MEAS_Y_POS |ADS7843_REFMODE_SINGLE)
45 #define ADS7843_MEAS_Z1_POS_SINGLE (ADS7843_MEAS_Z1_POS|ADS7843_REFMODE_SINGLE)
46 #define ADS7843_MEAS_Z2_POS_SINGLE (ADS7843_MEAS_Z2_POS|ADS7843_REFMODE_SINGLE)
47 #define ADS7843_MEAS_TEMP0_SINGLE ( 0x00 |ADS7843_REFMODE_SINGLE)
48 #define ADS7843_MEAS_TEMP1_SINGLE ( 0x70 |ADS7843_REFMODE_SINGLE)
49 #define ADS7843_MEAS_AUX_SINGLE ( 0x60 |ADS7843_REFMODE_SINGLE)
50 #define ADS7843_MEAS_VBAT_SINGLE ( 0x20 |ADS7843_REFMODE_SINGLE)
51 #define ADS7843_MEAS_Z2_POS_SINGLE (ADS7843_MEAS_Z2_POS|ADS7843_REFMODE_SINGLE)
52
53 #define ADS7843_MEAS_X_POS_DIFF (ADS7843_MEAS_X_POS |ADS7843_REFMODE_DIFF)
54 #define ADS7843_MEAS_Y_POS_DIFF (ADS7843_MEAS_Y_POS |ADS7843_REFMODE_DIFF)
55 #define ADS7843_MEAS_Z1_POS_DIFF (ADS7843_MEAS_Z1_POS|ADS7843_REFMODE_DIFF)
56 #define ADS7843_MEAS_Z2_POS_DIFF (ADS7843_MEAS_Z2_POS|ADS7843_REFMODE_DIFF)
57
28 58 typedef struct ADS7843_t
29 59 {
30 60 spi_t spidev;
31 61 void (*setnCS)(char);
32 62 int (*busy)();
63 char config;
64 uint16_t zeroX;
65 uint16_t zeroY;
66 uint16_t zeroRtouch;
67 uint16_t xMin;
68 uint16_t xMax;
69 uint16_t yMin;
70 uint16_t yMax;
71 char delta;
33 72 }ADS7843_t;
34 73
35 74
36 extern int ads7843init(ADS7843_t *dev, spi_t spidev,void (*setnCS)(char),int (*busy)());
75 extern int ads7843init(ADS7843_t *dev, spi_t spidev,char config,void (*setnCS)(char),int (*busy)());
37 76 extern int ads7843read(ADS7843_t *dev,int* x,int* y);
77 extern int ads7843readRtouch(ADS7843_t *dev);
78 extern int ads7843calibrate(ADS7843_t *dev,uint16_t zeroX,uint16_t zeroY,uint16_t zeroRtouch,uint16_t xMin,uint16_t xMax,uint16_t yMin,uint16_t yMax,char delta);
79 extern int ads7843isPenTouching(ADS7843_t *dev);
38 80
39 81
40 82
41 83 #endif
42 84
43 85
44 86
45 87
46 88
47 89
48 90
49 91
50 92
51 93
52 94
53 95
54 96
55 97
56 98
57 99
58 100
59 101
60 102
@@ -1,9 +1,9
1 1 CPU=stm32f4xxxG
2 2 DEFINES+=BSP=\\\"BEAGLESYNTH\\\"
3 3 beagleCp.target = beagleCp
4 beagleCp.commands = cd bin && scp $(QMAKE_TARGET).bin root@192.168.7.2://opt/stm32flashAje/hello.bin
4 beagleCp.commands = cd $(DESTDIR) && scp $(QMAKE_TARGET).bin root@192.168.7.2://opt/stm32flashAje/hello.bin
5 5 beagleCp131.target = beagleCp131
6 beagleCp131.commands = cd bin && scp $(QMAKE_TARGET).bin root@129.104.27.131://opt/stm32flashAje/hello.bin
6 beagleCp131.commands = cd $(DESTDIR) && scp $(QMAKE_TARGET).bin root@129.104.27.131://opt/stm32flashAje/hello.bin
7 7 QMAKE_EXTRA_TARGETS += beagleCp beagleCp131
8 8
9 9 UCMODEL=stm32f4
@@ -1,2 +1,2
1 LIBS+= -lterminal -lfonts -lili9328 -lssd2119 -lADS7843 -lSTMPE811
1 LIBS+= -lterminal -lfonts -lD51E5TA7601 -lili9328 -lssd2119 -lADS7843 -lSTMPE811
2 2
@@ -1,358 +1,358
1 1 /* File: startup_ARMCM4.S
2 2 * Purpose: startup file for Cortex-M4 devices. Should use with
3 3 * GCC for ARM Embedded Processors
4 4 * Version: V2.0
5 5 * Date: 16 August 2013
6 6 *
7 7 /* Copyright (c) 2011 - 2013 ARM LIMITED
8 8
9 9 All rights reserved.
10 10 Redistribution and use in source and binary forms, with or without
11 11 modification, are permitted provided that the following conditions are met:
12 12 - Redistributions of source code must retain the above copyright
13 13 notice, this list of conditions and the following disclaimer.
14 14 - Redistributions in binary form must reproduce the above copyright
15 15 notice, this list of conditions and the following disclaimer in the
16 16 documentation and/or other materials provided with the distribution.
17 17 - Neither the name of ARM nor the names of its contributors may be used
18 18 to endorse or promote products derived from this software without
19 19 specific prior written permission.
20 20 *
21 21 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22 22 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 23 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 24 ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
25 25 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 26 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 27 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 28 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 29 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 30 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31 31 POSSIBILITY OF SUCH DAMAGE.
32 32 ---------------------------------------------------------------------------*/
33 33 /*
34 34 2013 Modified for libuc2 use by Alexis Jeandet.
35 35 */
36 36 .syntax unified
37 37 .cpu cortex-m4
38 38 .fpu fpv4-sp-d16
39 39
40 40 .section .stack
41 .align 4
41 .align 3
42 42 #ifdef __STACK_SIZE
43 43 .equ Stack_Size, __STACK_SIZE
44 44 #else
45 45 .equ Stack_Size, 0x7F00
46 46 #endif
47 47 .globl __StackTop
48 48 .globl __StackLimit
49 49 __StackLimit:
50 50 .space Stack_Size
51 51 .size __StackLimit, . - __StackLimit
52 52 __StackTop:
53 53 .size __StackTop, . - __StackTop
54 54
55 55 .section .heap
56 56 .align 3
57 57 #ifdef __HEAP_SIZE
58 58 .equ Heap_Size, __HEAP_SIZE
59 59 #else
60 60 .equ Heap_Size, 0x7F00
61 61 #endif
62 62 .globl __HeapBase
63 63 .globl __HeapLimit
64 64 __HeapBase:
65 65 .if Heap_Size
66 66 .space Heap_Size
67 67 .endif
68 68 .size __HeapBase, . - __HeapBase
69 69 __HeapLimit:
70 70 .size __HeapLimit, . - __HeapLimit
71 71
72 72 .section .isr_vector
73 73 .align 2
74 74 .globl __isr_vector
75 75 __isr_vector:
76 76 .long __StackTop /* Top of Stack */
77 77 .long Reset_Handler /* Reset Handler */
78 78 .long NMI_Handler /* NMI Handler */
79 79 .long HardFault_Handler /* Hard Fault Handler */
80 80 .long MemManage_Handler /* MPU Fault Handler */
81 81 .long BusFault_Handler /* Bus Fault Handler */
82 82 .long UsageFault_Handler /* Usage Fault Handler */
83 83 .long 0 /* Reserved */
84 84 .long 0 /* Reserved */
85 85 .long 0 /* Reserved */
86 86 .long 0 /* Reserved */
87 87 .long SVC_Handler /* SVCall Handler */
88 88 .long DebugMon_Handler /* Debug Monitor Handler */
89 89 .long 0 /* Reserved */
90 90 .long PendSV_Handler /* PendSV Handler */
91 91 .long SysTick_Handler /* SysTick Handler */
92 92
93 93 /* External interrupts */
94 94 .word WWDG_IRQHandler /* Window WatchDog */
95 95 .word PVD_IRQHandler /* PVD through EXTI Line detection */
96 96 .word TAMP_STAMP_IRQHandler /* Tamper and TimeStamps through the EXTI line */
97 97 .word RTC_WKUP_IRQHandler /* RTC Wakeup through the EXTI line */
98 98 .word FLASH_IRQHandler /* FLASH */
99 99 .word RCC_IRQHandler /* RCC */
100 100 .word EXTI0_IRQHandler /* EXTI Line0 */
101 101 .word EXTI1_IRQHandler /* EXTI Line1 */
102 102 .word EXTI2_IRQHandler /* EXTI Line2 */
103 103 .word EXTI3_IRQHandler /* EXTI Line3 */
104 104 .word EXTI4_IRQHandler /* EXTI Line4 */
105 105 .word DMA1_Stream0_IRQHandler /* DMA1 Stream 0 */
106 106 .word DMA1_Stream1_IRQHandler /* DMA1 Stream 1 */
107 107 .word DMA1_Stream2_IRQHandler /* DMA1 Stream 2 */
108 108 .word DMA1_Stream3_IRQHandler /* DMA1 Stream 3 */
109 109 .word DMA1_Stream4_IRQHandler /* DMA1 Stream 4 */
110 110 .word DMA1_Stream5_IRQHandler /* DMA1 Stream 5 */
111 111 .word DMA1_Stream6_IRQHandler /* DMA1 Stream 6 */
112 112 .word ADC_IRQHandler /* ADC1, ADC2 and ADC3s */
113 113 .word CAN1_TX_IRQHandler /* CAN1 TX */
114 114 .word CAN1_RX0_IRQHandler /* CAN1 RX0 */
115 115 .word CAN1_RX1_IRQHandler /* CAN1 RX1 */
116 116 .word CAN1_SCE_IRQHandler /* CAN1 SCE */
117 117 .word EXTI9_5_IRQHandler /* External Line[9:5]s */
118 118 .word TIM1_BRK_TIM9_IRQHandler /* TIM1 Break and TIM9 */
119 119 .word TIM1_UP_TIM10_IRQHandler /* TIM1 Update and TIM10 */
120 120 .word TIM1_TRG_COM_TIM11_IRQHandler /* TIM1 Trigger and Commutation and TIM11 */
121 121 .word TIM1_CC_IRQHandler /* TIM1 Capture Compare */
122 122 .word TIM2_IRQHandler /* TIM2 */
123 123 .word TIM3_IRQHandler /* TIM3 */
124 124 .word TIM4_IRQHandler /* TIM4 */
125 125 .word I2C1_EV_IRQHandler /* I2C1 Event */
126 126 .word I2C1_ER_IRQHandler /* I2C1 Error */
127 127 .word I2C2_EV_IRQHandler /* I2C2 Event */
128 128 .word I2C2_ER_IRQHandler /* I2C2 Error */
129 129 .word SPI1_IRQHandler /* SPI1 */
130 130 .word SPI2_IRQHandler /* SPI2 */
131 131 .word USART1_IRQHandler /* USART1 */
132 132 .word USART2_IRQHandler /* USART2 */
133 133 .word USART3_IRQHandler /* USART3 */
134 134 .word EXTI15_10_IRQHandler /* External Line[15:10]s */
135 135 .word RTC_Alarm_IRQHandler /* RTC Alarm (A and B) through EXTI Line */
136 136 .word OTG_FS_WKUP_IRQHandler /* USB OTG FS Wakeup through EXTI line */
137 137 .word TIM8_BRK_TIM12_IRQHandler /* TIM8 Break and TIM12 */
138 138 .word TIM8_UP_TIM13_IRQHandler /* TIM8 Update and TIM13 */
139 139 .word TIM8_TRG_COM_TIM14_IRQHandler /* TIM8 Trigger and Commutation and TIM14 */
140 140 .word TIM8_CC_IRQHandler /* TIM8 Capture Compare */
141 141 .word DMA1_Stream7_IRQHandler /* DMA1 Stream7 */
142 142 .word FSMC_IRQHandler /* FSMC */
143 143 .word SDIO_IRQHandler /* SDIO */
144 144 .word TIM5_IRQHandler /* TIM5 */
145 145 .word SPI3_IRQHandler /* SPI3 */
146 146 .word UART4_IRQHandler /* UART4 */
147 147 .word UART5_IRQHandler /* UART5 */
148 148 .word TIM6_DAC_IRQHandler /* TIM6 and DAC1&2 underrun errors */
149 149 .word TIM7_IRQHandler /* TIM7 */
150 150 .word DMA2_Stream0_IRQHandler /* DMA2 Stream 0 */
151 151 .word DMA2_Stream1_IRQHandler /* DMA2 Stream 1 */
152 152 .word DMA2_Stream2_IRQHandler /* DMA2 Stream 2 */
153 153 .word DMA2_Stream3_IRQHandler /* DMA2 Stream 3 */
154 154 .word DMA2_Stream4_IRQHandler /* DMA2 Stream 4 */
155 155 .word ETH_IRQHandler /* Ethernet */
156 156 .word ETH_WKUP_IRQHandler /* Ethernet Wakeup through EXTI line */
157 157 .word CAN2_TX_IRQHandler /* CAN2 TX */
158 158 .word CAN2_RX0_IRQHandler /* CAN2 RX0 */
159 159 .word CAN2_RX1_IRQHandler /* CAN2 RX1 */
160 160 .word CAN2_SCE_IRQHandler /* CAN2 SCE */
161 161 .word OTG_FS_IRQHandler /* USB OTG FS */
162 162 .word DMA2_Stream5_IRQHandler /* DMA2 Stream 5 */
163 163 .word DMA2_Stream6_IRQHandler /* DMA2 Stream 6 */
164 164 .word DMA2_Stream7_IRQHandler /* DMA2 Stream 7 */
165 165 .word USART6_IRQHandler /* USART6 */
166 166 .word I2C3_EV_IRQHandler /* I2C3 event */
167 167 .word I2C3_ER_IRQHandler /* I2C3 error */
168 168 .word OTG_HS_EP1_OUT_IRQHandler /* USB OTG HS End Point 1 Out */
169 169 .word OTG_HS_EP1_IN_IRQHandler /* USB OTG HS End Point 1 In */
170 170 .word OTG_HS_WKUP_IRQHandler /* USB OTG HS Wakeup through EXTI */
171 171 .word OTG_HS_IRQHandler /* USB OTG HS */
172 172 .word DCMI_IRQHandler /* DCMI */
173 173 .word CRYP_IRQHandler /* CRYP crypto */
174 174 .word HASH_RNG_IRQHandler /* Hash and Rng */
175 175 .word FPU_IRQHandler /* FPU */
176 176
177 177
178 178 .size __isr_vector, . - __isr_vector
179 179
180 180 .text
181 181 .thumb
182 182 .thumb_func
183 183 .align 2
184 184 .globl Reset_Handler
185 185 .type Reset_Handler, %function
186 186 Reset_Handler:
187 187 /* Firstly it copies data from read only memory to RAM. There are two schemes
188 188 * to copy. One can copy more than one sections. Another can only copy
189 189 * one section. The former scheme needs more instructions and read-only
190 190 * data to implement than the latter.
191 191 * Macro __STARTUP_COPY_MULTIPLE is used to choose between two schemes. */
192 192
193 193 /* Single section scheme.
194 194 *
195 195 * The ranges of copy from/to are specified by following symbols
196 196 * __etext: LMA of start of the section to copy from. Usually end of text
197 197 * __data_start__: VMA of start of the section to copy to
198 198 * __data_end__: VMA of end of the section to copy to
199 199 *
200 200 * All addresses must be aligned to 4 bytes boundary.
201 201 */
202 202 ldr r1, =__etext
203 203 ldr r2, =__data_start__
204 204 ldr r3, =__data_end__
205 205
206 206 .L_loop1:
207 207 cmp r2, r3
208 208 ittt lt
209 209 ldrlt r0, [r1], #4
210 210 strlt r0, [r2], #4
211 211 blt .L_loop1
212 212
213 213 /* This part of work usually is done in C library startup code. Otherwise,
214 214 * define this macro to enable it in this startup.
215 215 *
216 216 * There are two schemes too. One can clear multiple BSS sections. Another
217 217 * can only clear one section. The former is more size expensive than the
218 218 * latter.
219 219 *
220 220 * Define macro __STARTUP_CLEAR_BSS_MULTIPLE to choose the former.
221 221 * Otherwise efine macro __STARTUP_CLEAR_BSS to choose the later.
222 222 */
223 223
224 224 /* Single BSS section scheme.
225 225 *
226 226 * The BSS section is specified by following symbols
227 227 * __bss_start__: start of the BSS section.
228 228 * __bss_end__: end of the BSS section.
229 229 *
230 230 * Both addresses must be aligned to 4 bytes boundary.
231 231 */
232 232 ldr r1, =__bss_start__
233 233 ldr r2, =__bss_end__
234 234
235 235 movs r0, 0
236 236 .L_loop3:
237 237 cmp r1, r2
238 238 itt lt
239 239 strlt r0, [r1], #4
240 240 blt .L_loop3
241 241
242 242 bl main
243 243
244 244
245 245 .pool
246 246 .size Reset_Handler, . - Reset_Handler
247 247
248 248 .align 1
249 249 .thumb_func
250 250 .weak Default_Handler
251 251 .type Default_Handler, %function
252 252 Default_Handler:
253 253 b .
254 254 .size Default_Handler, . - Default_Handler
255 255
256 256 /* Macro to define default handlers. Default handler
257 257 * will be weak symbol and just dead loops. They can be
258 258 * overwritten by other handlers */
259 259 .macro def_irq_handler handler_name
260 260 .weak \handler_name
261 261 .set \handler_name, Default_Handler
262 262 .endm
263 263
264 264 def_irq_handler NMI_Handler
265 265 def_irq_handler HardFault_Handler
266 266 def_irq_handler MemManage_Handler
267 267 def_irq_handler BusFault_Handler
268 268 def_irq_handler UsageFault_Handler
269 269 def_irq_handler SVC_Handler
270 270 def_irq_handler DebugMon_Handler
271 271 def_irq_handler PendSV_Handler
272 272 def_irq_handler SysTick_Handler
273 273 def_irq_handler DEF_IRQHandler
274 274
275 275 def_irq_handler WWDG_IRQHandler
276 276 def_irq_handler PVD_IRQHandler
277 277 def_irq_handler TAMP_STAMP_IRQHandler
278 278 def_irq_handler RTC_WKUP_IRQHandler
279 279 def_irq_handler FLASH_IRQHandler
280 280 def_irq_handler RCC_IRQHandler
281 281 def_irq_handler EXTI0_IRQHandler
282 282 def_irq_handler EXTI1_IRQHandler
283 283 def_irq_handler EXTI2_IRQHandler
284 284 def_irq_handler EXTI3_IRQHandler
285 285 def_irq_handler EXTI4_IRQHandler
286 286 def_irq_handler DMA1_Stream0_IRQHandler
287 287 def_irq_handler DMA1_Stream1_IRQHandler
288 288 def_irq_handler DMA1_Stream2_IRQHandler
289 289 def_irq_handler DMA1_Stream3_IRQHandler
290 290 def_irq_handler DMA1_Stream4_IRQHandler
291 291 def_irq_handler DMA1_Stream5_IRQHandler
292 292 def_irq_handler DMA1_Stream6_IRQHandler
293 293 def_irq_handler ADC_IRQHandler
294 294 def_irq_handler CAN1_TX_IRQHandler
295 295 def_irq_handler CAN1_RX0_IRQHandler
296 296 def_irq_handler CAN1_RX1_IRQHandler
297 297 def_irq_handler CAN1_SCE_IRQHandler
298 298 def_irq_handler EXTI9_5_IRQHandler
299 299 def_irq_handler TIM1_BRK_TIM9_IRQHandler
300 300 def_irq_handler TIM1_UP_TIM10_IRQHandler
301 301 def_irq_handler TIM1_TRG_COM_TIM11_IRQHandler
302 302 def_irq_handler TIM1_CC_IRQHandler
303 303 def_irq_handler TIM2_IRQHandler
304 304 def_irq_handler TIM3_IRQHandler
305 305 def_irq_handler TIM4_IRQHandler
306 306 def_irq_handler I2C1_EV_IRQHandler
307 307 def_irq_handler I2C1_ER_IRQHandler
308 308 def_irq_handler I2C2_EV_IRQHandler
309 309 def_irq_handler I2C2_ER_IRQHandler
310 310 def_irq_handler SPI1_IRQHandler
311 311 def_irq_handler SPI2_IRQHandler
312 312 def_irq_handler USART1_IRQHandler
313 313 def_irq_handler USART2_IRQHandler
314 314 def_irq_handler USART3_IRQHandler
315 315 def_irq_handler EXTI15_10_IRQHandler
316 316 def_irq_handler RTC_Alarm_IRQHandler
317 317 def_irq_handler OTG_FS_WKUP_IRQHandler
318 318 def_irq_handler TIM8_BRK_TIM12_IRQHandler
319 319 def_irq_handler TIM8_UP_TIM13_IRQHandler
320 320 def_irq_handler TIM8_TRG_COM_TIM14_IRQHandler
321 321 def_irq_handler TIM8_CC_IRQHandler
322 322 def_irq_handler DMA1_Stream7_IRQHandler
323 323 def_irq_handler FSMC_IRQHandler
324 324 def_irq_handler SDIO_IRQHandler
325 325 def_irq_handler TIM5_IRQHandler
326 326 def_irq_handler SPI3_IRQHandler
327 327 def_irq_handler UART4_IRQHandler
328 328 def_irq_handler UART5_IRQHandler
329 329 def_irq_handler TIM6_DAC_IRQHandler
330 330 def_irq_handler TIM7_IRQHandler
331 331 def_irq_handler DMA2_Stream0_IRQHandler
332 332 def_irq_handler DMA2_Stream1_IRQHandler
333 333 def_irq_handler DMA2_Stream2_IRQHandler
334 334 def_irq_handler DMA2_Stream3_IRQHandler
335 335 def_irq_handler DMA2_Stream4_IRQHandler
336 336 def_irq_handler ETH_IRQHandler
337 337 def_irq_handler ETH_WKUP_IRQHandler
338 338 def_irq_handler CAN2_TX_IRQHandler
339 339 def_irq_handler CAN2_RX0_IRQHandler
340 340 def_irq_handler CAN2_RX1_IRQHandler
341 341 def_irq_handler CAN2_SCE_IRQHandler
342 342 def_irq_handler OTG_FS_IRQHandler
343 343 def_irq_handler DMA2_Stream5_IRQHandler
344 344 def_irq_handler DMA2_Stream6_IRQHandler
345 345 def_irq_handler DMA2_Stream7_IRQHandler
346 346 def_irq_handler USART6_IRQHandler
347 347 def_irq_handler I2C3_EV_IRQHandler
348 348 def_irq_handler I2C3_ER_IRQHandler
349 349 def_irq_handler OTG_HS_EP1_OUT_IRQHandler
350 350 def_irq_handler OTG_HS_EP1_IN_IRQHandler
351 351 def_irq_handler OTG_HS_WKUP_IRQHandler
352 352 def_irq_handler OTG_HS_IRQHandler
353 353 def_irq_handler DCMI_IRQHandler
354 354 def_irq_handler CRYP_IRQHandler
355 355 def_irq_handler HASH_RNG_IRQHandler
356 356 def_irq_handler FPU_IRQHandler
357 357
358 358 .end
@@ -1,96 +1,105
1 1 #
2 2 # qmake configuration for stm32f4
3 3 #
4 4 #
5 5
6 6
7 7 isEmpty(_stm32f4_conf){
8 8 _stm32f4_conf="oneshot"
9 9
10 10 QMAKE_CFLAGS+= -g -mlittle-endian -mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -std=c99
11 11
12 12 include(../../common/arm-none-eabi.conf)
13 13
14 14 DEFINES += __OPTIMIZED_MATH
15 15 DEFINES += \"assert_param(expr)=((void)0)\"
16 16 INCLUDEPATH += $$PWD
17 17
18 18 DEFINES += __FPU_PRESENT=1
19 19 DEFINES += ARM_MATH_CM4
20 20
21 21 DEFINES += BSP="\"\\\"$$BSP"\\\"\"
22 22
23 23
24 24 contains(CPU, stm32f42x){
25 25 LDSCRIPT=stm32f42.ld
26 26 }
27 27 contains(CPU, stm32f4xxxG){
28 28 LDSCRIPT=stm32f4.ld
29 29 }
30 30
31 31
32 32 contains( TEMPLATE, app ) {
33 33
34 34 unix:QMAKE_POST_LINK += arm-none-eabi-objcopy -O ihex "$(TARGET)" $$DESTDIR/"$(QMAKE_TARGET).hex" $$escape_expand(\\n\\t)
35 35 unix:QMAKE_POST_LINK += arm-none-eabi-objcopy -O binary "$(TARGET)" $$DESTDIR/"$(QMAKE_TARGET).bin" $$escape_expand(\\n\\t)
36 36 win32:QMAKE_POST_LINK += arm-none-eabi-objcopy -O ihex "$(DESTDIR_TARGET)" $$DESTDIR/"$(QMAKE_TARGET).hex" $$escape_expand(\\n\\t)
37 37 win32:QMAKE_POST_LINK += arm-none-eabi-objcopy -O binary "$(DESTDIR_TARGET)" $$DESTDIR/"$(QMAKE_TARGET).bin" $$escape_expand(\\n\\t)
38 38
39 39 contains( CONFIG, dfu ){
40 40 unix:QMAKE_POST_LINK += python $$[QT_INSTALL_BINS]/dfu.py -b 0x08000000:$$DESTDIR/"$(QMAKE_TARGET).bin" $$DESTDIR/"$(QMAKE_TARGET).dfu" $$escape_expand(\\n\\t)
41 41 }
42 42
43 43 LIBS += -L$$[QT_INSTALL_PREFIX]/bsp/lib/$$BSP -lbsp
44 44 LIBS += -L$$[QT_INSTALL_LIBS]/$$UCMODEL
45 45 LIBS += -lcpu
46 46 LIBS += -lcore -lm -lc
47 47
48 48 QMAKE_LFLAGS += -g -mlittle-endian -mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -std=c99 -T $$[QT_INSTALL_PREFIX]/mkspecs/features/stm32f4/$$LDSCRIPT
49 49
50 50
51 51
52 52 SOURCES +=$$[QT_INSTALL_PREFIX]/mkspecs/features/stm32f4/syscalls.c
53 53 SOURCES +=$$[QT_INSTALL_PREFIX]/mkspecs/features/stm32f4/fs.c
54 54 SOURCES +=$$[QT_INSTALL_PREFIX]/mkspecs/features/stm32f4/crt0.s
55 55 SOURCES +=$$[QT_INSTALL_PREFIX]/mkspecs/features/stm32f4/cpuinit.c
56 56
57 57
58 58 stflash.target = stflash
59 59 stflash.commands = cd $$DESTDIR && st-flash write $(QMAKE_TARGET).bin 0x08000000
60 60 stflash.depends = $$DESTDIR/$(QMAKE_TARGET)
61 61 qstlink2.target = qstlink2
62 62 qstlink2.commands = cd $$DESTDIR && qstlink2 --cli --write --verify --reset ./$(QMAKE_TARGET).bin
63 63 qstlink2.depends = $$DESTDIR/$(QMAKE_TARGET)
64 64 dfu_file.target = $$DESTDIR/$(QMAKE_TARGET).dfu
65 65 dfu_file.commands = python $$[QT_INSTALL_BINS]/dfu.py -b 0x08000000:$$DESTDIR/$(QMAKE_TARGET).bin $$DESTDIR/$(QMAKE_TARGET).dfu
66 66 dfu_file.depends = $$DESTDIR/$(QMAKE_TARGET)
67 67 dfu.target = dfu
68 68 dfu.depends = $$DESTDIR/$(QMAKE_TARGET).dfu
69 69 dfu.commands = cd $$DESTDIR && dfu-util d 0483:df11 -c 1 -i 0 -a 0 -s 0x08000000 -D $(QMAKE_TARGET).bin 0x08000000
70 70 gdb-server.target = gdb-server
71 71 gdb-server.commands = st-util -p 3333 &
72 72 gdb-server.depends = stflash
73 73 nemiver.target = nemiver
74 74 nemiver.commands = cd $$DESTDIR && nemiver --remote=localhost:3333 --gdb-binary=`which arm-none-eabi-gdb` $(QMAKE_TARGET)
75 75 nemiver.depends = gdb-server
76 QMAKE_EXTRA_TARGETS += dfu_file stflash dfu nemiver gdb-server qstlink2
76 openocd.target = openocd
77 openocd.depends = $$DESTDIR/$(QMAKE_TARGET)
78 openocd.commands = openocd -f /usr/share/openocd/scripts/interface/ftdi/olimex-arm-usb-tiny-h.cfg -f /usr/share/openocd/scripts/target/stm32f4x.cfg
79 gdb-load.target = gdb-load
80 gdb-load.commands = cd $$DESTDIR && arm-none-eabi-gdb --eval-command \"set confirm off\" --eval-command \"target remote localhost:3333\" --eval-command \"monitor reset halt\" --eval-command \"load\" --eval-command \"quit\" $(QMAKE_TARGET)
81 gdb-load.depends = $$DESTDIR/$(QMAKE_TARGET)
82 nemiver_ocd.target = nemiver_ocd
83 nemiver_ocd.commands = cd $$DESTDIR && nemiver --remote=localhost:3333 --gdb-binary=`which arm-none-eabi-gdb` $(QMAKE_TARGET)
84 nemiver_ocd.depends = gdb-load
85 QMAKE_EXTRA_TARGETS += dfu_file stflash dfu nemiver gdb-server qstlink2 openocd nemiver_ocd gdb-load
77 86 }
78 87
79 88
80 89
81 90 }
82 91
83 92
84 93
85 94
86 95
87 96
88 97
89 98
90 99
91 100
92 101
93 102
94 103
95 104
96 105
@@ -1,44 +1,357
1 1 /*------------------------------------------------------------------------------
2 2 -- This file is a part of the libuc, microcontroler library
3 3 -- Copyright (C) 2012, Alexis Jeandet
4 4 --
5 5 -- This program is free software; you can redistribute it and/or modify
6 6 -- it under the terms of the GNU General Public License as published by
7 7 -- the Free Software Foundation; either version 3 of the License, or
8 8 -- (at your option) any later version.
9 9 --
10 10 -- This program is distributed in the hope that it will be useful,
11 11 -- but WITHOUT ANY WARRANTY; without even the implied warranty of
12 12 -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 13 -- GNU General Public License for more details.
14 14 --
15 15 -- You should have received a copy of the GNU General Public License
16 16 -- along with this program; if not, write to the Free Software
17 17 -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 18 -------------------------------------------------------------------------------
19 19 -- Author : Alexis Jeandet
20 20 -- Mail : alexis.jeandet@member.fsf.org
21 21 -------------------------------------------------------------------------------*/
22 22 #define _PRVATE_D51E5TA7601_
23 23 #include <D51E5TA7601.h>
24 24 #include <stdio.h>
25 25 #include <stddef.h>
26 26 #include <core.h>
27 27 #include <math.h>
28 28 #include <malloc.h>
29 29
30 30 #ifdef __OPTIMIZED_MATH
31 31 #include <optimised_math.h>
32 32 #endif
33 extern void bsp_lcd0_setGRAM();
34
35 int D51E5TA7601init(LCD_t *LCD)
36 {
37 if((LCD!=NULL) && (LCD->interface.lcd_interface!=NULL) && (LCD->interface.lcd_interface->writereg!=NULL))
38 {
39 //first check which LCD controller is connected
40 if(0x7601==LCD->interface.lcd_interface->readreg(0))
41 {
42 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_DRIVEROUTPUTCONTROL1, 0x003C);
43 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_LCDDRIVINGCONTROL, 0x0100);
44 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_ENTRYMODE, 0x1030);
45 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_BLANKPERDIODCTRL, 0x0808);
46 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_FRAMECYCLECONTROL, 0x0500);
47 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_EXTERNALDISPLAYCTRL, 0x0000);
48 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_LCDINTERFACECONTROL, 0x0770);
49 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_GATESCANPOSITIONCTRL, 0x0000);
50 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_FRAMESIGNALCONTROL, 0x0001);
51
52 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_POWERCONTROL2, 0x0406);
53 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_POWERCONTROL3, 0x000E);
54 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_POWERCONTROL4, 0x0222);
55 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_POWERCONTROL5, 0x0015);
56 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_POWERCONTROL6, 0x4277);
57 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_POWERCONTROL7, 0x0000);
58
59 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_GAMMACONTROL9, 0x6A50);
60 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_GAMMACONTROL10, 0x00C9);
61 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_GAMMACONTROL11, 0xC7BE);
62 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_GAMMACONTROL12, 0x0003);
63 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_GAMMACONTROL15, 0x3443);
64 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_GAMMACONTROL20, 0x0000);
65 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_GAMMACONTROL21, 0x0000);
66
67 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_GAMMACONTROL5, 0x6A50);
68 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_GAMMACONTROL6, 0x00C9);
69 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_GAMMACONTROL7, 0xC7BE);
70 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_GAMMACONTROL8, 0x0003);
71 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_GAMMACONTROL14, 0x3443);
72 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_GAMMACONTROL18, 0x0000);
73 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_GAMMACONTROL19, 0x0000);
74
75 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_GAMMACONTROL1, 0x6A50);
76 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_GAMMACONTROL2, 0x00C9);
77 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_GAMMACONTROL3, 0xC7BE);
78 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_GAMMACONTROL4, 0x0003);
79 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_GAMMACONTROL13, 0x3443);
80 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_GAMMACONTROL16, 0x0000);
81 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_GAMMACONTROL17, 0x0000);
82
83 delay_100us(500);
84
85 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_POWERCONTROL3, 0x200E);
86
87 delay_100us(500);
88
89 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_POWERCONTROL3, 0x2003);
90
91 delay_100us(500);
92
93 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_HORIZONTALADDRESSENDPOSITION, 0x013F);
94 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_HORIZONTALADDRESSSTARTPOSITION, 0x0000);
95 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_VERTICALADDRESSENDPOSITION, 0x01DF);
96 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_VERTICALADDRESSSTARTPOSITION, 0x0000);
97 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_HORIZONTALGRAMADDRESSSET, 0x0000);
98 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_VERTICALGRAMADDRESSSET, 0x013F);
99 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_DISPLAYCONTROL4, 0x0012);
100
101 delay_100us(500);
102
103 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_DISPLAYCONTROL4, 0x0017);
104 delay_100us(500);
105
106 bsp_lcd0_setGRAM();
107
108 delay_100us(5000);
109 bsp_lcd0_setGRAM();
110
111 }
112
113 }
114 }
33 115
34 116
117 void D51E5TA7601setGRAMaddress(LCD_t* LCD,uint16_t Haddress,uint16_t Vaddress)
118 {
119 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_HORIZONTALGRAMADDRESSSET,Vaddress);
120 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_VERTICALGRAMADDRESSSET,Haddress);
121 }
35 122
36 123
37 124
38 125
126 void D51E5TA7601setFrame(LCD_t *LCD, uint16_t X, uint16_t Y, uint16_t W, uint16_t H)
127 {
128 // printf("X=%d Y=%d W=%d H=%d\n\r",X,Y,W,H);
129 if((X>(LCD->width-1)) || (Y>(LCD->height-1)) || ((X+W)>LCD->width) || ((Y+H)>LCD->height))
130 {
131 printf("Error painting out of screen! %dx%d @%d;%d\n",W,H,X,Y);
132 return;
133 }
134 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_HORIZONTALADDRESSENDPOSITION,(uint32_t)(X+W-1));
135 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_HORIZONTALADDRESSSTARTPOSITION,(uint32_t)X);
136 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_VERTICALADDRESSENDPOSITION,(uint32_t)(Y+H-1));
137 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_VERTICALADDRESSSTARTPOSITION,(uint32_t)Y);
138 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_VERTICALGRAMADDRESSSET,(uint32_t)(Y));
139 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_HORIZONTALGRAMADDRESSSET,(uint32_t)(X));
39 140
141 }
142
143
144 void D51E5TA7601paint(LCD_t *LCD, void *buffer, uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height)
145 {
146 if((LCD!=NULL) && (LCD->interface.lcd_interface!=NULL) && (LCD->interface.lcd_interface->writeGRAM!=NULL) && (LCD->width>=(Xpos+Width)) && (LCD->height>=(Ypos+Height)))
147 {
148 D51E5TA7601setFrame(LCD,Xpos,Ypos,Width,Height);
149 LCD->interface.lcd_interface->writeGRAM(buffer,Width*Height);
150 }
151 }
152
153
154 void D51E5TA7601paintFilRect(LCD_t *LCD, uint16_t Xpos, uint16_t Ypos, uint16_t w, uint16_t h, uint32_t contColor, uint16_t contSz, uint32_t fillColor)
155 {
156 D51E5TA7601setFrame(LCD,Xpos,Ypos,w,h);
157 uint16_t tmp[32];
158 for(int i=0;i<32;i++)tmp[i]=fillColor;
159 for(int i=0;i<(h*w);i+=32)
160 {
161 LCD->interface.lcd_interface->writeGRAM(tmp,32);
162 }
163 int rem=(w*h)%32;
164 if(rem)LCD->interface.lcd_interface->writeGRAM(tmp,rem);
165 if(contSz)
166 {
167 D51E5TA7601setFrame(LCD,Xpos,Ypos,w,contSz);
168 for(int i=0;i<32;i++)tmp[i]=contColor;
169 rem=(w*contSz)%32;
170 if(rem)LCD->interface.lcd_interface->writeGRAM(tmp,rem);
171 for(int i=rem;i<(w*contSz);i+=32)
172 {
173 LCD->interface.lcd_interface->writeGRAM(tmp,32);
174 }
175
176 D51E5TA7601setFrame(LCD,Xpos,Ypos+h-contSz,w,contSz);
177 rem=(w*contSz)%32;
178 if(rem)LCD->interface.lcd_interface->writeGRAM(tmp,rem);
179 for(int i=rem;i<(w*contSz);i+=32)
180 {
181 LCD->interface.lcd_interface->writeGRAM(tmp,32);
182 }
183
184 D51E5TA7601setFrame(LCD,Xpos,Ypos,contSz,h);
185 rem=(h*contSz)%32;
186 if(rem)LCD->interface.lcd_interface->writeGRAM(tmp,rem);
187 for(int i=rem;i<(h*contSz);i+=32)
188 {
189 LCD->interface.lcd_interface->writeGRAM(tmp,32);
190 }
191
192 D51E5TA7601setFrame(LCD,Xpos+w-contSz,Ypos,contSz,h);
193 rem=(h*contSz)%32;
194 if(rem)LCD->interface.lcd_interface->writeGRAM(tmp,rem);
195 for(int i=rem;i<(h*contSz);i+=32)
196 {
197 LCD->interface.lcd_interface->writeGRAM(tmp,32);
198 }
199 }
200 }
201
202
203 void D51E5TA7601getPix(struct LCD_t* LCD,uint16_t* buffer,uint16_t Xpos,uint16_t Ypos,uint16_t w,uint16_t h)
204 {
205 #define __set__Address__(_x_,_y_) LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_HORIZONTALGRAMADDRESSSET,(uint32_t)(_x_)); \
206 LCD->interface.lcd_interface->writereg(D51E5TA7601_REGISTER_VERTICALGRAMADDRESSSET,(uint32_t)(_y_))
207 int cx=Xpos,cy=Ypos;
208 D51E5TA7601setFrame(LCD,Xpos,Ypos,w,h);
209 int status;
210 do
211 {
212 status = LCD->interface.lcd_interface->status()>>8;
213 // }while (status>=Ypos && status<=(Ypos+h));
214 }while (status!=0);
215
216 LCD->interface.lcd_interface->readGRAM((void*)(buffer),w*h);
217 }
218
219
220 void D51E5TA7601paint_FrameBuff(LCD_t *frameBuff, void *buffer, uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height)
221 {
222 volatile uint16_t* OUTbuffer = (volatile uint16_t*)(frameBuff->interface.buffer);
223 volatile uint16_t* INbuffer = (volatile uint16_t*)buffer;
224 int index =0;
225 for(int Col=Xpos;Col<(Xpos+Width);Col++)
226 {
227 for(int Line=Ypos;Line<(Ypos+Height);Line++)
228 {
229 int i=Line+(Col*frameBuff->height);
230 OUTbuffer[i] = INbuffer[index++];
231 }
232 }
233 }
40 234
41 235
236 void D51E5TA7601getPix_FrameBuff(LCD_t *frameBuff, uint16_t *buffer, uint16_t Xpos, uint16_t Ypos, uint16_t w, uint16_t h)
237 {
238 volatile uint16_t* OUTbuffer = (volatile uint16_t*)(frameBuff->interface.buffer);
239 volatile uint16_t* INbuffer = (volatile uint16_t*)buffer;
240 int index =0;
241 for(int Col=Xpos;Col<(Xpos+w);Col++)
242 {
243 for(int Line=Ypos;Line<(Ypos+h);Line++)
244 {
245 int i=Line+(Col*frameBuff->height);
246 INbuffer[index++] = OUTbuffer[i];
247 }
248 }
249 }
250
251
252 int D51E5TA7601init_FrameBuff(LCD_t *LCD)
253 {
254 memset((void*)LCD->interface.buffer,-1,LCD->height*LCD->width*2);
255 return 0;
256 }
257
258
259 void D51E5TA7601setFrame_FrameBuff(LCD_t *LCD, uint16_t X, uint16_t Y, uint16_t W, uint16_t H)
260 {
261 return;
262 }
263
264
265 void D51E5TA7601refreshenable_FrameBuff(LCD_t *LCD, int enable)
266 {
267
268 }
269
270
271 void D51E5TA7601paintText(LCD_t *LCD, char *buffer, uint16_t Xpos, uint16_t Ypos, sFONT *font, uint32_t color)
272 {
273
274 }
275
276
277 void D51E5TA7601refreshenable(LCD_t *LCD, int enable)
278 {
279
280 }
42 281
43 282
283 void D51E5TA7601paintText_FrameBuff(LCD_t *frameBuff, char *buffer, uint16_t Xpos, uint16_t Ypos, sFONT *font, uint32_t color)
284 {
285 int w=font->Width,h=font->Height,bpl=font->bytesPerLine,pix=0,tableoffset=0;
286 uint16_t tmp[w];
287 uint16_t linenum=0,charnum=0;
288 uint8_t line=0;
289 while(*buffer!='\0')
290 {
291 if(*buffer<32)*buffer=32;
292 if(*buffer>127)*buffer=32;
293 // LCD->setFrame(LCD,Xpos+(charnum*w),Ypos-h,w,1);
294 // LCD->interface->readGRAM(tmp,w);
295 frameBuff->getPix(frameBuff,tmp,Xpos+(charnum*w),Ypos-h,w,1);
296 for(int i=0;i<(h*w);i++)
297 {
298 if( ((i%w)==0) ) //read current line to apply text pixmap
299 {
300 if(linenum++>0)
301 {
302 // LCD->setFrame(LCD,Xpos+(charnum*w),Ypos + linenum -h,w,1);
303 // LCD->interface->writeGRAM(tmp,w);
304 frameBuff->paint(frameBuff,tmp,Xpos+(charnum*w),Ypos + linenum -h,w,1);
305 //ili9328setFrame(LCD,Xpos+(charnum*w),Ypos + linenum + 1-h,w,1);
306 // LCD->interface->readGRAM(tmp,w);
307 frameBuff->getPix(frameBuff,tmp,Xpos+(charnum*w),Ypos + linenum + 1-h,w,1);
308 pix=0;
309 }
310 }
311 if((pix%8) == 0)
312 {
313 line=font->table[(((*buffer)-32)*h*bpl)+tableoffset++];
314 }
315 //tmp[pix]=0;
316 if((line & (uint8_t)0x01)==(uint8_t)1)tmp[pix]=(uint16_t)color;
317 pix++;
318 line>>=1;
319 }
320 linenum=0;
321 tableoffset=0;
322 charnum++;
323 buffer++;
324 }
325 }
44 326
327
328 void D51E5TA7601paintFilRect_FrameBuff(LCD_t *frameBuff, uint16_t Xpos, uint16_t Ypos, uint16_t w, uint16_t h, uint32_t contColor, uint16_t contSz, uint32_t fillColor)
329 {
330 volatile uint16_t* buffer= frameBuff->interface.buffer;
331
332 #define drawR(_X_,_Y_,_W_,_H_,_color_) \
333 for(int line=0;line<(_H_);line++)\
334 {\
335 for(int col=0;col<(_W_);col++)\
336 {\
337 buffer[(((_X_)+col)*frameBuff->height)+line+(_Y_)]=(_color_);\
338 }\
339 }
340 if(((2*contSz)<=w) && ((2*contSz)<=h))
341 {
342 drawR(Xpos+contSz,Ypos+contSz,w-(2*contSz),h-(2*contSz),fillColor);
343 if(contSz)
344 {
345 drawR(Xpos,Ypos,w,contSz,contColor);
346 drawR(Xpos,Ypos,contSz,h,contColor);
347 drawR(Xpos,Ypos+h-contSz,w,contSz,contColor);
348 drawR(Xpos+w-contSz,Ypos,contSz,h,contColor);
349 }
350 }
351 }
352
353
354 void D51E5TA7601paintFB(LCD_t *LCD, LCD_t *frameBuffer)
355 {
356 LCD->paint(LCD,(void*)frameBuffer->interface.buffer,0,0,frameBuffer->height,frameBuffer->width);
357 }
@@ -1,534 +1,535
1 1 /*------------------------------------------------------------------------------
2 2 -- This file is a part of the libuc, microcontroler library
3 3 -- Copyright (C) 2012, Alexis Jeandet
4 4 --
5 5 -- This program is free software; you can redistribute it and/or modify
6 6 -- it under the terms of the GNU General Public License as published by
7 7 -- the Free Software Foundation; either version 3 of the License, or
8 8 -- (at your option) any later version.
9 9 --
10 10 -- This program is distributed in the hope that it will be useful,
11 11 -- but WITHOUT ANY WARRANTY; without even the implied warranty of
12 12 -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 13 -- GNU General Public License for more details.
14 14 --
15 15 -- You should have received a copy of the GNU General Public License
16 16 -- along with this program; if not, write to the Free Software
17 17 -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 18 -------------------------------------------------------------------------------
19 19 -- Author : Alexis Jeandet
20 20 -- Mail : alexis.jeandet@member.fsf.org
21 21 -------------------------------------------------------------------------------*/
22 22 #define _PRVATE_ILI9328_
23 23 #include <ili9328.h>
24 24 #include <stdio.h>
25 25 #include <stddef.h>
26 26 #include <core.h>
27 27 #include <math.h>
28 28 #include <malloc.h>
29 29
30 30 #ifdef __OPTIMIZED_MATH
31 31 #include <optimised_math.h>
32 32 #endif
33 33
34 34
35 35 #define ilipaintLine(LCD,X,Y,W,buffer,buffsize) \
36 36 for(int l=0;l<1;l++)\
37 37 {\
38 38 ili9328setFrame(LCD,X,Y,W,1);\
39 39 int rem=(W)%buffsize;\
40 if(rem)LCD->interface->writeGRAM(buffer,rem);\
40 if(rem)LCD->interface.lcd_interface->writeGRAM(buffer,rem);\
41 41 for(int i=rem;i<(W);i+=buffsize)\
42 42 {\
43 LCD->interface->writeGRAM(buffer,buffsize);\
43 LCD->interface.lcd_interface->writeGRAM(buffer,buffsize);\
44 44 }\
45 45 }
46 46
47 47 #define ilipaintHLineWithCont(LCD,X,Y,W,ContSz,bufferInt,buffIntsize,bufferCont,buffContsize) \
48 48 for(int l=0;l<1;l++)\
49 49 {\
50 50 ili9328setFrame(LCD,X,Y,W,1);\
51 51 int rem=(ContSz)%buffContsize;\
52 if(rem)LCD->interface->writeGRAM(bufferCont,rem);\
52 if(rem)LCD->interface.lcd_interface->writeGRAM(bufferCont,rem);\
53 53 for(int i=rem;i<(ContSz);i+=buffContsize)\
54 54 {\
55 LCD->interface->writeGRAM(bufferCont,buffContsize);\
55 LCD->interface.lcd_interface->writeGRAM(bufferCont,buffContsize);\
56 56 }\
57 57 if((2*ContSz)<W) \
58 58 {\
59 59 rem=(W-(2*ContSz))%buffIntsize;\
60 if(rem)LCD->interface->writeGRAM(bufferInt,rem);\
60 if(rem)LCD->interface.lcd_interface->writeGRAM(bufferInt,rem);\
61 61 for(int i=rem;i<(W-(2*ContSz));i+=buffIntsize)\
62 62 {\
63 LCD->interface->writeGRAM(bufferInt,buffIntsize);\
63 LCD->interface.lcd_interface->writeGRAM(bufferInt,buffIntsize);\
64 64 }\
65 65 }\
66 66 rem=(ContSz)%buffContsize;\
67 if(rem)LCD->interface->writeGRAM(bufferCont,rem);\
67 if(rem)LCD->interface.lcd_interface->writeGRAM(bufferCont,rem);\
68 68 for(int i=rem;i<(ContSz);i+=buffContsize)\
69 69 {\
70 LCD->interface->writeGRAM(bufferCont,buffContsize);\
70 LCD->interface.lcd_interface->writeGRAM(bufferCont,buffContsize);\
71 71 }\
72 72 }\
73 73
74 74
75 75 #define ilipaintVLineWithCont(LCD,X,Y,H,ContSz,bufferInt,buffIntsize,bufferCont,buffContsize) \
76 76 for(int l=0;l<1;l++)\
77 77 {\
78 78 ili9328setFrame(LCD,X,Y,1,H);\
79 79 int rem=(ContSz)%buffContsize;\
80 if(rem)LCD->interface->writeGRAM(bufferCont,rem);\
80 if(rem)LCD->interface.lcd_interface->writeGRAM(bufferCont,rem);\
81 81 for(int i=rem;i<(ContSz);i+=buffContsize)\
82 82 {\
83 LCD->interface->writeGRAM(bufferCont,buffContsize);\
83 LCD->interface.lcd_interface->writeGRAM(bufferCont,buffContsize);\
84 84 }\
85 85 if((2*ContSz)<H) \
86 86 {\
87 87 rem=(H-(2*ContSz))%buffIntsize;\
88 if(rem)LCD->interface->writeGRAM(bufferInt,rem);\
88 if(rem)LCD->interface.lcd_interface->writeGRAM(bufferInt,rem);\
89 89 for(int i=rem;i<(H-(2*ContSz));i+=buffIntsize)\
90 90 {\
91 LCD->interface->writeGRAM(bufferInt,buffIntsize);\
91 LCD->interface.lcd_interface->writeGRAM(bufferInt,buffIntsize);\
92 92 }\
93 93 }\
94 94 rem=(ContSz)%buffContsize;\
95 if(rem)LCD->interface->writeGRAM(bufferCont,rem);\
95 if(rem)LCD->interface.lcd_interface->writeGRAM(bufferCont,rem);\
96 96 for(int i=rem;i<(ContSz);i+=buffContsize)\
97 97 {\
98 LCD->interface->writeGRAM(bufferCont,buffContsize);\
98 LCD->interface.lcd_interface->writeGRAM(bufferCont,buffContsize);\
99 99 }\
100 100 }\
101 101
102 102
103 103 #define ilipaintHalfTopVLineWithCont(LCD,X,Y,H,ContSz,bufferInt,buffIntsize,bufferCont,buffContsize) \
104 104 for(int l=0;l<1;l++)\
105 105 {\
106 106 ili9328setFrame(LCD,X,Y,1,H);\
107 107 int rem=(ContSz)%buffContsize;\
108 if(rem)LCD->interface->writeGRAM(bufferCont,rem);\
108 if(rem)LCD->interface.lcd_interface->writeGRAM(bufferCont,rem);\
109 109 for(int i=rem;i<(ContSz);i+=buffContsize)\
110 110 {\
111 LCD->interface->writeGRAM(bufferCont,buffContsize);\
111 LCD->interface.lcd_interface->writeGRAM(bufferCont,buffContsize);\
112 112 }\
113 113 if(ContSz<H) \
114 114 {\
115 115 rem=(H-ContSz)%buffIntsize;\
116 if(rem)LCD->interface->writeGRAM(bufferInt,rem);\
116 if(rem)LCD->interface.lcd_interface->writeGRAM(bufferInt,rem);\
117 117 for(int i=rem;i<(H-ContSz);i+=buffIntsize)\
118 118 {\
119 LCD->interface->writeGRAM(bufferInt,buffIntsize);\
119 LCD->interface.lcd_interface->writeGRAM(bufferInt,buffIntsize);\
120 120 }\
121 121 }\
122 122 }\
123 123
124 124
125 125 #define ilipaintHalfBottomVLineWithCont(LCD,X,Y,H,ContSz,bufferInt,buffIntsize,bufferCont,buffContsize) \
126 126 for(int l=0;l<1;l++)\
127 127 {\
128 128 ili9328setFrame(LCD,X,Y,1,H);\
129 129 int rem;\
130 130 if(ContSz<H) \
131 131 {\
132 132 rem=(H-ContSz)%buffIntsize;\
133 if(rem)LCD->interface->writeGRAM(bufferInt,rem);\
133 if(rem)LCD->interface.lcd_interface->writeGRAM(bufferInt,rem);\
134 134 for(int i=rem;i<(H-ContSz);i+=buffIntsize)\
135 135 {\
136 LCD->interface->writeGRAM(bufferInt,buffIntsize);\
136 LCD->interface.lcd_interface->writeGRAM(bufferInt,buffIntsize);\
137 137 }\
138 138 }\
139 139 rem=(ContSz)%buffContsize;\
140 if(rem)LCD->interface->writeGRAM(bufferCont,rem);\
140 if(rem)LCD->interface.lcd_interface->writeGRAM(bufferCont,rem);\
141 141 for(int i=rem;i<(ContSz);i+=buffContsize)\
142 142 {\
143 LCD->interface->writeGRAM(bufferCont,buffContsize);\
143 LCD->interface.lcd_interface->writeGRAM(bufferCont,buffContsize);\
144 144 }\
145 145 }\
146 146
147 147
148 148 void ili9328setGRAMaddress(LCD_t* LCD,uint16_t Haddress,uint16_t Vaddress)
149 149 {
150 LCD->interface->writereg(ILI9328_REGISTER_HORIZONTALGRAMADDRESSSET,Haddress);
151 LCD->interface->writereg(ILI9328_REGISTER_VERTICALGRAMADDRESSSET,Vaddress);
150 LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_HORIZONTALGRAMADDRESSSET,Haddress);
151 LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_VERTICALGRAMADDRESSSET,Vaddress);
152 152 }
153 153
154 154 void ili9328refreshenable(struct LCD_t* LCD,int enable)
155 155 {
156 156 if(enable)
157 157 {
158 //LCD->interface->writereg(ILI9328_REGISTER_ENTRYMODE,0x1018);
158 //LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_ENTRYMODE,0x1018);
159 159 }
160 160 else
161 161 {
162 //LCD->interface->writereg(ILI9328_REGISTER_ENTRYMODE,0x1008);
162 //LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_ENTRYMODE,0x1008);
163 163
164 164 }
165 165 }
166 166
167 167 void ili9328setFrame(LCD_t* LCD,uint16_t X,uint16_t Y,uint16_t W,uint16_t H)
168 168 {
169 169 if((X>(LCD->width-1)) || (Y>(LCD->height-1)) || ((X+W)>LCD->width) || ((Y+H)>LCD->height))
170 170 {
171 while (1);
171 printf("Error painting out of screen!\n");
172 return;
172 173 }
173 LCD->interface->writereg(ILI9328_REGISTER_HORIZONTALADDRESSSTARTPOSITION,(uint32_t)X);
174 LCD->interface->writereg(ILI9328_REGISTER_HORIZONTALADDRESSENDPOSITION,(uint32_t)(W+X-1));
175 LCD->interface->writereg(ILI9328_REGISTER_VERTICALADDRESSSTARTPOSITION,(uint32_t)Y);
176 LCD->interface->writereg(ILI9328_REGISTER_VERTICALADDRESSENDPOSITION,(uint32_t)(Y+H-1));
177 LCD->interface->writereg(ILI9328_REGISTER_HORIZONTALGRAMADDRESSSET,(uint32_t)X);
178 LCD->interface->writereg(ILI9328_REGISTER_VERTICALGRAMADDRESSSET,(uint32_t)Y);
174 LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_HORIZONTALADDRESSSTARTPOSITION,(uint32_t)X);
175 LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_HORIZONTALADDRESSENDPOSITION,(uint32_t)(W+X-1));
176 LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_VERTICALADDRESSSTARTPOSITION,(uint32_t)Y);
177 LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_VERTICALADDRESSENDPOSITION,(uint32_t)(Y+H-1));
178 LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_HORIZONTALGRAMADDRESSSET,(uint32_t)X);
179 LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_VERTICALGRAMADDRESSSET,(uint32_t)Y);
179 180 }
180 181
181 182 void ili9328paint(LCD_t* LCD,void* buffer,uint16_t Xpos,uint16_t Ypos,uint16_t Width,uint16_t Height)
182 183 {
183 if((LCD!=NULL) && (LCD->interface!=NULL) && (LCD->interface->writeGRAM!=NULL) && (LCD->width>=(Xpos+Width)) && (LCD->height>=(Ypos+Height)))
184 if((LCD!=NULL) && (LCD->interface.lcd_interface!=NULL) && (LCD->interface.lcd_interface->writeGRAM!=NULL) && (LCD->width>=(Xpos+Width)) && (LCD->height>=(Ypos+Height)))
184 185 {
185 186 ili9328setFrame(LCD,Xpos,Ypos,Width,Height);
186 LCD->interface->writeGRAM(buffer,Width*Height);
187 LCD->interface.lcd_interface->writeGRAM(buffer,Width*Height);
187 188 }
188 189 }
189 190
190 191 void ili9328paintFilCirc(LCD_t* LCD,uint16_t Xpos,uint16_t Ypos,uint16_t r,uint32_t contColor,uint16_t contSz,uint32_t fillColor)
191 192 {
192 193 //Based on the mid point circle algorithm from Wikipedia
193 194 //http://en.wikipedia.org/wiki/Midpoint_circle_algorithm
194 195 uint16_t innerbuffer[16];
195 196 uint16_t outterbuffer[16];
196 197 for(int i=0;i<16;i++)innerbuffer[i]=fillColor;
197 198 for(int i=0;i<16;i++)outterbuffer[i]=contColor;
198 199 if(contSz<r)
199 200 {
200 201 int error = -r,error_int = -r+contSz;
201 202 int x = r,x_int=r-contSz;
202 203 int y = 0,y_int=0;
203 204 while (x >= y)
204 205 {
205 206 ilipaintHLineWithCont(LCD,(Xpos-x),(Ypos+y),(2*x),(x-x_int),innerbuffer,16,outterbuffer,16);
206 207 ilipaintHLineWithCont(LCD,(Xpos-x),(Ypos-y),(2*x),(x-x_int),innerbuffer,16,outterbuffer,16);
207 208 ilipaintHalfTopVLineWithCont(LCD,(Xpos+y),(Ypos-x),(x),(x-x_int),innerbuffer,16,outterbuffer,16);
208 209 ilipaintHalfTopVLineWithCont(LCD,(Xpos-y),(Ypos-x),(x),(x-x_int),innerbuffer,16,outterbuffer,16);
209 210 ilipaintHalfBottomVLineWithCont(LCD,(Xpos-y),(Ypos),(x),(x-x_int),innerbuffer,16,outterbuffer,16);
210 211 ilipaintHalfBottomVLineWithCont(LCD,(Xpos+y),(Ypos),(x),(x-x_int),innerbuffer,16,outterbuffer,16);
211 212 error += y;
212 213 ++y;
213 214 error += y;
214 215 error_int += y_int;
215 216 ++y_int;
216 217 error_int += y_int;
217 218 if(error >= 0)
218 219 {
219 220 error -= x;
220 221 --x;
221 222 error -= x;
222 223 }
223 224 if(error_int >= 0)
224 225 {
225 226 error_int -= x_int;
226 227 --x_int;
227 228 error_int -= x_int;
228 229 }
229 230 }
230 231
231 232
232 233
233 234 }
234 235
235 236 }
236 237
237 238 void ili9328paintFilCirc_old(LCD_t* LCD,uint16_t Xpos,uint16_t Ypos,uint16_t r,uint32_t contColor,uint16_t contSz,uint32_t fillColor)
238 239 {
239 240 if(contSz<r)
240 241 {
241 242 uint16_t innerbuffer[16];
242 243 uint16_t outterbuffer[16];
243 244 int32_t rr=(r*r),rr2=((r-contSz)*(r-contSz)),contSz2,Val1,Val2,X1,W,rem;
244 245 for(int i=0;i<16;i++)innerbuffer[i]=fillColor;
245 246 for(int i=0;i<16;i++)outterbuffer[i]=contColor;
246 247 /* Y = b +/- sqrt[r^2 - (x - a)^2] */
247 248 for(int32_t line=-r;line<r;line++)
248 249 {
249 250 #ifdef __OPTIMIZED_MATH
250 251 Val1 = (uint32_t)optimised_sqrt((float32_t)(rr - (line*line)) );
251 252 Val2 = (uint32_t)optimised_sqrt((float32_t)(rr2 - (line*line)) );
252 253 #else
253 254 Val1 = sqrt( (double)(rr - ((line)*(line))) );
254 255 Val2 = sqrt( (double)(rr2 - ((line)*(line))) );
255 256 #endif
256 257 X1=Xpos - Val1;
257 258 contSz2= Val1-Val2;
258 259 ili9328setFrame(LCD,X1,line+Ypos,2*Val1,1);
259 260 rem=(contSz2)%16;
260 if(rem)LCD->interface->writeGRAM(outterbuffer,rem);
261 if(rem)LCD->interface.lcd_interface->writeGRAM(outterbuffer,rem);
261 262 for(int i=rem;i<(contSz2);i+=16)
262 263 {
263 LCD->interface->writeGRAM(outterbuffer,16);
264 LCD->interface.lcd_interface->writeGRAM(outterbuffer,16);
264 265 }
265 266
266 267 W=2*Val1;
267 268 if(W>(2*contSz2))
268 269 {
269 270 W-=2*contSz2;
270 271 rem=(W)%16;
271 if(rem)LCD->interface->writeGRAM(innerbuffer,rem);
272 if(rem)LCD->interface.lcd_interface->writeGRAM(innerbuffer,rem);
272 273 for(int i=rem;i<(W);i+=16)
273 274 {
274 LCD->interface->writeGRAM(innerbuffer,16);
275 LCD->interface.lcd_interface->writeGRAM(innerbuffer,16);
275 276 }
276 277 }
277 278
278 279 rem=(contSz2)%16;
279 if(rem)LCD->interface->writeGRAM(outterbuffer,rem);
280 if(rem)LCD->interface.lcd_interface->writeGRAM(outterbuffer,rem);
280 281 for(int i=rem;i<(contSz2);i+=16)
281 282 {
282 LCD->interface->writeGRAM(outterbuffer,16);
283 LCD->interface.lcd_interface->writeGRAM(outterbuffer,16);
283 284 }
284 285 }
285 286 }
286 287 }
287 288
288 289
289 290
290 291
291 292 void ili9328paintFilRect(LCD_t* LCD,uint16_t Xpos,uint16_t Ypos,uint16_t w,uint16_t h,uint32_t contColor,uint16_t contSz,uint32_t fillColor)
292 293 {
293 294 ili9328setFrame(LCD,Xpos,Ypos,w,h);
294 295 uint16_t tmp[32];
295 296 for(int i=0;i<32;i++)tmp[i]=fillColor;
296 297 for(int i=0;i<(h*w);i+=32)
297 298 {
298 LCD->interface->writeGRAM(tmp,32);
299 LCD->interface.lcd_interface->writeGRAM(tmp,32);
299 300 }
300 301 int rem=(w*h)%32;
301 if(rem)LCD->interface->writeGRAM(tmp,rem);
302 if(rem)LCD->interface.lcd_interface->writeGRAM(tmp,rem);
302 303 if(contSz)
303 304 {
304 305 ili9328setFrame(LCD,Xpos,Ypos,w,contSz);
305 306 for(int i=0;i<32;i++)tmp[i]=contColor;
306 307 rem=(w*contSz)%32;
307 if(rem)LCD->interface->writeGRAM(tmp,rem);
308 if(rem)LCD->interface.lcd_interface->writeGRAM(tmp,rem);
308 309 for(int i=rem;i<(w*contSz);i+=32)
309 310 {
310 LCD->interface->writeGRAM(tmp,32);
311 LCD->interface.lcd_interface->writeGRAM(tmp,32);
311 312 }
312 313
313 314 ili9328setFrame(LCD,Xpos,Ypos+h-contSz,w,contSz);
314 315 rem=(w*contSz)%32;
315 if(rem)LCD->interface->writeGRAM(tmp,rem);
316 if(rem)LCD->interface.lcd_interface->writeGRAM(tmp,rem);
316 317 for(int i=rem;i<(w*contSz);i+=32)
317 318 {
318 LCD->interface->writeGRAM(tmp,32);
319 LCD->interface.lcd_interface->writeGRAM(tmp,32);
319 320 }
320 321
321 322 ili9328setFrame(LCD,Xpos,Ypos,contSz,h);
322 323 rem=(h*contSz)%32;
323 if(rem)LCD->interface->writeGRAM(tmp,rem);
324 if(rem)LCD->interface.lcd_interface->writeGRAM(tmp,rem);
324 325 for(int i=rem;i<(h*contSz);i+=32)
325 326 {
326 LCD->interface->writeGRAM(tmp,32);
327 LCD->interface.lcd_interface->writeGRAM(tmp,32);
327 328 }
328 329
329 330 ili9328setFrame(LCD,Xpos+w-contSz,Ypos,contSz,h);
330 331 rem=(h*contSz)%32;
331 if(rem)LCD->interface->writeGRAM(tmp,rem);
332 if(rem)LCD->interface.lcd_interface->writeGRAM(tmp,rem);
332 333 for(int i=rem;i<(h*contSz);i+=32)
333 334 {
334 LCD->interface->writeGRAM(tmp,32);
335 LCD->interface.lcd_interface->writeGRAM(tmp,32);
335 336 }
336 337 }
337 338 }
338 339
339 340 void ili9328paintText(LCD_t* LCD,char* buffer,uint16_t Xpos,uint16_t Ypos,sFONT* font,uint32_t color)
340 341 {
341 342 int w=font->Width,h=font->Height,bpl=font->bytesPerLine,pix=0,tableoffset=0;
342 343 uint16_t tmp[w];
343 344 uint16_t linenum=0,charnum=0;
344 345 uint8_t line=0;
345 346 while(*buffer!='\0')
346 347 {
347 348 if(*buffer<32)*buffer=32;
348 349 if(*buffer>127)*buffer=32;
349 ili9328setFrame(LCD,Xpos+(charnum*w),Ypos-h,w,1);
350 LCD->setFrame(LCD,Xpos+(charnum*w),Ypos-h,w,1);
350 351 // LCD->interface->readGRAM(tmp,w);
351 ili9328getPix(LCD,tmp,Xpos+(charnum*w),Ypos-h,w,1);
352 LCD->getPix(LCD,tmp,Xpos+(charnum*w),Ypos-h,w,1);
352 353 for(int i=0;i<(h*w);i++)
353 354 {
354 355 if( ((i%w)==0) ) //read current line to apply text pixmap
355 356 {
356 357 if(linenum++>0)
357 358 {
358 ili9328setFrame(LCD,Xpos+(charnum*w),Ypos + linenum -h,w,1);
359 LCD->interface->writeGRAM(tmp,w);
359 LCD->setFrame(LCD,Xpos+(charnum*w),Ypos + linenum -h,w,1);
360 LCD->interface.lcd_interface->writeGRAM(tmp,w);
360 361 //ili9328setFrame(LCD,Xpos+(charnum*w),Ypos + linenum + 1-h,w,1);
361 362 // LCD->interface->readGRAM(tmp,w);
362 ili9328getPix(LCD,tmp,Xpos+(charnum*w),Ypos + linenum + 1-h,w,1);
363 LCD->getPix(LCD,tmp,Xpos+(charnum*w),Ypos + linenum + 1-h,w,1);
363 364 pix=0;
364 365 }
365 366 }
366 367 if((pix%8) == 0)
367 368 {
368 369 line=font->table[(((*buffer)-32)*h*bpl)+tableoffset++];
369 370 }
370 371 //tmp[pix]=0;
371 372 if((line & (uint8_t)0x01)==(uint8_t)1)tmp[pix]=(uint16_t)color;
372 373 pix++;
373 374 line>>=1;
374 375 }
375 376 linenum=0;
376 377 tableoffset=0;
377 378 charnum++;
378 379 buffer++;
379 380 }
380 381 }
381 382
382 383
383 384 void ili9328paintChar(LCD_t* LCD,char buffer,uint16_t Xpos,uint16_t Ypos,sFONT* font,uint32_t color)
384 385 {
385 386 int w=font->Width,h=font->Height,bpl=font->bytesPerLine,pix=0,tableoffset=0;
386 387 uint16_t tmp[w];
387 388 uint16_t tmp2[w];
388 389 uint16_t linenum=0,charnum=0;
389 390 uint8_t line=0;
390 391 if(buffer<32)buffer=32;
391 392 if(buffer>127)buffer=32;
392 393 ili9328setFrame(LCD,Xpos,Ypos-h,w,1);
393 394 // LCD->interface->readGRAM(tmp,w);
394 395 ili9328getPix(LCD,tmp2,Xpos,Ypos-h,w,1);
395 396 for(int i=0;i<w;i++)
396 397 {
397 398 tmp[i]=0;
398 399 }
399 400 for(int i=0;i<(h*w);i++)
400 401 {
401 402 if( ((i%w)==0) ) //read current line to apply text pixmap
402 403 {
403 404 if(linenum++>0)
404 405 {
405 406 ili9328setFrame(LCD,Xpos,Ypos + linenum -h,w,1);
406 LCD->interface->writeGRAM(tmp,w);
407 LCD->interface.lcd_interface->writeGRAM(tmp,w);
407 408 //ili9328setFrame(LCD,Xpos+(charnum*w),Ypos + linenum + 1-h,w,1);
408 409 // LCD->interface->readGRAM(tmp,w);
409 410 ili9328getPix(LCD,tmp2,Xpos,Ypos + linenum + 1-h,w,1);
410 411 for(int i=0;i<w;i++)
411 412 {
412 413 tmp[i]=0;
413 414 }
414 415 pix=0;
415 416 }
416 417 }
417 418 if((pix%8) == 0)
418 419 {
419 420 line=font->table[(((buffer)-32)*h*bpl)+tableoffset++];
420 421 }
421 422 //tmp[pix]=0;
422 423 if((line & (uint8_t)0x01)==(uint8_t)1)tmp[pix]=(uint16_t)color;
423 424 pix++;
424 425 line>>=1;
425 426 }
426 427
427 428 }
428 429
429 430 int ili9328init(struct LCD_t* LCD)
430 431 {
431 if((LCD!=NULL) && (LCD->interface!=NULL) && (LCD->interface->writereg!=NULL))
432 if((LCD!=NULL) && (LCD->interface.lcd_interface!=NULL) && (LCD->interface.lcd_interface->writereg!=NULL))
432 433 {
433 LCD->interface->writereg(ILI9328_REGISTER_DRIVEROUTPUTCONTROL1, 0x0100); // Driver Output Control Register (R01h)
434 LCD->interface->writereg(ILI9328_REGISTER_LCDDRIVINGCONTROL, 0x0700); // LCD Driving Waveform Control (R02h)
435 LCD->interface->writereg(ILI9328_REGISTER_ENTRYMODE, 0x0230); // Entry Mode (R03h)
436 LCD->interface->writereg(ILI9328_REGISTER_DISPLAYCONTROL1, 0xC000);
437 LCD->interface->writereg(ILI9328_REGISTER_DISPLAYCONTROL2, 0x0302);
438 LCD->interface->writereg(ILI9328_REGISTER_DISPLAYCONTROL3, 0x0000);
439 LCD->interface->writereg(ILI9328_REGISTER_DISPLAYCONTROL4, 0x0000); // Fmark On
440 LCD->interface->writereg(ILI9328_REGISTER_POWERCONTROL1, 0x0000); // Power Control 1 (R10h)
441 LCD->interface->writereg(ILI9328_REGISTER_POWERCONTROL2, 0x0007); // Power Control 2 (R11h)
442 LCD->interface->writereg(ILI9328_REGISTER_POWERCONTROL3, 0x0000); // Power Control 3 (R12h)
443 LCD->interface->writereg(ILI9328_REGISTER_POWERCONTROL4, 0x0000); // Power Control 4 (R13h)
434 LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_DRIVEROUTPUTCONTROL1, 0x0100); // Driver Output Control Register (R01h)
435 LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_LCDDRIVINGCONTROL, 0x0700); // LCD Driving Waveform Control (R02h)
436 LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_ENTRYMODE, 0x0230); // Entry Mode (R03h)
437 LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_DISPLAYCONTROL1, 0xC000);
438 LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_DISPLAYCONTROL2, 0x0302);
439 LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_DISPLAYCONTROL3, 0x0000);
440 LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_DISPLAYCONTROL4, 0x0000); // Fmark On
441 LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_POWERCONTROL1, 0x0000); // Power Control 1 (R10h)
442 LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_POWERCONTROL2, 0x0007); // Power Control 2 (R11h)
443 LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_POWERCONTROL3, 0x0000); // Power Control 3 (R12h)
444 LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_POWERCONTROL4, 0x0000); // Power Control 4 (R13h)
444 445 delay_100us(1000);
445 LCD->interface->writereg(ILI9328_REGISTER_POWERCONTROL1, 0x14B0); // Power Control 1 (R10h)
446 LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_POWERCONTROL1, 0x14B0); // Power Control 1 (R10h)
446 447 delay_100us(500);
447 LCD->interface->writereg(ILI9328_REGISTER_POWERCONTROL2, 0x0007); // Power Control 2 (R11h)
448 LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_POWERCONTROL2, 0x0007); // Power Control 2 (R11h)
448 449 delay_100us(500);
449 LCD->interface->writereg(ILI9328_REGISTER_POWERCONTROL3, 0x008E); // Power Control 3 (R12h)
450 LCD->interface->writereg(ILI9328_REGISTER_POWERCONTROL4, 0x0C00); // Power Control 4 (R13h)
451 LCD->interface->writereg(ILI9328_REGISTER_POWERCONTROL7, 0x0015); // NVM read data 2 (R29h)
450 LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_POWERCONTROL3, 0x008E); // Power Control 3 (R12h)
451 LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_POWERCONTROL4, 0x0C00); // Power Control 4 (R13h)
452 LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_POWERCONTROL7, 0x0015); // NVM read data 2 (R29h)
452 453 delay_100us(500);
453 LCD->interface->writereg(ILI9328_REGISTER_GAMMACONTROL1, 0x0000); // Gamma Control 1
454 LCD->interface->writereg(ILI9328_REGISTER_GAMMACONTROL2, 0x0107); // Gamma Control 2
455 LCD->interface->writereg(ILI9328_REGISTER_GAMMACONTROL3, 0x0000); // Gamma Control 3
456 LCD->interface->writereg(ILI9328_REGISTER_GAMMACONTROL4, 0x0203); // Gamma Control 4
457 LCD->interface->writereg(ILI9328_REGISTER_GAMMACONTROL5, 0x0402); // Gamma Control 5
458 LCD->interface->writereg(ILI9328_REGISTER_GAMMACONTROL6, 0x0000); // Gamma Control 6
459 LCD->interface->writereg(ILI9328_REGISTER_GAMMACONTROL7, 0x0207); // Gamma Control 7
460 LCD->interface->writereg(ILI9328_REGISTER_GAMMACONTROL8, 0x0000); // Gamma Control 8
461 LCD->interface->writereg(ILI9328_REGISTER_GAMMACONTROL9, 0x0203); // Gamma Control 9
462 LCD->interface->writereg(ILI9328_REGISTER_GAMMACONTROL10, 0x0403); // Gamma Control 10
463 LCD->interface->writereg(ILI9328_REGISTER_HORIZONTALADDRESSSTARTPOSITION, 0x0000); // Window Horizontal RAM Address Start (R50h)
464 LCD->interface->writereg(ILI9328_REGISTER_HORIZONTALADDRESSENDPOSITION, LCD->width - 1); // Window Horizontal RAM Address End (R51h)
465 LCD->interface->writereg(ILI9328_REGISTER_VERTICALADDRESSSTARTPOSITION, 0X0000); // Window Vertical RAM Address Start (R52h)
466 LCD->interface->writereg(ILI9328_REGISTER_VERTICALADDRESSENDPOSITION, LCD->height - 1); // Window Vertical RAM Address End (R53h)
467 LCD->interface->writereg(ILI9328_REGISTER_DRIVEROUTPUTCONTROL2, 0xa700); // Driver Output Control (R60h)
468 LCD->interface->writereg(ILI9328_REGISTER_BASEIMAGEDISPLAYCONTROL, 0x0003); // Driver Output Control (R61h) - enable VLE
469 LCD->interface->writereg(ILI9328_REGISTER_PANELINTERFACECONTROL1, 0X0010); // Panel Interface Control 1 (R90h)
454 LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_GAMMACONTROL1, 0x0000); // Gamma Control 1
455 LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_GAMMACONTROL2, 0x0107); // Gamma Control 2
456 LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_GAMMACONTROL3, 0x0000); // Gamma Control 3
457 LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_GAMMACONTROL4, 0x0203); // Gamma Control 4
458 LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_GAMMACONTROL5, 0x0402); // Gamma Control 5
459 LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_GAMMACONTROL6, 0x0000); // Gamma Control 6
460 LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_GAMMACONTROL7, 0x0207); // Gamma Control 7
461 LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_GAMMACONTROL8, 0x0000); // Gamma Control 8
462 LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_GAMMACONTROL9, 0x0203); // Gamma Control 9
463 LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_GAMMACONTROL10, 0x0403); // Gamma Control 10
464 LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_HORIZONTALADDRESSSTARTPOSITION, 0x0000); // Window Horizontal RAM Address Start (R50h)
465 LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_HORIZONTALADDRESSENDPOSITION, LCD->width - 1); // Window Horizontal RAM Address End (R51h)
466 LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_VERTICALADDRESSSTARTPOSITION, 0X0000); // Window Vertical RAM Address Start (R52h)
467 LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_VERTICALADDRESSENDPOSITION, LCD->height - 1); // Window Vertical RAM Address End (R53h)
468 LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_DRIVEROUTPUTCONTROL2, 0xa700); // Driver Output Control (R60h)
469 LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_BASEIMAGEDISPLAYCONTROL, 0x0003); // Driver Output Control (R61h) - enable VLE
470 LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_PANELINTERFACECONTROL1, 0X0010); // Panel Interface Control 1 (R90h)
470 471 // Display On
471 LCD->interface->writereg(ILI9328_REGISTER_DISPLAYCONTROL1, 0x0133); // Display Control (R07h)
472 LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_DISPLAYCONTROL1, 0x0133); // Display Control (R07h)
472 473 delay_100us(500);
473 474 LCD->paintFilRect(LCD,0,0,LCD->width,LCD->height,0,0,0xFFFF);
474 475 }
475 476 return 0;
476 477 }
477 478
478 479 void ili9328cpFrame(LCD_t* LCD,void* buffer,int x,int y,int w, int h)
479 480 {
480 #define __set__Address__(_x_,_y_) LCD->interface->writereg(ILI9328_REGISTER_HORIZONTALGRAMADDRESSSET,_x_); \
481 LCD->interface->writereg(ILI9328_REGISTER_VERTICALGRAMADDRESSSET,_y_)
481 #define __set__Address__(_x_,_y_) LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_HORIZONTALGRAMADDRESSSET,_x_); \
482 LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_VERTICALGRAMADDRESSSET,_y_)
482 483
483 484 uint16_t* castedBuff = (uint16_t*)buffer;
484 485 int cx=x,cy=y;
485 486 for(int i=0;i<(w*h);i++)
486 487 {
487 488 __set__Address__(cx,cy);
488 LCD->interface->readGRAM((void*)(&castedBuff[i]),1);
489 LCD->interface.lcd_interface->readGRAM((void*)(&castedBuff[i]),1);
489 490 cx+=1;
490 491 if(cx>=(w+x))
491 492 {
492 493 cx=x;
493 494 cy+=1;
494 495 }
495 496 }
496 497 }
497 498
498 499
499 500
500 501 void ili9328getPix(struct LCD_t* LCD,uint16_t* buffer,uint16_t Xpos,uint16_t Ypos,uint16_t w,uint16_t h)
501 502 {
502 #define __set__Address__(_x_,_y_) LCD->interface->writereg(ILI9328_REGISTER_HORIZONTALGRAMADDRESSSET,_x_); \
503 LCD->interface->writereg(ILI9328_REGISTER_VERTICALGRAMADDRESSSET,_y_)
503 #define __set__Address__(_x_,_y_) LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_HORIZONTALGRAMADDRESSSET,_x_); \
504 LCD->interface.lcd_interface->writereg(ILI9328_REGISTER_VERTICALGRAMADDRESSSET,_y_)
504 505
505 506 int cx=Xpos,cy=Ypos;
506 507 ili9328setFrame(LCD,Xpos,Ypos,w,h);
507 508 for(int i=0;i<(w*h);i++)
508 509 {
509 510 __set__Address__(cx,cy);
510 LCD->interface->readGRAM((void*)(&buffer[i]),1);
511 LCD->interface.lcd_interface->readGRAM((void*)(&buffer[i]),1);
511 512 cx+=1;
512 513 if(cx>=(w+Xpos))
513 514 {
514 515 cx=Xpos;
515 516 cy+=1;
516 517 }
517 518 }
518 519
519 520 }
520 521
521 522
522 523
523 524
524 525
525 526
526 527
527 528
528 529
529 530
530 531
531 532
532 533
533 534
534 535
@@ -1,416 +1,416
1 1 /*------------------------------------------------------------------------------
2 2 -- This file is a part of the libuc, microcontroler library
3 3 -- Copyright (C) 2013, Alexis Jeandet
4 4 --
5 5 -- This program is free software; you can redistribute it and/or modify
6 6 -- it under the terms of the GNU General Public License as published by
7 7 -- the Free Software Foundation; either version 3 of the License, or
8 8 -- (at your option) any later version.
9 9 --
10 10 -- This program is distributed in the hope that it will be useful,
11 11 -- but WITHOUT ANY WARRANTY; without even the implied warranty of
12 12 -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 13 -- GNU General Public License for more details.
14 14 --
15 15 -- You should have received a copy of the GNU General Public License
16 16 -- along with this program; if not, write to the Free Software
17 17 -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 18 -------------------------------------------------------------------------------
19 19 -- Author : Alexis Jeandet
20 20 -- Mail : alexis.jeandet@member.fsf.org
21 21 -------------------------------------------------------------------------------*/
22 22 #include <ssd2119.h>
23 23 #include <stdio.h>
24 24 #include <stddef.h>
25 25 #include <core.h>
26 26 #include <math.h>
27 27
28 28 #ifdef __OPTIMIZED_MATH
29 29 #include <optimised_math.h>
30 30 #endif
31 31
32 32 #define _delay_(del) for(volatile int _d_e_l_=0;_d_e_l_<(del);_d_e_l_++);
33 33
34 34 #define ilipaintLine(LCD,X,Y,W,buffer,buffsize) \
35 35 for(int l=0;l<1;l++)\
36 36 {\
37 37 ssd2119setFrame(LCD,X,Y,W,1);\
38 38 int rem=(W)%buffsize;\
39 if(rem)LCD->interface->writeGRAM(buffer,rem);\
39 if(rem)LCD->interface.lcd_interface->writeGRAM(buffer,rem);\
40 40 for(int i=rem;i<(W);i+=buffsize)\
41 41 {\
42 LCD->interface->writeGRAM(buffer,buffsize);\
42 LCD->interface.lcd_interface->writeGRAM(buffer,buffsize);\
43 43 }\
44 44 }
45 45
46 46 #define ilipaintHLineWithCont(LCD,X,Y,W,ContSz,bufferInt,buffIntsize,bufferCont,buffContsize) \
47 47 for(int l=0;l<1;l++)\
48 48 {\
49 49 ssd2119setFrame(LCD,X,Y,W,1);\
50 50 int rem=(ContSz)%buffContsize;\
51 if(rem)LCD->interface->writeGRAM(bufferCont,rem);\
51 if(rem)LCD->interface.lcd_interface->writeGRAM(bufferCont,rem);\
52 52 for(int i=rem;i<(ContSz);i+=buffContsize)\
53 53 {\
54 LCD->interface->writeGRAM(bufferCont,buffContsize);\
54 LCD->interface.lcd_interface->writeGRAM(bufferCont,buffContsize);\
55 55 }\
56 56 if((2*ContSz)<W) \
57 57 {\
58 58 rem=(W-(2*ContSz))%buffIntsize;\
59 if(rem)LCD->interface->writeGRAM(bufferInt,rem);\
59 if(rem)LCD->interface.lcd_interface->writeGRAM(bufferInt,rem);\
60 60 for(int i=rem;i<(W-(2*ContSz));i+=buffIntsize)\
61 61 {\
62 LCD->interface->writeGRAM(bufferInt,buffIntsize);\
62 LCD->interface.lcd_interface->writeGRAM(bufferInt,buffIntsize);\
63 63 }\
64 64 }\
65 65 rem=(ContSz)%buffContsize;\
66 if(rem)LCD->interface->writeGRAM(bufferCont,rem);\
66 if(rem)LCD->interface.lcd_interface->writeGRAM(bufferCont,rem);\
67 67 for(int i=rem;i<(ContSz);i+=buffContsize)\
68 68 {\
69 LCD->interface->writeGRAM(bufferCont,buffContsize);\
69 LCD->interface.lcd_interface->writeGRAM(bufferCont,buffContsize);\
70 70 }\
71 71 }\
72 72
73 73
74 74 #define ilipaintVLineWithCont(LCD,X,Y,H,ContSz,bufferInt,buffIntsize,bufferCont,buffContsize) \
75 75 for(int l=0;l<1;l++)\
76 76 {\
77 77 ssd2119setFrame(LCD,X,Y,1,H);\
78 78 int rem=(ContSz)%buffContsize;\
79 if(rem)LCD->interface->writeGRAM(bufferCont,rem);\
79 if(rem)LCD->interface.lcd_interface->writeGRAM(bufferCont,rem);\
80 80 for(int i=rem;i<(ContSz);i+=buffContsize)\
81 81 {\
82 LCD->interface->writeGRAM(bufferCont,buffContsize);\
82 LCD->interface.lcd_interface->writeGRAM(bufferCont,buffContsize);\
83 83 }\
84 84 if((2*ContSz)<H) \
85 85 {\
86 86 rem=(H-(2*ContSz))%buffIntsize;\
87 if(rem)LCD->interface->writeGRAM(bufferInt,rem);\
87 if(rem)LCD->interface.lcd_interface->writeGRAM(bufferInt,rem);\
88 88 for(int i=rem;i<(H-(2*ContSz));i+=buffIntsize)\
89 89 {\
90 LCD->interface->writeGRAM(bufferInt,buffIntsize);\
90 LCD->interface.lcd_interface->writeGRAM(bufferInt,buffIntsize);\
91 91 }\
92 92 }\
93 93 rem=(ContSz)%buffContsize;\
94 if(rem)LCD->interface->writeGRAM(bufferCont,rem);\
94 if(rem)LCD->interface.lcd_interface->writeGRAM(bufferCont,rem);\
95 95 for(int i=rem;i<(ContSz);i+=buffContsize)\
96 96 {\
97 LCD->interface->writeGRAM(bufferCont,buffContsize);\
97 LCD->interface.lcd_interface->writeGRAM(bufferCont,buffContsize);\
98 98 }\
99 99 }\
100 100
101 101
102 102 #define ilipaintHalfTopVLineWithCont(LCD,X,Y,H,ContSz,bufferInt,buffIntsize,bufferCont,buffContsize) \
103 103 for(int l=0;l<1;l++)\
104 104 {\
105 105 ssd2119setFrame(LCD,X,Y,1,H);\
106 106 int rem=(ContSz)%buffContsize;\
107 if(rem)LCD->interface->writeGRAM(bufferCont,rem);\
107 if(rem)LCD->interface.lcd_interface->writeGRAM(bufferCont,rem);\
108 108 for(int i=rem;i<(ContSz);i+=buffContsize)\
109 109 {\
110 LCD->interface->writeGRAM(bufferCont,buffContsize);\
110 LCD->interface.lcd_interface->writeGRAM(bufferCont,buffContsize);\
111 111 }\
112 112 if(ContSz<H) \
113 113 {\
114 114 rem=(H-ContSz)%buffIntsize;\
115 if(rem)LCD->interface->writeGRAM(bufferInt,rem);\
115 if(rem)LCD->interface.lcd_interface->writeGRAM(bufferInt,rem);\
116 116 for(int i=rem;i<(H-ContSz);i+=buffIntsize)\
117 117 {\
118 LCD->interface->writeGRAM(bufferInt,buffIntsize);\
118 LCD->interface.lcd_interface->writeGRAM(bufferInt,buffIntsize);\
119 119 }\
120 120 }\
121 121 }\
122 122
123 123
124 124 #define ilipaintHalfBottomVLineWithCont(LCD,X,Y,H,ContSz,bufferInt,buffIntsize,bufferCont,buffContsize) \
125 125 for(int l=0;l<1;l++)\
126 126 {\
127 127 ssd2119setFrame(LCD,X,Y,1,H);\
128 128 int rem;\
129 129 if(ContSz<H) \
130 130 {\
131 131 rem=(H-ContSz)%buffIntsize;\
132 if(rem)LCD->interface->writeGRAM(bufferInt,rem);\
132 if(rem)LCD->interface.lcd_interface->writeGRAM(bufferInt,rem);\
133 133 for(int i=rem;i<(H-ContSz);i+=buffIntsize)\
134 134 {\
135 LCD->interface->writeGRAM(bufferInt,buffIntsize);\
135 LCD->interface.lcd_interface->writeGRAM(bufferInt,buffIntsize);\
136 136 }\
137 137 }\
138 138 rem=(ContSz)%buffContsize;\
139 if(rem)LCD->interface->writeGRAM(bufferCont,rem);\
139 if(rem)LCD->interface.lcd_interface->writeGRAM(bufferCont,rem);\
140 140 for(int i=rem;i<(ContSz);i+=buffContsize)\
141 141 {\
142 LCD->interface->writeGRAM(bufferCont,buffContsize);\
142 LCD->interface.lcd_interface->writeGRAM(bufferCont,buffContsize);\
143 143 }\
144 144 }\
145 145
146 146
147 147 void ssd2119setGRAMaddress(LCD_t* LCD,uint16_t Haddress,uint16_t Vaddress)
148 148 {
149 LCD->interface->writereg(SSD2119_REGISTER_X_RAM_ADDR,Haddress);
150 LCD->interface->writereg(SSD2119_REGISTER_Y_RAM_ADDR,Vaddress);
149 LCD->interface.lcd_interface->writereg(SSD2119_REGISTER_X_RAM_ADDR,Haddress);
150 LCD->interface.lcd_interface->writereg(SSD2119_REGISTER_Y_RAM_ADDR,Vaddress);
151 151 }
152 152
153 153 void ssd2119refreshenable(struct LCD_t* LCD,int enable)
154 154 {
155 155 if(enable)
156 156 {
157 157 //LCD->interface->writereg(ssd2119_REGISTER_ENTRYMODE,0x1018);
158 158 }
159 159 else
160 160 {
161 161 //LCD->interface->writereg(ssd2119_REGISTER_ENTRYMODE,0x1008);
162 162
163 163 }
164 164 }
165 165
166 166 void ssd2119setFrame(LCD_t* LCD,uint16_t X,uint16_t Y,uint16_t W,uint16_t H)
167 167 {
168 LCD->interface->writereg(SSD2119_REGISTER_X_RAM_ADDR,(uint32_t)X);
169 LCD->interface->writereg(SSD2119_REGISTER_Y_RAM_ADDR,(uint32_t)Y);
170 LCD->interface->writereg(SSD2119_REGISTER_H_RAM_START,(uint32_t)X);
171 LCD->interface->writereg(SSD2119_REGISTER_H_RAM_END,(uint32_t)(W+X-1));
172 LCD->interface->writereg(SSD2119_REGISTER_V_RAM_POS,(((uint32_t)(Y+H-1))<<8) + (uint32_t)Y);
168 LCD->interface.lcd_interface->writereg(SSD2119_REGISTER_X_RAM_ADDR,(uint32_t)X);
169 LCD->interface.lcd_interface->writereg(SSD2119_REGISTER_Y_RAM_ADDR,(uint32_t)Y);
170 LCD->interface.lcd_interface->writereg(SSD2119_REGISTER_H_RAM_START,(uint32_t)X);
171 LCD->interface.lcd_interface->writereg(SSD2119_REGISTER_H_RAM_END,(uint32_t)(W+X-1));
172 LCD->interface.lcd_interface->writereg(SSD2119_REGISTER_V_RAM_POS,(((uint32_t)(Y+H-1))<<8) + (uint32_t)Y);
173 173 }
174 174
175 175 void ssd2119paint(LCD_t* LCD,void* buffer,uint16_t Xpos,uint16_t Ypos,uint16_t Width,uint16_t Height)
176 176 {
177 if((LCD!=NULL) && (LCD->interface!=NULL) && (LCD->interface->writeGRAM!=NULL) && (LCD->width>(Xpos+Width)) && (LCD->height>(Ypos+Height)))
177 if((LCD!=NULL) && (LCD->interface.lcd_interface!=NULL) && (LCD->interface.lcd_interface->writeGRAM!=NULL) && (LCD->width>(Xpos+Width)) && (LCD->height>(Ypos+Height)))
178 178 {
179 179 ssd2119setFrame(LCD,Xpos,Ypos,Width,Height);
180 LCD->interface->writeGRAM(buffer,Width*Height);
180 LCD->interface.lcd_interface->writeGRAM(buffer,Width*Height);
181 181 }
182 182 }
183 183
184 184 void ssd2119paintFilCirc(LCD_t* LCD,uint16_t Xpos,uint16_t Ypos,uint16_t r,uint32_t contColor,uint16_t contSz,uint32_t fillColor)
185 185 {
186 186 //Based on the mid point circle algorithm from Wikipedia
187 187 //http://en.wikipedia.org/wiki/Midpoint_circle_algorithm
188 188 uint16_t innerbuffer[16];
189 189 uint16_t outterbuffer[16];
190 190 for(int i=0;i<16;i++)innerbuffer[i]=fillColor;
191 191 for(int i=0;i<16;i++)outterbuffer[i]=contColor;
192 192 if(contSz<r)
193 193 {
194 194 int error = -r,error_int = -r+contSz;
195 195 int x = r,x_int=r-contSz;
196 196 int y = 0,y_int=0;
197 197 while (x >= y)
198 198 {
199 199 ilipaintHLineWithCont(LCD,(Xpos-x),(Ypos+y),(2*x),(x-x_int),innerbuffer,16,outterbuffer,16);
200 200 ilipaintHLineWithCont(LCD,(Xpos-x),(Ypos-y),(2*x),(x-x_int),innerbuffer,16,outterbuffer,16);
201 201 ilipaintHalfTopVLineWithCont(LCD,(Xpos+y),(Ypos-x),(x),(x-x_int),innerbuffer,16,outterbuffer,16);
202 202 ilipaintHalfTopVLineWithCont(LCD,(Xpos-y),(Ypos-x),(x),(x-x_int),innerbuffer,16,outterbuffer,16);
203 203 ilipaintHalfBottomVLineWithCont(LCD,(Xpos-y),(Ypos),(x),(x-x_int),innerbuffer,16,outterbuffer,16);
204 204 ilipaintHalfBottomVLineWithCont(LCD,(Xpos+y),(Ypos),(x),(x-x_int),innerbuffer,16,outterbuffer,16);
205 205 error += y;
206 206 ++y;
207 207 error += y;
208 208 error_int += y_int;
209 209 ++y_int;
210 210 error_int += y_int;
211 211 if(error >= 0)
212 212 {
213 213 error -= x;
214 214 --x;
215 215 error -= x;
216 216 }
217 217 if(error_int >= 0)
218 218 {
219 219 error_int -= x_int;
220 220 --x_int;
221 221 error_int -= x_int;
222 222 }
223 223 }
224 224
225 225
226 226
227 227 }
228 228
229 229 }
230 230
231 231 void ssd2119paintFilCirc_old(LCD_t* LCD,uint16_t Xpos,uint16_t Ypos,uint16_t r,uint32_t contColor,uint16_t contSz,uint32_t fillColor)
232 232 {
233 233 if(contSz<r)
234 234 {
235 235 uint16_t innerbuffer[16];
236 236 uint16_t outterbuffer[16];
237 237 int32_t rr=(r*r),rr2=((r-contSz)*(r-contSz)),contSz2,Val1,Val2,X1,W,rem;
238 238 for(int i=0;i<16;i++)innerbuffer[i]=fillColor;
239 239 for(int i=0;i<16;i++)outterbuffer[i]=contColor;
240 240 /* Y = b +/- sqrt[r^2 - (x - a)^2] */
241 241 for(int32_t line=-r;line<r;line++)
242 242 {
243 243 #ifdef __OPTIMIZED_MATH
244 244 Val1 = (uint32_t)optimised_sqrt((float32_t)(rr - (line*line)) );
245 245 Val2 = (uint32_t)optimised_sqrt((float32_t)(rr2 - (line*line)) );
246 246 #else
247 247 Val1 = sqrt( (double)(rr - ((line)*(line))) );
248 248 Val2 = sqrt( (double)(rr2 - ((line)*(line))) );
249 249 #endif
250 250 X1=Xpos - Val1;
251 251 contSz2= Val1-Val2;
252 252 ssd2119setFrame(LCD,X1,line+Ypos,2*Val1,1);
253 253 rem=(contSz2)%16;
254 if(rem)LCD->interface->writeGRAM(outterbuffer,rem);
254 if(rem)LCD->interface.lcd_interface->writeGRAM(outterbuffer,rem);
255 255 for(int i=rem;i<(contSz2);i+=16)
256 256 {
257 LCD->interface->writeGRAM(outterbuffer,16);
257 LCD->interface.lcd_interface->writeGRAM(outterbuffer,16);
258 258 }
259 259
260 260 W=2*Val1;
261 261 if(W>(2*contSz2))
262 262 {
263 263 W-=2*contSz2;
264 264 rem=(W)%16;
265 if(rem)LCD->interface->writeGRAM(innerbuffer,rem);
265 if(rem)LCD->interface.lcd_interface->writeGRAM(innerbuffer,rem);
266 266 for(int i=rem;i<(W);i+=16)
267 267 {
268 LCD->interface->writeGRAM(innerbuffer,16);
268 LCD->interface.lcd_interface->writeGRAM(innerbuffer,16);
269 269 }
270 270 }
271 271
272 272 rem=(contSz2)%16;
273 if(rem)LCD->interface->writeGRAM(outterbuffer,rem);
273 if(rem)LCD->interface.lcd_interface->writeGRAM(outterbuffer,rem);
274 274 for(int i=rem;i<(contSz2);i+=16)
275 275 {
276 LCD->interface->writeGRAM(outterbuffer,16);
276 LCD->interface.lcd_interface->writeGRAM(outterbuffer,16);
277 277 }
278 278 }
279 279 }
280 280 }
281 281
282 282
283 283
284 284
285 285 void ssd2119paintFilRect(LCD_t* LCD,uint16_t Xpos,uint16_t Ypos,uint16_t w,uint16_t h,uint32_t contColor,uint16_t contSz,uint32_t fillColor)
286 286 {
287 287 ssd2119setFrame(LCD,Xpos,Ypos,w,h);
288 288 uint16_t tmp[32];
289 289 for(int i=0;i<32;i++)tmp[i]=fillColor;
290 290 for(int i=0;i<(h*w);i+=32)
291 291 {
292 LCD->interface->writeGRAM(tmp,32);
292 LCD->interface.lcd_interface->writeGRAM(tmp,32);
293 293 }
294 294 int rem=(w*h)%32;
295 if(rem)LCD->interface->writeGRAM(tmp,rem);
295 if(rem)LCD->interface.lcd_interface->writeGRAM(tmp,rem);
296 296 if(contSz)
297 297 {
298 298 ssd2119setFrame(LCD,Xpos,Ypos,w,contSz);
299 299 for(int i=0;i<32;i++)tmp[i]=contColor;
300 300 rem=(w*contSz)%32;
301 if(rem)LCD->interface->writeGRAM(tmp,rem);
301 if(rem)LCD->interface.lcd_interface->writeGRAM(tmp,rem);
302 302 for(int i=rem;i<(w*contSz);i+=32)
303 303 {
304 LCD->interface->writeGRAM(tmp,32);
304 LCD->interface.lcd_interface->writeGRAM(tmp,32);
305 305 }
306 306
307 307 ssd2119setFrame(LCD,Xpos,Ypos+h-contSz,w,contSz);
308 308 rem=(w*contSz)%32;
309 if(rem)LCD->interface->writeGRAM(tmp,rem);
309 if(rem)LCD->interface.lcd_interface->writeGRAM(tmp,rem);
310 310 for(int i=rem;i<(w*contSz);i+=32)
311 311 {
312 LCD->interface->writeGRAM(tmp,32);
312 LCD->interface.lcd_interface->writeGRAM(tmp,32);
313 313 }
314 314
315 315 ssd2119setFrame(LCD,Xpos,Ypos,contSz,h);
316 316 rem=(h*contSz)%32;
317 if(rem)LCD->interface->writeGRAM(tmp,rem);
317 if(rem)LCD->interface.lcd_interface->writeGRAM(tmp,rem);
318 318 for(int i=rem;i<(h*contSz);i+=32)
319 319 {
320 LCD->interface->writeGRAM(tmp,32);
320 LCD->interface.lcd_interface->writeGRAM(tmp,32);
321 321 }
322 322
323 323 ssd2119setFrame(LCD,Xpos+w-contSz,Ypos,contSz,h);
324 324 rem=(h*contSz)%32;
325 if(rem)LCD->interface->writeGRAM(tmp,rem);
325 if(rem)LCD->interface.lcd_interface->writeGRAM(tmp,rem);
326 326 for(int i=rem;i<(h*contSz);i+=32)
327 327 {
328 LCD->interface->writeGRAM(tmp,32);
328 LCD->interface.lcd_interface->writeGRAM(tmp,32);
329 329 }
330 330 }
331 331 }
332 332
333 333 void ssd2119paintText(LCD_t* LCD,char* buffer,uint16_t Xpos,uint16_t Ypos,sFONT* font,uint32_t color)
334 334 {
335 335 int w=font->Width,h=font->Height,bpl=font->bytesPerLine,pix=0,tableoffset=0;
336 336 uint16_t tmp[w];
337 337 uint16_t linenum=0,charnum=0;
338 338 uint8_t line=0;
339 339 while(*buffer!='\0')
340 340 {
341 341 ssd2119setFrame(LCD,Xpos+(charnum*w),Ypos-h,w,1);
342 LCD->interface->readGRAM(tmp,w);
342 LCD->interface.lcd_interface->readGRAM(tmp,w);
343 343 for(int i=0;i<(h*w);i++)
344 344 {
345 345 if( ((i%w)==0) ) //read current line to apply text pixmap
346 346 {
347 347 if(linenum++>0)
348 348 {
349 349 ssd2119setFrame(LCD,Xpos+(charnum*(w-10)),Ypos + linenum -h,w,1); // TODO remove -10 and generate good fonts!
350 LCD->interface->writeGRAM(tmp,w);
350 LCD->interface.lcd_interface->writeGRAM(tmp,w);
351 351 ssd2119setFrame(LCD,Xpos+(charnum*(w-10)),Ypos + linenum + 1-h,w,1);
352 LCD->interface->readGRAM(tmp,w);
352 LCD->interface.lcd_interface->readGRAM(tmp,w);
353 353 pix=0;
354 354 }
355 355 }
356 356 if((pix%8) == 0)
357 357 {
358 358 line=font->table[(((*buffer)-32)*h*bpl)+tableoffset++];
359 359 }
360 360 if((line & (uint8_t)0x01)==(uint8_t)1)tmp[pix]=(uint16_t)color;
361 361 pix++;
362 362 line>>=1;
363 363 }
364 364 linenum=0;
365 365 tableoffset=0;
366 366 charnum++;
367 367 buffer++;
368 368 }
369 369 }
370 370
371 371
372 372 int ssd2119init(struct LCD_t* LCD)
373 373 {
374 if((LCD!=NULL) && (LCD->interface!=NULL) && (LCD->interface->writereg!=NULL))
374 if((LCD!=NULL) && (LCD->interface.lcd_interface!=NULL) && (LCD->interface.lcd_interface->writereg!=NULL))
375 375 {
376 LCD->interface->writereg(0x28,0x0006); // VCOM OTP - Page 55-56 of SSD2119 datasheet
377 LCD->interface->writereg(0x00,0x0001); // start Oscillator - Page 36 of SSD2119 datasheet
378 LCD->interface->writereg(0x10,0x0000); // Sleep mode - Page 49 of SSD2119 datasheet
379 LCD->interface->writereg(0x01,0x72ef); // Driver Output Control - Page 36-39 of SSD2119 datasheet
380 LCD->interface->writereg(0x02,0x0600); // LCD Driving Waveform Control - Page 40-42 of SSD2119 datasheet
381 LCD->interface->writereg(0x03,0x6a38); // Power Control 1 - Page 43-44 of SSD2119 datasheet
382 LCD->interface->writereg(0x11,0x6870); // Entry Mode - Page 50-52 of SSD2119 datasheet
376 LCD->interface.lcd_interface->writereg(0x28,0x0006); // VCOM OTP - Page 55-56 of SSD2119 datasheet
377 LCD->interface.lcd_interface->writereg(0x00,0x0001); // start Oscillator - Page 36 of SSD2119 datasheet
378 LCD->interface.lcd_interface->writereg(0x10,0x0000); // Sleep mode - Page 49 of SSD2119 datasheet
379 LCD->interface.lcd_interface->writereg(0x01,0x72ef); // Driver Output Control - Page 36-39 of SSD2119 datasheet
380 LCD->interface.lcd_interface->writereg(0x02,0x0600); // LCD Driving Waveform Control - Page 40-42 of SSD2119 datasheet
381 LCD->interface.lcd_interface->writereg(0x03,0x6a38); // Power Control 1 - Page 43-44 of SSD2119 datasheet
382 LCD->interface.lcd_interface->writereg(0x11,0x6870); // Entry Mode - Page 50-52 of SSD2119 datasheet
383 383
384 384 // RAM WRITE DATA MASK
385 LCD->interface->writereg(0x0f,0x0000); // Gate Scan Position - Page 49 of SSD2119 datasheet
385 LCD->interface.lcd_interface->writereg(0x0f,0x0000); // Gate Scan Position - Page 49 of SSD2119 datasheet
386 386 // RAM WRITE DATA MASK
387 LCD->interface->writereg(0x0b,0x5308); // Frame Cycle Control - Page 45 of SSD2119 datasheet
388 LCD->interface->writereg(0x0c,0x0003); // Power Control 2 - Page 47 of SSD2119 datasheet
389 LCD->interface->writereg(0x0d,0x000a); // Power Control 3 - Page 48 of SSD2119 datasheet
390 LCD->interface->writereg(0x0e,0x2e00); // Power Control 4 - Page 48 of SSD2119 datasheet
391 LCD->interface->writereg(0x1e,0x00be); // Power Control 5 - Page 53 of SSD2119 datasheet
392 LCD->interface->writereg(0x25,0x8000); // Frame Frequency Control - Page 53 of SSD2119 datasheet
393 LCD->interface->writereg(0x26,0x7800); // Analog setting - Page 54 of SSD2119 datasheet
394 LCD->interface->writereg(0x4e,0x0000); // Ram Address Set - Page 58 of SSD2119 datasheet
395 LCD->interface->writereg(0x4f,0x0000); // Ram Address Set - Page 58 of SSD2119 datasheet
396 LCD->interface->writereg(0x12,0x08d9); // Sleep mode - Page 49 of SSD2119 datasheet
387 LCD->interface.lcd_interface->writereg(0x0b,0x5308); // Frame Cycle Control - Page 45 of SSD2119 datasheet
388 LCD->interface.lcd_interface->writereg(0x0c,0x0003); // Power Control 2 - Page 47 of SSD2119 datasheet
389 LCD->interface.lcd_interface->writereg(0x0d,0x000a); // Power Control 3 - Page 48 of SSD2119 datasheet
390 LCD->interface.lcd_interface->writereg(0x0e,0x2e00); // Power Control 4 - Page 48 of SSD2119 datasheet
391 LCD->interface.lcd_interface->writereg(0x1e,0x00be); // Power Control 5 - Page 53 of SSD2119 datasheet
392 LCD->interface.lcd_interface->writereg(0x25,0x8000); // Frame Frequency Control - Page 53 of SSD2119 datasheet
393 LCD->interface.lcd_interface->writereg(0x26,0x7800); // Analog setting - Page 54 of SSD2119 datasheet
394 LCD->interface.lcd_interface->writereg(0x4e,0x0000); // Ram Address Set - Page 58 of SSD2119 datasheet
395 LCD->interface.lcd_interface->writereg(0x4f,0x0000); // Ram Address Set - Page 58 of SSD2119 datasheet
396 LCD->interface.lcd_interface->writereg(0x12,0x08d9); // Sleep mode - Page 49 of SSD2119 datasheet
397 397
398 398 // -----------------Adjust the Gamma Curve----//
399 LCD->interface->writereg(0x30,0x0000); //0007
400 LCD->interface->writereg(0x31,0x0104); //0203
401 LCD->interface->writereg(0x32,0x0100); //0001
402 LCD->interface->writereg(0x33,0x0305); //0007
403 LCD->interface->writereg(0x34,0x0505); //0007
404 LCD->interface->writereg(0x35,0x0305); //0407
405 LCD->interface->writereg(0x36,0x0707); //0407
406 LCD->interface->writereg(0x37,0x0300); //0607
407 LCD->interface->writereg(0x3a,0x1200); //0106
408 LCD->interface->writereg(0x3b,0x0800);
409 LCD->interface->writereg(0x07,0x0033); // Display Control - Page 45 of SSD2119 datasheet
399 LCD->interface.lcd_interface->writereg(0x30,0x0000); //0007
400 LCD->interface.lcd_interface->writereg(0x31,0x0104); //0203
401 LCD->interface.lcd_interface->writereg(0x32,0x0100); //0001
402 LCD->interface.lcd_interface->writereg(0x33,0x0305); //0007
403 LCD->interface.lcd_interface->writereg(0x34,0x0505); //0007
404 LCD->interface.lcd_interface->writereg(0x35,0x0305); //0407
405 LCD->interface.lcd_interface->writereg(0x36,0x0707); //0407
406 LCD->interface.lcd_interface->writereg(0x37,0x0300); //0607
407 LCD->interface.lcd_interface->writereg(0x3a,0x1200); //0106
408 LCD->interface.lcd_interface->writereg(0x3b,0x0800);
409 LCD->interface.lcd_interface->writereg(0x07,0x0033); // Display Control - Page 45 of SSD2119 datasheet
410 410 }
411 411 return 0;
412 412 }
413 413
414 414
415 415
416 416
@@ -1,103 +1,107
1 1 /*------------------------------------------------------------------------------
2 2 -- This file is a part of the libuc, microcontroler library
3 3 -- Copyright (C) 2013, Alexis Jeandet
4 4 --
5 5 -- This program is free software; you can redistribute it and/or modify
6 6 -- it under the terms of the GNU General Public License as published by
7 7 -- the Free Software Foundation; either version 3 of the License, or
8 8 -- (at your option) any later version.
9 9 --
10 10 -- This program is distributed in the hope that it will be useful,
11 11 -- but WITHOUT ANY WARRANTY; without even the implied warranty of
12 12 -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 13 -- GNU General Public License for more details.
14 14 --
15 15 -- You should have received a copy of the GNU General Public License
16 16 -- along with this program; if not, write to the Free Software
17 17 -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 18 -------------------------------------------------------------------------------
19 19 -- Author : Alexis Jeandet
20 20 -- Mail : alexis.jeandet@member.fsf.org
21 21 -------------------------------------------------------------------------------*/
22 22
23 23 #include <ADS7843.h>
24 24 #include <core.h>
25 25
26 int ads7843init(ADS7843_t *dev, spi_t spidev,void (*setnCS)(char),int (*busy)())
26 int ads7843init(ADS7843_t *dev, spi_t spidev, char config, void (*setnCS)(char), int (*busy)())
27 27 {
28 28 dev->spidev = spidev;
29 29 dev->setnCS = setnCS;
30 30 dev->busy = busy;
31 31 dev->setnCS(1);
32 dev->config = config & ADS7843_CONFIG_MASK;
33 dev->xMax = 1000;
34 dev->xMin = 0;
35 dev->yMax = 1000;
36 dev->yMin = 0;
37 dev->zeroRtouch = 0;
38 dev->zeroX = 500;
39 dev->zeroY = 500;
40 dev->delta = 200;
41 return 1;
42 }
43
44 unsigned int __ads7843read(ADS7843_t *dev,char cfg)
45 {
46 unsigned int data;
47 dev->setnCS(0);
48 while(dev->busy());
49 spiputw(dev->spidev,ADS7843_START|dev->config|cfg);
50 data= (0x0FF & spigetw2(dev->spidev,0))<<8;
51 data+= 0x0FF & spigetw2(dev->spidev,0);
52 dev->setnCS(1);
53 return (data>>4);
54 }
55
56 int ads7843read(ADS7843_t *dev,int* x,int* y)
57 {
58 *x=0;
59 *y=0;
60 for(int i=0;i<32;i++)
61 {
62 *x += __ads7843read(dev,ADS7843_MEAS_X_POS_DIFF|ADS7843_POWER_REF_ON|ADS7843_POWER_ADC_ON);
63 *y += __ads7843read(dev,ADS7843_MEAS_Y_POS_DIFF|ADS7843_POWER_REF_ON|ADS7843_POWER_ADC_ON);
64 }
65 *x>>=5;
66 *y>>=5;
67 *x = ((*x-dev->xMin)*1000)/(dev->xMax-dev->xMin);
68 *y = ((*y-dev->yMin)*1000)/(dev->yMax-dev->yMin);
32 69 return 1;
33 70 }
34 71
35 72
36 73
37 74
38 int ads7843read(ADS7843_t *dev,int* x,int* y)
75 int ads7843readRtouch(ADS7843_t *dev)
39 76 {
40 int data;
41 *x=0;
42 *y=0;
43 spiputw(dev->spidev,0x97);
44 // delay_100us(2);
45 while(dev->busy());
46 spigetw2(dev->spidev,0);
47 spigetw2(dev->spidev,0);
48 delay_100us(100);
49 for(int i=0;i<32;i++)
77 #define avg 32
78 int z1=0,z2=0,x=0;
79 for(int i=0;i<avg;i++)
50 80 {
51 data=0;
52 dev->setnCS(0);
53 spiputw(dev->spidev,0x97);
54 //delay_100us(2);
55 while(dev->busy());
56 data= (0x0FF & spigetw2(dev->spidev,0))<<8;
57 data+= 0x0FF & spigetw2(dev->spidev,0);
58 *x+=data>>4;
59 dev->setnCS(1);
60 delay_100us(10);
81 x += __ads7843read(dev,ADS7843_MEAS_X_POS_DIFF|ADS7843_POWER_REF_ON|ADS7843_POWER_ADC_ON);
82 z1 += __ads7843read(dev,ADS7843_MEAS_Z1_POS_DIFF|ADS7843_POWER_REF_ON|ADS7843_POWER_ADC_ON);
83 z2 += __ads7843read(dev,ADS7843_MEAS_Z2_POS_DIFF|ADS7843_POWER_REF_ON|ADS7843_POWER_ADC_ON);
61 84 }
62 spiputw(dev->spidev,0xd7);
63 // delay_100us(2);
64 while(dev->busy());
65 spigetw2(dev->spidev,0);
66 spigetw2(dev->spidev,0);
67 delay_100us(10);
68 for(int i=0;i<32;i++)
69 {
70 data=0;
71 dev->setnCS(0);
72 spiputw(dev->spidev,0xd7);
73 // delay_100us(2);
74 while(dev->busy());
75 data= (spigetw2(dev->spidev,0))<<8;
76 data+= spigetw2(dev->spidev,0);
77 *y+=data>>4;
78 dev->setnCS(1);
79 delay_100us(10);
80 }
81 *x/=32;
82 *y/=32;
83 return 1;
85 return (x/(4096/avg))*((z2/z1)-1);
84 86 }
85 87
86 88
87
88
89
90
91
92
93
89 int ads7843calibrate(ADS7843_t *dev, uint16_t zeroX, uint16_t zeroY, uint16_t zeroRtouch, uint16_t xMin, uint16_t xMax, uint16_t yMin, uint16_t yMax, char delta)
90 {
91 dev->xMax = xMax;
92 dev->xMin = xMin;
93 dev->yMax = yMax;
94 dev->yMin = yMin;
95 dev->zeroRtouch = zeroRtouch;
96 dev->zeroX = zeroX;
97 dev->zeroY = zeroY;
98 dev->delta = delta;
99 }
94 100
95 101
96
97
98
102 int ads7843isPenTouching(ADS7843_t *dev)
103 {
104 int rtc= ads7843readRtouch(dev);
105 return ((rtc+dev->delta) < dev->zeroRtouch);
99 106
100
101
102
103
107 }
@@ -1,9 +1,13
1 1 TEMPLATE = lib
2 2 CONFIG += libuc2lib
3 3 TARGET = ADS7843
4 4
5 5 SOURCES += \
6 6 ADS7843.c
7 7
8 HEADERS += \
9 ../../../../../include/GRAPHIC/TC_CONTROLERS/ADS7843.h
8 10
9 11
12
13
@@ -1,114 +1,115
1 1 /*------------------------------------------------------------------------------
2 2 -- This file is a part of the libuc, microcontroler library
3 3 -- Copyright (C) 2012, Alexis Jeandet
4 4 --
5 5 -- This program is free software; you can redistribute it and/or modify
6 6 -- it under the terms of the GNU General Public License as published by
7 7 -- the Free Software Foundation; either version 3 of the License, or
8 8 -- (at your option) any later version.
9 9 --
10 10 -- This program is distributed in the hope that it will be useful,
11 11 -- but WITHOUT ANY WARRANTY; without even the implied warranty of
12 12 -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 13 -- GNU General Public License for more details.
14 14 --
15 15 -- You should have received a copy of the GNU General Public License
16 16 -- along with this program; if not, write to the Free Software
17 17 -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 18 -------------------------------------------------------------------------------
19 19 -- Author : Alexis Jeandet
20 20 -- Mail : alexis.jeandet@member.fsf.org
21 21 -------------------------------------------------------------------------------*/
22 22 #include <ina226.h>
23 23 #include <stdio.h>
24 24 #include <stddef.h>
25 25
26 26
27 27 int ina226open(INA226_t *dev, i2c_t i2cdev, uint16_t config, uint8_t A0, uint8_t A1, uint32_t shuntmOhm, uint32_t CurrentRangeuAmp)
28 28 {
29 29 if(dev != NULL)
30 30 {
31 31 dev->i2cdev=i2cdev;
32 32 dev->devAddress = INA226_I2C_ADDRESS | (A0 & 1) | ((A1<<2) & 5);
33 33 printf("dev->devAddress = %x\n\r",dev->devAddress);
34 34 dev->shuntmOhm = shuntmOhm;
35 35 dev->CurrentRangeuAmp = CurrentRangeuAmp;
36 36 ina226setReg(dev,INA226_Configuration_Reg,0x8000);
37 37 ina226setReg(dev,INA226_Configuration_Reg,config);
38 38 return ina226calibrate(dev,shuntmOhm,CurrentRangeuAmp);
39 39 }
40 40 return -1;
41 41 }
42 42
43 43 uint16_t ina226getID(INA226_t* dev)
44 44 {
45 45 if(dev != NULL)
46 46 {
47 47 uint16_t id=ina226getReg(dev,INA226_Die_ID_Reg);
48 48 return id;
49 49 }
50 50 return -1;
51 51 }
52 52
53 53
54 54 int ina226calibrate(INA226_t* dev,uint32_t shuntmOhm, uint32_t CurrentRangeuAmp)
55 55 {
56 56 dev->shuntmOhm = shuntmOhm;
57 57 dev->CurrentRangeuAmp = CurrentRangeuAmp;
58 uint32_t CAL= (uint32_t)(5210000/(shuntmOhm*(CurrentRangeuAmp>>15)));
58 // uint32_t CAL= (uint32_t)(5210000/(shuntmOhm*(CurrentRangeuAmp>>15)));
59 float CAL=(5210000.0/((float)shuntmOhm*((float)CurrentRangeuAmp/32768.0)));
59 60 return ina226setReg(dev,INA226_Calibration_Reg,(uint16_t)CAL);
60 61 }
61 62
62 63 uint32_t ina226getBusVoltage(INA226_t *dev)
63 64 {
64 65 uint32_t busVoltage= ina226getReg(dev,INA226_Bus_Voltage_Reg);
65 66 busVoltage*= 1250;
66 67 return busVoltage;
67 68 }
68 69
69 70 uint32_t ina226getPower(INA226_t *dev)
70 71 {
71 72 uint32_t power= ina226getReg(dev,INA226_Power_Reg);
72 73 power*= ((dev->CurrentRangeuAmp>>15)*25);
73 74 return power;
74 75 }
75 76
76 77 int32_t ina226getCurrent(INA226_t *dev)
77 78 {
78 79 int32_t current= ina226getReg(dev,INA226_Current_Reg);
79 80 current<<=16;
80 81 current>>=16;
81 82 current = current*(dev->CurrentRangeuAmp>>15);
82 83 return current;
83 84 }
84 85
85 86 uint16_t ina226getReg(INA226_t* dev,char reg)
86 87 {
87 88 if(dev != NULL)
88 89 {
89 90 char DATA[2];
90 91 DATA[0]=reg;
91 92 i2cwrite(dev->i2cdev,dev->devAddress,DATA,1);
92 93 i2cread(dev->i2cdev,dev->devAddress,DATA,2);
93 94 uint16_t val=DATA[0];
94 95 val=(val<<8)+DATA[1];
95 96 return val;
96 97 }
97 98 return -1;
98 99 }
99 100
100 101
101 102 int ina226setReg(INA226_t* dev,char reg,int16_t value)
102 103 {
103 104 if(dev != NULL)
104 105 {
105 106 char DATA[3];
106 107 DATA[0]=INA226_Calibration_Reg;
107 108 DATA[1]=(char)(0xff & (value>>8));
108 109 DATA[2]=(char)(0xff & value);
109 110 if(3==i2cwrite(dev->i2cdev,dev->devAddress,DATA,3))return 1;
110 111 }
111 112 return -1;
112 113 }
113 114
114 115
@@ -1,454 +1,415
1 1 #include <stdio.h>
2 2 #include <stm32f4xx.h>
3 3
4 4 void NMI_Handler(void)
5 5 {
6 6 printf("NMI_Handler\n");
7 7 }
8 8
9 9 void HardFault_Handler(void)
10 10 {
11 11 printf("HardFault_Handler\n");
12 12 }
13 13
14 14 void MemManage_Handler(void)
15 15 {
16 16 printf("MemManage_Handler\n");
17 17 }
18 18
19 19 void BusFault_Handler(void)
20 20 {
21 21 printf("BusFault_Handler\n");
22 22 }
23 23
24 24 void UsageFault_Handler(void)
25 25 {
26 26 printf("UsageFault_Handler\n");
27 27 }
28 28
29 29 void SVC_Handler(void)
30 30 {
31 31 // __set_CONTROL(2);
32 32 printf("SVC_Handler\n");
33 33 }
34 34
35 35 void DebugMon_Handler(void)
36 36 {
37 37 printf("DebugMon_Handler\n");
38 38 }
39 39
40 40 void PendSV_Handler(void)
41 41 {
42 42 printf("PendSV_Handler\n");
43 43 }
44 44
45 45 void WWDG_IRQHandler(void)
46 46 {
47 47 printf("WWDG_IRQHandler\n");
48 48 }
49 49
50 50 void PVD_IRQHandler(void)
51 51 {
52 52 printf("PVD_IRQHandler\n");
53 53 }
54 54
55 55 void TAMP_STAMP_IRQHandler(void)
56 56 {
57 57 printf("TAMP_STAMP_IRQHandler\n");
58 58 }
59 59
60 60 void RTC_WKUP_IRQHandler(void)
61 61 {
62 62 printf("RTC_WKUP_IRQHandler\n");
63 63 }
64 64
65 65 void FLASH_IRQHandler(void)
66 66 {
67 67 printf("FLASH_IRQHandler\n");
68 68 }
69 69
70 70 void RCC_IRQHandler(void)
71 71 {
72 72 printf("RCC_IRQHandler\n");
73 73 }
74 74
75 75 void EXTI0_IRQHandler(void)
76 76 {
77 77 printf("EXTI0_IRQHandler\n");
78 78 }
79 79
80 80 void EXTI1_IRQHandler(void)
81 81 {
82 82 printf("EXTI1_IRQHandler\n");
83 83 }
84 84
85 85 void EXTI2_IRQHandler(void)
86 86 {
87 87 printf("EXTI2_IRQHandler\n");
88 88 }
89 89
90 90 void EXTI3_IRQHandler(void)
91 91 {
92 92 printf("EXTI3_IRQHandler\n");
93 93 }
94 94
95 95 void EXTI4_IRQHandler(void)
96 96 {
97 97 printf("EXTI4_IRQHandler\n");
98 98 }
99 99
100 100 void DMA1_Stream0_IRQHandler(void)
101 101 {
102 102 printf("DMA1_Stream0_IRQHandler\n");
103 103 }
104 104
105 105 void DMA1_Stream1_IRQHandler(void)
106 106 {
107 107 printf("DMA1_Stream1_IRQHandler\n");
108 108 }
109 109
110 110 void DMA1_Stream2_IRQHandler(void)
111 111 {
112 112 printf("DMA1_Stream2_IRQHandler\n");
113 113 }
114 114
115 115 void DMA1_Stream3_IRQHandler(void)
116 116 {
117 117 printf("DMA1_Stream3_IRQHandler\n");
118 118 }
119 119
120 120 void DMA1_Stream4_IRQHandler(void)
121 121 {
122 122 printf("DMA1_Stream4_IRQHandler\n");
123 123 }
124 124
125 125 void DMA1_Stream5_IRQHandler(void)
126 126 {
127 127 printf("DMA1_Stream5_IRQHandler\n");
128 128 }
129 129
130 130 void DMA1_Stream6_IRQHandler(void)
131 131 {
132 132 printf("DMA1_Stream6_IRQHandler\n");
133 133 }
134 134
135 135 void ADC_IRQHandler(void)
136 136 {
137 137 printf("ADC_IRQHandler\n");
138 138 }
139 139
140 140 void CAN1_TX_IRQHandler(void)
141 141 {
142 142 printf("CAN1_TX_IRQHandler\n");
143 143 }
144 144
145 145 void CAN1_RX0_IRQHandler(void)
146 146 {
147 147 printf("CAN1_RX0_IRQHandler\n");
148 148 }
149 149
150 150 void CAN1_RX1_IRQHandler(void)
151 151 {
152 152 printf("CAN1_RX1_IRQHandler\n");
153 153 }
154 154
155 155 void CAN1_SCE_IRQHandler(void)
156 156 {
157 157 printf("CAN1_SCE_IRQHandler\n");
158 158 }
159 159
160 160 void EXTI9_5_IRQHandler(void)
161 161 {
162 162 printf("EXTI9_5_IRQHandler\n");
163 163 }
164 164
165 165 void TIM1_BRK_TIM9_IRQHandler(void)
166 166 {
167 167 printf("TIM1_BRK_TIM9_IRQHandler\n");
168 168 }
169 169
170 170 void TIM1_UP_TIM10_IRQHandler(void)
171 171 {
172 172 printf("TIM1_UP_TIM10_IRQHandler\n");
173 173 }
174 174
175 175 void TIM1_TRG_COM_TIM11_IRQHandlerIM11(void)
176 176 {
177 177 printf("TIM1_TRG_COM_TIM11_IRQHandlerIM11");
178 178 }
179 179
180 180 void TIM1_CC_IRQHandler(void)
181 181 {
182 182 printf("TIM1_CC_IRQHandler\n");
183 183 }
184 184
185 185 void TIM2_IRQHandler(void)
186 186 {
187 187 printf("TIM2_IRQHandler\n");
188 188 }
189 189
190 190 void TIM3_IRQHandler(void)
191 191 {
192 192 printf("TIM3_IRQHandler\n");
193 193 }
194 194
195 195 void TIM4_IRQHandler(void)
196 196 {
197 197 printf("TIM4_IRQHandler\n");
198 198 }
199 199
200 200 void I2C1_EV_IRQHandler(void)
201 201 {
202 202 printf("I2C1_EV_IRQHandler\n");
203 203 }
204 204
205 205 void I2C1_ER_IRQHandler(void)
206 206 {
207 207 printf("I2C1_ER_IRQHandler\n");
208 208 }
209 209
210 210 void I2C2_EV_IRQHandler(void)
211 211 {
212 212 printf("I2C2_EV_IRQHandler\n");
213 213 }
214 214
215 215 void I2C2_ER_IRQHandler(void)
216 216 {
217 217 printf("I2C2_ER_IRQHandler\n");
218 218 }
219 219
220 220 void SPI1_IRQHandler(void)
221 221 {
222 222 printf("SPI1_IRQHandler\n");
223 223 }
224 224
225 225 void SPI2_IRQHandler(void)
226 226 {
227 227 printf("SPI2_IRQHandler\n");
228 228 }
229 229
230 230 void USART1_IRQHandler(void)
231 231 {
232 232 printf("USART1_IRQHandler\n");
233 233 }
234 234
235 235 void USART2_IRQHandler(void)
236 236 {
237 237 printf("USART2_IRQHandler\n");
238 238 }
239 239
240 240 void USART3_IRQHandler(void)
241 241 {
242 242 printf("USART3_IRQHandler\n");
243 243 }
244 244
245 245 void EXTI15_10_IRQHandler(void)
246 246 {
247 247 printf("EXTI15_10_IRQHandler\n");
248 248 }
249 249
250 250 void RTC_Alarm_IRQHandler(void)
251 251 {
252 252 printf("RTC_Alarm_IRQHandler\n");
253 253 }
254 254
255 255 void OTG_FS_WKUP_IRQHandler(void)
256 256 {
257 257 printf("OTG_FS_WKUP_IRQHandler\n");
258 258 }
259 259
260 260 void TIM8_BRK_TIM12_IRQHandler(void)
261 261 {
262 262 printf("TIM8_BRK_TIM12_IRQHandler\n");
263 263 }
264 264
265 265 void TIM8_UP_TIM13_IRQHandler(void)
266 266 {
267 267 printf("TIM8_UP_TIM13_IRQHandler\n");
268 268 }
269 269
270 270 void TIM8_TRG_COM_TIM14_IRQHandlerIM14(void)
271 271 {
272 272 printf("TIM8_TRG_COM_TIM14_IRQHandlerIM14");
273 273 }
274 274
275 275 void TIM8_CC_IRQHandler(void)
276 276 {
277 277 printf("TIM8_CC_IRQHandler\n");
278 278 }
279 279
280 280 void DMA1_Stream7_IRQHandler(void)
281 281 {
282 282 printf("DMA1_Stream7_IRQHandler\n");
283 283 }
284 284
285 285 void FSMC_IRQHandler(void)
286 286 {
287 287 printf("FSMC_IRQHandler\n");
288 288 }
289 289
290 290 void SDIO_IRQHandler(void)
291 291 {
292 292 printf("SDIO_IRQHandler\n");
293 293 }
294 294
295 295 void TIM5_IRQHandler(void)
296 296 {
297 297 printf("TIM5_IRQHandler\n");
298 298 }
299 299
300 300 void SPI3_IRQHandler(void)
301 301 {
302 302 printf("SPI3_IRQHandler\n");
303 303 }
304 304
305 305 void UART4_IRQHandler(void)
306 306 {
307 307 printf("UART4_IRQHandler\n");
308 308 }
309 309
310 310 void UART5_IRQHandler(void)
311 311 {
312 312 printf("UART5_IRQHandler\n");
313 313 }
314 314
315 315 void TIM6_DAC_IRQHandler(void)
316 316 {
317 317 printf("TIM6_DAC_IRQHandler\n");
318 318 }
319 319
320 320 void TIM7_IRQHandler(void)
321 321 {
322 322 printf("TIM7_IRQHandler\n");
323 323 }
324 324
325 void DMA2_Stream0_IRQHandler(void)
326 {
327 printf("DMA2_Stream0_IRQHandler\n");
328 }
329
330 void DMA2_Stream1_IRQHandler(void)
331 {
332 printf("DMA2_Stream1_IRQHandler\n");
333 }
334
335 void DMA2_Stream2_IRQHandler(void)
336 {
337 printf("DMA2_Stream2_IRQHandler\n");
338 }
339
340 void DMA2_Stream3_IRQHandler(void)
341 {
342 printf("DMA2_Stream3_IRQHandler\n");
343 }
344
345 void DMA2_Stream4_IRQHandler(void)
346 {
347 printf("DMA2_Stream4_IRQHandler\n");
348 }
349 325
350 326 void ETH_IRQHandler(void)
351 327 {
352 328 printf("ETH_IRQHandler\n");
353 329 }
354 330
355 331 void ETH_WKUP_IRQHandler(void)
356 332 {
357 333 printf("ETH_WKUP_IRQHandler\n");
358 334 }
359 335
360 336 void CAN2_TX_IRQHandler(void)
361 337 {
362 338 printf("CAN2_TX_IRQHandler\n");
363 339 }
364 340
365 341 void CAN2_RX0_IRQHandler(void)
366 342 {
367 343 printf("CAN2_RX0_IRQHandler\n");
368 344 }
369 345
370 346 void CAN2_RX1_IRQHandler(void)
371 347 {
372 348 printf("CAN2_RX1_IRQHandler\n");
373 349 }
374 350
375 351 void CAN2_SCE_IRQHandler(void)
376 352 {
377 353 printf("CAN2_SCE_IRQHandler\n");
378 354 }
379 355
380 356 void OTG_FS_IRQHandler(void)
381 357 {
382 358 printf("OTG_FS_IRQHandler\n");
383 359 }
384 360
385 void DMA2_Stream5_IRQHandler(void)
386 {
387 printf("DMA2_Stream5_IRQHandler\n");
388 }
389
390 void DMA2_Stream6_IRQHandler(void)
391 {
392 printf("DMA2_Stream6_IRQHandler\n");
393 }
394
395 void DMA2_Stream7_IRQHandler(void)
396 {
397 printf("DMA2_Stream7_IRQHandler\n");
398 }
399
400 361 void USART6_IRQHandler(void)
401 362 {
402 363 printf("USART6_IRQHandler\n");
403 364 }
404 365
405 366 void I2C3_EV_IRQHandler(void)
406 367 {
407 368 printf("I2C3_EV_IRQHandler\n");
408 369 }
409 370
410 371 void I2C3_ER_IRQHandler(void)
411 372 {
412 373 printf("I2C3_ER_IRQHandler\n");
413 374 }
414 375
415 376 void OTG_HS_EP1_OUT_IRQHandler(void)
416 377 {
417 378 printf("OTG_HS_EP1_OUT_IRQHandler\n");
418 379 }
419 380
420 381 void OTG_HS_EP1_IN_IRQHandler(void)
421 382 {
422 383 printf("OTG_HS_EP1_IN_IRQHandler\n");
423 384 }
424 385
425 386 void OTG_HS_WKUP_IRQHandler(void)
426 387 {
427 388 printf("OTG_HS_WKUP_IRQHandler\n");
428 389 }
429 390
430 391 void OTG_HS_IRQHandler(void)
431 392 {
432 393 printf("OTG_HS_IRQHandler\n");
433 394 }
434 395
435 396 void DCMI_IRQHandler(void)
436 397 {
437 398 printf("DCMI_IRQHandler\n");
438 399 }
439 400
440 401 void CRYP_IRQHandler(void)
441 402 {
442 403 printf("CRYP_IRQHandler\n");
443 404 }
444 405
445 406 void HASH_RNG_IRQHandler(void)
446 407 {
447 408 printf("HASH_RNG_IRQHandler\n");
448 409 }
449 410
450 411 void FPU_IRQHandler(void)
451 412 {
452 413 printf("FPU_IRQHandler\n");
453 414 }
454 415
@@ -1,17 +1,18
1 1 TEMPLATE = subdirs
2 2 CONFIG += ordered
3 3
4 4 SUBDIRS = CORE/core.pro \
5 5 CPU/cpu.pro \
6 6 GPIO/gpio.pro \
7 7 TIMER/timer.pro \
8 8 UART/uart.pro \
9 9 SPI/spi.pro \
10 10 I2C/i2c.pro \
11 11 PWM/pwm.pro \
12 12 DAC/dac.pro\
13 DMA/dma.pro\
13 14 SDCARD-SDIO/sdcard-sdio.pro
14 15
15 16
16 17
17 18
General Comments 0
You need to be logged in to leave comments. Login now