parent
d4af132ba6
commit
61eec64728
@ -1,6 +1,9 @@ |
||||
.vscode |
||||
.DS_Store |
||||
build |
||||
Build |
||||
Payload/Build |
||||
Payload/Output |
||||
RomFS/hekate_updater_rcm.bin |
||||
*.elf |
||||
*.nacp |
||||
*.nro |
@ -0,0 +1,339 @@ |
||||
GNU GENERAL PUBLIC LICENSE |
||||
Version 2, June 1991 |
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc., |
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
||||
Everyone is permitted to copy and distribute verbatim copies |
||||
of this license document, but changing it is not allowed. |
||||
|
||||
Preamble |
||||
|
||||
The licenses for most software are designed to take away your |
||||
freedom to share and change it. By contrast, the GNU General Public |
||||
License is intended to guarantee your freedom to share and change free |
||||
software--to make sure the software is free for all its users. This |
||||
General Public License applies to most of the Free Software |
||||
Foundation's software and to any other program whose authors commit to |
||||
using it. (Some other Free Software Foundation software is covered by |
||||
the GNU Lesser General Public License instead.) You can apply it to |
||||
your programs, too. |
||||
|
||||
When we speak of free software, we are referring to freedom, not |
||||
price. Our General Public Licenses are designed to make sure that you |
||||
have the freedom to distribute copies of free software (and charge for |
||||
this service if you wish), that you receive source code or can get it |
||||
if you want it, that you can change the software or use pieces of it |
||||
in new free programs; and that you know you can do these things. |
||||
|
||||
To protect your rights, we need to make restrictions that forbid |
||||
anyone to deny you these rights or to ask you to surrender the rights. |
||||
These restrictions translate to certain responsibilities for you if you |
||||
distribute copies of the software, or if you modify it. |
||||
|
||||
For example, if you distribute copies of such a program, whether |
||||
gratis or for a fee, you must give the recipients all the rights that |
||||
you have. You must make sure that they, too, receive or can get the |
||||
source code. And you must show them these terms so they know their |
||||
rights. |
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and |
||||
(2) offer you this license which gives you legal permission to copy, |
||||
distribute and/or modify the software. |
||||
|
||||
Also, for each author's protection and ours, we want to make certain |
||||
that everyone understands that there is no warranty for this free |
||||
software. If the software is modified by someone else and passed on, we |
||||
want its recipients to know that what they have is not the original, so |
||||
that any problems introduced by others will not reflect on the original |
||||
authors' reputations. |
||||
|
||||
Finally, any free program is threatened constantly by software |
||||
patents. We wish to avoid the danger that redistributors of a free |
||||
program will individually obtain patent licenses, in effect making the |
||||
program proprietary. To prevent this, we have made it clear that any |
||||
patent must be licensed for everyone's free use or not licensed at all. |
||||
|
||||
The precise terms and conditions for copying, distribution and |
||||
modification follow. |
||||
|
||||
GNU GENERAL PUBLIC LICENSE |
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION |
||||
|
||||
0. This License applies to any program or other work which contains |
||||
a notice placed by the copyright holder saying it may be distributed |
||||
under the terms of this General Public License. The "Program", below, |
||||
refers to any such program or work, and a "work based on the Program" |
||||
means either the Program or any derivative work under copyright law: |
||||
that is to say, a work containing the Program or a portion of it, |
||||
either verbatim or with modifications and/or translated into another |
||||
language. (Hereinafter, translation is included without limitation in |
||||
the term "modification".) Each licensee is addressed as "you". |
||||
|
||||
Activities other than copying, distribution and modification are not |
||||
covered by this License; they are outside its scope. The act of |
||||
running the Program is not restricted, and the output from the Program |
||||
is covered only if its contents constitute a work based on the |
||||
Program (independent of having been made by running the Program). |
||||
Whether that is true depends on what the Program does. |
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's |
||||
source code as you receive it, in any medium, provided that you |
||||
conspicuously and appropriately publish on each copy an appropriate |
||||
copyright notice and disclaimer of warranty; keep intact all the |
||||
notices that refer to this License and to the absence of any warranty; |
||||
and give any other recipients of the Program a copy of this License |
||||
along with the Program. |
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and |
||||
you may at your option offer warranty protection in exchange for a fee. |
||||
|
||||
2. You may modify your copy or copies of the Program or any portion |
||||
of it, thus forming a work based on the Program, and copy and |
||||
distribute such modifications or work under the terms of Section 1 |
||||
above, provided that you also meet all of these conditions: |
||||
|
||||
a) You must cause the modified files to carry prominent notices |
||||
stating that you changed the files and the date of any change. |
||||
|
||||
b) You must cause any work that you distribute or publish, that in |
||||
whole or in part contains or is derived from the Program or any |
||||
part thereof, to be licensed as a whole at no charge to all third |
||||
parties under the terms of this License. |
||||
|
||||
c) If the modified program normally reads commands interactively |
||||
when run, you must cause it, when started running for such |
||||
interactive use in the most ordinary way, to print or display an |
||||
announcement including an appropriate copyright notice and a |
||||
notice that there is no warranty (or else, saying that you provide |
||||
a warranty) and that users may redistribute the program under |
||||
these conditions, and telling the user how to view a copy of this |
||||
License. (Exception: if the Program itself is interactive but |
||||
does not normally print such an announcement, your work based on |
||||
the Program is not required to print an announcement.) |
||||
|
||||
These requirements apply to the modified work as a whole. If |
||||
identifiable sections of that work are not derived from the Program, |
||||
and can be reasonably considered independent and separate works in |
||||
themselves, then this License, and its terms, do not apply to those |
||||
sections when you distribute them as separate works. But when you |
||||
distribute the same sections as part of a whole which is a work based |
||||
on the Program, the distribution of the whole must be on the terms of |
||||
this License, whose permissions for other licensees extend to the |
||||
entire whole, and thus to each and every part regardless of who wrote it. |
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest |
||||
your rights to work written entirely by you; rather, the intent is to |
||||
exercise the right to control the distribution of derivative or |
||||
collective works based on the Program. |
||||
|
||||
In addition, mere aggregation of another work not based on the Program |
||||
with the Program (or with a work based on the Program) on a volume of |
||||
a storage or distribution medium does not bring the other work under |
||||
the scope of this License. |
||||
|
||||
3. You may copy and distribute the Program (or a work based on it, |
||||
under Section 2) in object code or executable form under the terms of |
||||
Sections 1 and 2 above provided that you also do one of the following: |
||||
|
||||
a) Accompany it with the complete corresponding machine-readable |
||||
source code, which must be distributed under the terms of Sections |
||||
1 and 2 above on a medium customarily used for software interchange; or, |
||||
|
||||
b) Accompany it with a written offer, valid for at least three |
||||
years, to give any third party, for a charge no more than your |
||||
cost of physically performing source distribution, a complete |
||||
machine-readable copy of the corresponding source code, to be |
||||
distributed under the terms of Sections 1 and 2 above on a medium |
||||
customarily used for software interchange; or, |
||||
|
||||
c) Accompany it with the information you received as to the offer |
||||
to distribute corresponding source code. (This alternative is |
||||
allowed only for noncommercial distribution and only if you |
||||
received the program in object code or executable form with such |
||||
an offer, in accord with Subsection b above.) |
||||
|
||||
The source code for a work means the preferred form of the work for |
||||
making modifications to it. For an executable work, complete source |
||||
code means all the source code for all modules it contains, plus any |
||||
associated interface definition files, plus the scripts used to |
||||
control compilation and installation of the executable. However, as a |
||||
special exception, the source code distributed need not include |
||||
anything that is normally distributed (in either source or binary |
||||
form) with the major components (compiler, kernel, and so on) of the |
||||
operating system on which the executable runs, unless that component |
||||
itself accompanies the executable. |
||||
|
||||
If distribution of executable or object code is made by offering |
||||
access to copy from a designated place, then offering equivalent |
||||
access to copy the source code from the same place counts as |
||||
distribution of the source code, even though third parties are not |
||||
compelled to copy the source along with the object code. |
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program |
||||
except as expressly provided under this License. Any attempt |
||||
otherwise to copy, modify, sublicense or distribute the Program is |
||||
void, and will automatically terminate your rights under this License. |
||||
However, parties who have received copies, or rights, from you under |
||||
this License will not have their licenses terminated so long as such |
||||
parties remain in full compliance. |
||||
|
||||
5. You are not required to accept this License, since you have not |
||||
signed it. However, nothing else grants you permission to modify or |
||||
distribute the Program or its derivative works. These actions are |
||||
prohibited by law if you do not accept this License. Therefore, by |
||||
modifying or distributing the Program (or any work based on the |
||||
Program), you indicate your acceptance of this License to do so, and |
||||
all its terms and conditions for copying, distributing or modifying |
||||
the Program or works based on it. |
||||
|
||||
6. Each time you redistribute the Program (or any work based on the |
||||
Program), the recipient automatically receives a license from the |
||||
original licensor to copy, distribute or modify the Program subject to |
||||
these terms and conditions. You may not impose any further |
||||
restrictions on the recipients' exercise of the rights granted herein. |
||||
You are not responsible for enforcing compliance by third parties to |
||||
this License. |
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent |
||||
infringement or for any other reason (not limited to patent issues), |
||||
conditions are imposed on you (whether by court order, agreement or |
||||
otherwise) that contradict the conditions of this License, they do not |
||||
excuse you from the conditions of this License. If you cannot |
||||
distribute so as to satisfy simultaneously your obligations under this |
||||
License and any other pertinent obligations, then as a consequence you |
||||
may not distribute the Program at all. For example, if a patent |
||||
license would not permit royalty-free redistribution of the Program by |
||||
all those who receive copies directly or indirectly through you, then |
||||
the only way you could satisfy both it and this License would be to |
||||
refrain entirely from distribution of the Program. |
||||
|
||||
If any portion of this section is held invalid or unenforceable under |
||||
any particular circumstance, the balance of the section is intended to |
||||
apply and the section as a whole is intended to apply in other |
||||
circumstances. |
||||
|
||||
It is not the purpose of this section to induce you to infringe any |
||||
patents or other property right claims or to contest validity of any |
||||
such claims; this section has the sole purpose of protecting the |
||||
integrity of the free software distribution system, which is |
||||
implemented by public license practices. Many people have made |
||||
generous contributions to the wide range of software distributed |
||||
through that system in reliance on consistent application of that |
||||
system; it is up to the author/donor to decide if he or she is willing |
||||
to distribute software through any other system and a licensee cannot |
||||
impose that choice. |
||||
|
||||
This section is intended to make thoroughly clear what is believed to |
||||
be a consequence of the rest of this License. |
||||
|
||||
8. If the distribution and/or use of the Program is restricted in |
||||
certain countries either by patents or by copyrighted interfaces, the |
||||
original copyright holder who places the Program under this License |
||||
may add an explicit geographical distribution limitation excluding |
||||
those countries, so that distribution is permitted only in or among |
||||
countries not thus excluded. In such case, this License incorporates |
||||
the limitation as if written in the body of this License. |
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions |
||||
of the General Public License from time to time. Such new versions will |
||||
be similar in spirit to the present version, but may differ in detail to |
||||
address new problems or concerns. |
||||
|
||||
Each version is given a distinguishing version number. If the Program |
||||
specifies a version number of this License which applies to it and "any |
||||
later version", you have the option of following the terms and conditions |
||||
either of that version or of any later version published by the Free |
||||
Software Foundation. If the Program does not specify a version number of |
||||
this License, you may choose any version ever published by the Free Software |
||||
Foundation. |
||||
|
||||
10. If you wish to incorporate parts of the Program into other free |
||||
programs whose distribution conditions are different, write to the author |
||||
to ask for permission. For software which is copyrighted by the Free |
||||
Software Foundation, write to the Free Software Foundation; we sometimes |
||||
make exceptions for this. Our decision will be guided by the two goals |
||||
of preserving the free status of all derivatives of our free software and |
||||
of promoting the sharing and reuse of software generally. |
||||
|
||||
NO WARRANTY |
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY |
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN |
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES |
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED |
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS |
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE |
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, |
||||
REPAIR OR CORRECTION. |
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING |
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR |
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, |
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING |
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED |
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY |
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER |
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE |
||||
POSSIBILITY OF SUCH DAMAGES. |
||||
|
||||
END OF TERMS AND CONDITIONS |
||||
|
||||
How to Apply These Terms to Your New Programs |
||||
|
||||
If you develop a new program, and you want it to be of the greatest |
||||
possible use to the public, the best way to achieve this is to make it |
||||
free software which everyone can redistribute and change under these terms. |
||||
|
||||
To do so, attach the following notices to the program. It is safest |
||||
to attach them to the start of each source file to most effectively |
||||
convey the exclusion of warranty; and each file should have at least |
||||
the "copyright" line and a pointer to where the full notice is found. |
||||
|
||||
<one line to give the program's name and a brief idea of what it does.> |
||||
Copyright (C) <year> <name of author> |
||||
|
||||
This program is free software; you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation; either version 2 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License along |
||||
with this program; if not, write to the Free Software Foundation, Inc., |
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
||||
|
||||
Also add information on how to contact you by electronic and paper mail. |
||||
|
||||
If the program is interactive, make it output a short notice like this |
||||
when it starts in an interactive mode: |
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author |
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. |
||||
This is free software, and you are welcome to redistribute it |
||||
under certain conditions; type `show c' for details. |
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate |
||||
parts of the General Public License. Of course, the commands you use may |
||||
be called something other than `show w' and `show c'; they could even be |
||||
mouse-clicks or menu items--whatever suits your program. |
||||
|
||||
You should also get your employer (if you work as a programmer) or your |
||||
school, if any, to sign a "copyright disclaimer" for the program, if |
||||
necessary. Here is a sample; alter the names: |
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program |
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker. |
||||
|
||||
<signature of Ty Coon>, 1 April 1989 |
||||
Ty Coon, President of Vice |
||||
|
||||
This General Public License does not permit incorporating your program into |
||||
proprietary programs. If your program is a subroutine library, you may |
||||
consider it more useful to permit linking proprietary applications with the |
||||
library. If this is what you want to do, use the GNU Lesser General |
||||
Public License instead of this License. |
@ -0,0 +1,107 @@ |
||||
ifeq ($(strip $(DEVKITARM)),) |
||||
$(error "Please set DEVKITARM in your environment. export DEVKITARM=<path to>devkitARM") |
||||
endif |
||||
|
||||
include $(DEVKITARM)/base_rules |
||||
|
||||
################################################################################
|
||||
|
||||
IPL_LOAD_ADDR := 0x40008000
|
||||
|
||||
################################################################################
|
||||
|
||||
TARGET := hekate_updater_rcm
|
||||
BUILDDIR := Build
|
||||
OUTPUTDIR := Output
|
||||
SOURCEDIR = bootloader
|
||||
BDKDIR := bdk
|
||||
BDKINC := -I./$(BDKDIR)
|
||||
VPATH = $(dir ./$(SOURCEDIR)/) $(dir $(wildcard ./$(SOURCEDIR)/*/)) $(dir $(wildcard ./$(SOURCEDIR)/*/*/))
|
||||
VPATH += $(dir $(wildcard ./$(BDKDIR)/)) $(dir $(wildcard ./$(BDKDIR)/*/)) $(dir $(wildcard ./$(BDKDIR)/*/*/))
|
||||
|
||||
# Main and graphics.
|
||||
OBJS = $(addprefix $(BUILDDIR)/$(TARGET)/, \
|
||||
start.o exception_handlers.o \
|
||||
main.o heap.o \
|
||||
gfx.o \
|
||||
) |
||||
|
||||
# Hardware.
|
||||
OBJS += $(addprefix $(BUILDDIR)/$(TARGET)/, \
|
||||
bpmp.o ccplex.o clock.o di.o gpio.o i2c.o irq.o mc.o sdram.o \
|
||||
pinmux.o pmc.o se.o smmu.o tsec.o uart.o \
|
||||
fuse.o kfuse.o minerva.o \
|
||||
sdmmc.o sdmmc_driver.o nx_sd.o \
|
||||
bq24193.o max17050.o max7762x.o max77620-rtc.o \
|
||||
hw_init.o \
|
||||
) |
||||
|
||||
# Utilities.
|
||||
OBJS += $(addprefix $(BUILDDIR)/$(TARGET)/, \
|
||||
btn.o dirlist.o ianos.o util.o \
|
||||
config.o ini.o \
|
||||
) |
||||
|
||||
# Libraries.
|
||||
OBJS += $(addprefix $(BUILDDIR)/$(TARGET)/, \
|
||||
lz.o blz.o \
|
||||
diskio.o ff.o ffunicode.o ffsystem.o \
|
||||
elfload.o elfreloc_arm.o \
|
||||
) |
||||
|
||||
GFX_INC := '"../$(SOURCEDIR)/gfx/gfx.h"'
|
||||
FFCFG_INC := '"../$(SOURCEDIR)/libs/fatfs/ffconf.h"'
|
||||
|
||||
################################################################################
|
||||
|
||||
CUSTOMDEFINES := -DIPL_LOAD_ADDR=$(IPL_LOAD_ADDR)
|
||||
CUSTOMDEFINES += -DGFX_INC=$(GFX_INC) -DFFCFG_INC=$(FFCFG_INC)
|
||||
|
||||
# 0: UART_A, 1: UART_B.
|
||||
#CUSTOMDEFINES += -DDEBUG_UART_PORT=0
|
||||
|
||||
#CUSTOMDEFINES += -DDEBUG
|
||||
|
||||
ARCH := -march=armv4t -mtune=arm7tdmi -mthumb -mthumb-interwork
|
||||
CFLAGS = $(ARCH) -O2 -g -nostdlib -ffunction-sections -fdata-sections -fomit-frame-pointer -fno-inline -std=gnu11 -Wall $(CUSTOMDEFINES)
|
||||
LDFLAGS = $(ARCH) -nostartfiles -lgcc -Wl,--nmagic,--gc-sections -Xlinker --defsym=IPL_LOAD_ADDR=$(IPL_LOAD_ADDR)
|
||||
|
||||
################################################################################
|
||||
|
||||
.PHONY: all clean |
||||
|
||||
all: $(TARGET).bin |
||||
@echo "--------------------------------------"
|
||||
@echo -n "Payload size: "
|
||||
$(eval BIN_SIZE = $(shell wc -c < $(OUTPUTDIR)/$(TARGET).bin))
|
||||
@echo $(BIN_SIZE)" Bytes"
|
||||
@echo "Payload Max: 126296 Bytes"
|
||||
@if [ ${BIN_SIZE} -gt 126296 ]; then echo "\e[1;33mPayload size exceeds limit!\e[0m"; fi
|
||||
@echo "--------------------------------------"
|
||||
|
||||
clean: |
||||
@rm -rf $(OBJS)
|
||||
@rm -rf $(BUILDDIR)
|
||||
@rm -rf $(OUTPUTDIR)
|
||||
|
||||
$(TARGET).bin: $(BUILDDIR)/$(TARGET)/$(TARGET).elf |
||||
$(OBJCOPY) -S -O binary $< $(OUTPUTDIR)/$@
|
||||
|
||||
$(BUILDDIR)/$(TARGET)/$(TARGET).elf: $(OBJS) |
||||
@$(CC) $(LDFLAGS) -T $(SOURCEDIR)/link.ld $^ -o $@
|
||||
@echo "Hekate Updater RCM was built with the following flags:\nCFLAGS: "$(CFLAGS)"\nLDFLAGS: "$(LDFLAGS)
|
||||
|
||||
$(BUILDDIR)/$(TARGET)/%.o: %.c |
||||
@echo Building $@
|
||||
@$(CC) $(CFLAGS) $(BDKINC) -c $< -o $@
|
||||
|
||||
$(BUILDDIR)/$(TARGET)/%.o: %.S |
||||
@echo Building $@
|
||||
@$(CC) $(CFLAGS) -c $< -o $@
|
||||
|
||||
$(OBJS): $(BUILDDIR)/$(TARGET) |
||||
|
||||
$(BUILDDIR)/$(TARGET): |
||||
@mkdir -p "$(BUILDDIR)"
|
||||
@mkdir -p "$(BUILDDIR)/$(TARGET)"
|
||||
@mkdir -p "$(OUTPUTDIR)"
|
@ -0,0 +1,39 @@ |
||||
# Hekate Updater - RCM Payload |
||||
|
||||
Simple MITM payload to bypass Atmosphere's write protection on the `fusee_secondary.bin`, and `payload.bin` files. This payload is built off of CTCaer's Hekate codebase. |
||||
|
||||
``` |
||||
hekate (c) 2018, naehrwert, st4rk. |
||||
(c) 2018-2020, CTCaer. |
||||
|
||||
Nyx GUI (c) 2019-2020, CTCaer. |
||||
|
||||
Thanks to: derrek, nedwill, plutoo, shuffle2, smea, thexyz, yellows8. |
||||
Greetings to: fincs, hexkyz, SciresM, Shiny Quagsire, WinterMute. |
||||
|
||||
Open source and free packages used: |
||||
- FatFs R0.13a, Copyright (c) 2017, ChaN |
||||
- bcl-1.2.0, Copyright (c) 2003-2006, Marcus Geelnard |
||||
- Atmosphรจre (Exosphere types/panic, prc id kernel patches), |
||||
Copyright (c) 2018-2019, Atmosphรจre-NX |
||||
- elfload, Copyright (c) 2014 Owen Shepherd, Copyright (c) 2018 M4xw |
||||
- Littlev Graphics Library, Copyright (c) 2016 Gabor Kiss-Vamosi |
||||
|
||||
___ |
||||
.-' `'. |
||||
/ \ |
||||
| ; |
||||
| | ___.--, |
||||
_.._ |0) = (0) | _.---'`__.-( (_. |
||||
__.--'`_.. '.__.\ '--. \_.-' ,.--'` `""` |
||||
( ,.--'` ',__ /./; ;, '.__.'` __ |
||||
_`) ) .---.__.' / | |\ \__..--"" """--.,_ |
||||
`---' .'.''-._.-'`_./ /\ '. \ _.--''````'''--._`-.__.' |
||||
| | .' _.-' | | \ \ '. `----` |
||||
\ \/ .' \ \ '. '-._) |
||||
\/ / \ \ `=.__`'-. |
||||
/ /\ `) ) / / `"".`\ |
||||
, _.-'.'\ \ / / ( ( / / |
||||
`--'` ) ) .-'.' '.'. | ( |
||||
(/` ( (` ) ) '-; [switchbrew] |
||||
``` |
@ -0,0 +1,233 @@ |
||||
/* |
||||
* Copyright (c) 2019 CTCaer |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License, |
||||
* version 2, as published by the Free Software Foundation. |
||||
* |
||||
* This program is distributed in the hope it will be useful, but WITHOUT |
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for |
||||
* more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
||||
*/ |
||||
|
||||
/* |
||||
* Armv7tdmi Status register. |
||||
* |
||||
* bit0: Mode 0. |
||||
* bit1: Mode 1. |
||||
* bit2: Mode 2. |
||||
* bit3: Mode 3. |
||||
* bit4: Mode 4. |
||||
* bit5: Thumb state. |
||||
* bit6: FIQ disable. |
||||
* bit7: IRQ disable. |
||||
* bit8-27: Reserved. |
||||
* bit28: Overflow condition. |
||||
* bit29: Carry/Borrow/Extend condition. |
||||
* bit30: Zero condition. |
||||
* bit31: Negative/Less than condition. |
||||
* |
||||
* M[4:0] | Mode | Visible Thumb-state registers | Visible ARM-state registers |
||||
* 10000 | USER | r0โr7, SP, LR, PC, CPSR | r0โr14, PC, CPSR |
||||
* 10001 | FIQ | r0โr7, SP_fiq, LR_fiq, PC, CPSR, SPSR_fiq | r0โr7, r8_fiqโr14_fiq, PC, CPSR, SPSR_fiq |
||||
* 10010 | IRQ | r0โr7, SP_irq, LR_irq, PC, CPSR, SPSR_irq | r0โr12, r13_irq, r14_irq, PC, CPSR, SPSR_irq |
||||
* 10011 | SVC | r0โr7, SP_svc, LR_svc, PC, CPSR, SPSR_svc | r0โr12, r13_svc, r14_svc, PC, CPSR, SPSR_svc |
||||
* 10111 | ABRT | r0โr7, SP_abt, LR_abt, PC, CPSR, SPSR_abt | r0โr12, r13_abt, r14_abt, PC, CPSR, SPSR_abt |
||||
* 11011 | UNDF | r0โr7, SP_und, LR_und, PC, CPSR, SPSR_und | r0โr12, r13_und, r14_und, PC, CPSR, SPSR_und |
||||
* 11111 | SYS | r0โr7, SP, LR, PC, CPSR | r0โr14, PC, CPSR |
||||
*/ |
||||
|
||||
#define EXCP_EN_ADDR 0x4003FFFC |
||||
#define EXCP_TYPE_ADDR 0x4003FFF8 |
||||
#define EXCP_LR_ADDR 0x4003FFF4 |
||||
|
||||
#define EXCP_VEC_BASE 0x6000F000 |
||||
#define EVP_COP_RESET_VECTOR 0x200 |
||||
#define EVP_COP_UNDEF_VECTOR 0x204 |
||||
#define EVP_COP_SWI_VECTOR 0x208 |
||||
#define EVP_COP_PREFETCH_ABORT_VECTOR 0x20C |
||||
#define EVP_COP_DATA_ABORT_VECTOR 0x210 |
||||
#define EVP_COP_RSVD_VECTOR 0x214 |
||||
#define EVP_COP_IRQ_VECTOR 0x218 |
||||
#define EVP_COP_FIQ_VECTOR 0x21C |
||||
|
||||
#define MODE_USR 0x10 |
||||
#define MODE_FIQ 0x11 |
||||
#define MODE_IRQ 0x12 |
||||
#define MODE_SVC 0x13 |
||||
#define MODE_ABT 0x17 |
||||
#define MODE_UDF 0x1B |
||||
#define MODE_SYS 0x1F |
||||
#define MODE_MASK 0x1F |
||||
|
||||
#define FIQ 0x40 |
||||
#define IRQ 0x80 |
||||
|
||||
.section .text._irq_setup |
||||
.arm |
||||
|
||||
.extern ipl_main
|
||||
.type ipl_main, %function |
||||
|
||||
.extern svc_handler
|
||||
.type svc_handler, %function |
||||
|
||||
.extern irq_handler
|
||||
.type irq_handler, %function |
||||
|
||||
.extern fiq_setup
|
||||
.type fiq_setup, %function |
||||
|
||||
.extern fiq_handler
|
||||
.type fiq_handler, %function |
||||
|
||||
.globl _irq_setup
|
||||
.type _irq_setup, %function |
||||
_irq_setup: |
||||
MRS R0, CPSR |
||||
BIC R0, R0, #MODE_MASK /* Clear mode bits */ |
||||
ORR R0, R0, #(MODE_SVC | IRQ | FIQ) /* SUPERVISOR mode, IRQ/FIQ disabled */ |
||||
MSR CPSR, R0 |
||||
|
||||
/* Setup IRQ stack pointer */ |
||||
MSR CPSR, #(MODE_IRQ | IRQ | FIQ) /* IRQ mode, IRQ/FIQ disabled */ |
||||
LDR SP, =0x40040000 |
||||
|
||||
/* Setup SYS stack pointer */ |
||||
MSR CPSR, #(MODE_SYS | IRQ | FIQ) /* SYSTEM mode, IRQ/FIQ disabled */ |
||||
LDR SP, =0x4003FF00 /* Will be changed later to DRAM */ |
||||
|
||||
MOV LR, PC |
||||
BL setup_vectors |
||||
/*BL fiq_setup*/ |
||||
|
||||
/* Enable interrupts */ |
||||
BL irq_enable_cpu_irq_exceptions |
||||
|
||||
B ipl_main |
||||
B . |
||||
|
||||
_reset: |
||||
LDR R0, =EXCP_EN_ADDR |
||||
LDR R1, =0x30505645 /* EVP0 */ |
||||
STR R1, [R0] /* EVP0 in EXCP_EN_ADDR */ |
||||
LDR R0, =EXCP_LR_ADDR |
||||
MOV R1, LR |
||||
STR R1, [R0] /* Save LR in EXCP_LR_ADDR */ |
||||
LDR R0, =__bss_start |
||||
EOR R1, R1, R1 |
||||
LDR R2, =__bss_end |
||||
SUB R2, R2, R0 |
||||
BL memset |
||||
B _irq_setup |
||||
|
||||
_reset_handler: |
||||
LDR R0, =EXCP_TYPE_ADDR |
||||
LDR R1, =0x545352 /* RST */ |
||||
STR R1, [R0] /* RST in EXCP_TYPE_ADDR */ |
||||
B _reset |
||||
|
||||
_undefined_handler: |
||||
LDR R0, =EXCP_TYPE_ADDR |
||||
LDR R1, =0x464455 /* UDF */ |
||||
STR R1, [R0] /* UDF in EXCP_TYPE_ADDR */ |
||||
B _reset |
||||
|
||||
_prefetch_abort_handler: |
||||
LDR R0, =EXCP_TYPE_ADDR |
||||
LDR R1, =0x54424150 /* PABT */ |
||||
STR R1, [R0] /* PABT in EXCP_TYPE_ADDR */ |
||||
B _reset |
||||
|
||||
_data_abort_handler: |
||||
LDR R0, =EXCP_TYPE_ADDR |
||||
LDR R1, =0x54424144 /* DABT */ |
||||
STR R1, [R0] /* DABT in EXCP_TYPE_ADDR */ |
||||
B _reset |
||||
|
||||
.globl irq_enable_cpu_irq_exceptions
|
||||
.type irq_enable_cpu_irq_exceptions, %function |
||||
irq_enable_cpu_irq_exceptions: |
||||
MRS R12, CPSR |
||||
BIC R12, R12, #(IRQ | FIQ) /* IRQ/FIQ enabled */ |
||||
MSR CPSR, R12 |
||||
BX LR |
||||
|
||||
.globl irq_disable_cpu_irq_exceptions
|
||||
.type irq_disable_cpu_irq_exceptions, %function |
||||
irq_disable_cpu_irq_exceptions: |
||||
MRS R12, CPSR |
||||
ORR R12, R12, #(IRQ | FIQ) /* IRQ/FIQ disabled */ |
||||
MSR CPSR, R12 |
||||
BX LR |
||||
|
||||
_irq_handler: |
||||
MOV R13, R0 /* Save R0 in R13_IRQ */ |
||||
SUB R0, LR, #4 /* Put return address in R0_SYS */ |
||||
MOV LR, R1 /* Save R1 in R14_IRQ (LR) */ |
||||
MRS R1, SPSR /* Put the SPSR in R1_SYS */ |
||||
|
||||
MSR CPSR_c, #(MODE_SYS | IRQ) /* SYSTEM mode, IRQ disabled */ |
||||
STMFD SP!, {R0, R1} /* SPSR and PC */ |
||||
STMFD SP!, {R2-R3, R12, LR} /* AAPCS-clobbered registers */ |
||||
MOV R0, SP /* Make SP_SYS visible to IRQ mode */ |
||||
SUB SP, SP, #8 /* Make room for stacking R0 and R1 */ |
||||
|
||||
MSR CPSR_c, #(MODE_IRQ | IRQ) /* IRQ mode, IRQ disabled */ |
||||
STMFD R0!, {R13, R14} /* Finish saving the context (R0, R1) */ |
||||
|
||||
MSR CPSR_c, #(MODE_SYS | IRQ) /* SYSTEM mode, IRQ disabled */ |
||||
LDR R12, =irq_handler |
||||
MOV LR, PC /* Copy the return address to link register */ |
||||
BX R12 /* Call the C IRQ handler (ARM/THUMB) */ |
||||
|
||||
MSR CPSR_c, #(MODE_SYS | IRQ | FIQ) /* SYSTEM mode, IRQ/FIQ disabled */ |
||||
MOV R0, SP /* Make SP_SYS visible to IRQ mode */ |
||||
ADD SP, SP, #32 /* Fake unstacking 8 registers from SP_SYS */ |
||||
|
||||
MSR CPSR_c, #(MODE_IRQ | IRQ | FIQ) /* IRQ mode, IRQ/FIQ disabled */ |
||||
MOV SP, R0 /* Copy SP_SYS to SP_IRQ */ |
||||
LDR R0, [SP, #28] /* Load the saved SPSR from the stack */ |
||||
MSR SPSR_cxsf, R0 /* Copy it into SPSR_IRQ */ |
||||
|
||||
LDMFD SP, {R0-R3, R12, LR}^ /* Unstack all saved USER/SYSTEM registers */ |
||||
NOP /* Cant access barked registers immediately */ |
||||
LDR LR, [SP, #24] /* Load return address from the SYS stack */ |
||||
MOVS PC, LR /* Return restoring CPSR from SPSR */ |
||||
|
||||
_fiq_handler: |
||||
BL fiq_handler |
||||
|
||||
setup_vectors: |
||||
/* Setup vectors */ |
||||
LDR R0, =EXCP_VEC_BASE |
||||
|
||||
LDR R1, =_reset_handler |
||||
STR R1, [R0, #EVP_COP_RESET_VECTOR] |
||||
|
||||
LDR R1, =_undefined_handler |
||||
STR R1, [R0, #EVP_COP_UNDEF_VECTOR] |
||||
|
||||
LDR R1, =_reset_handler |
||||
STR R1, [R0, #EVP_COP_SWI_VECTOR] |
||||
|
||||
LDR R1, =_prefetch_abort_handler |
||||
STR R1, [R0, #EVP_COP_PREFETCH_ABORT_VECTOR] |
||||
|
||||
LDR R1, =_data_abort_handler |
||||
STR R1, [R0, #EVP_COP_DATA_ABORT_VECTOR] |
||||
|
||||
LDR R1, =_reset_handler |
||||
STR R1, [R0, #EVP_COP_RSVD_VECTOR] |
||||
|
||||
LDR R1, =_irq_handler |
||||
STR R1, [R0, #EVP_COP_IRQ_VECTOR] |
||||
|
||||
LDR R1, =_fiq_handler |
||||
STR R1, [R0, #EVP_COP_FIQ_VECTOR] |
||||
|
||||
BX LR |
@ -0,0 +1,24 @@ |
||||
/*
|
||||
* Copyright (c) 2020 CTCaer |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify it |
||||
* under the terms and conditions of the GNU General Public License, |
||||
* version 2, as published by the Free Software Foundation. |
||||
* |
||||
* This program is distributed in the hope it will be useful, but WITHOUT |
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for |
||||
* more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
#ifndef _FATFS_CFG_H_ |
||||
#define _FATFS_CFG_H_ |
||||
|
||||
#ifdef FFCFG_INC |
||||
#include FFCFG_INC |
||||
#endif |
||||
|
||||
#endif |
@ -0,0 +1,446 @@ |
||||
/*
|
||||
* Copyright (c) 2018 naehrwert |
||||
* Copyright (c) 2018-2019 CTCaer |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify it |
||||
* under the terms and conditions of the GNU General Public License, |
||||
* version 2, as published by the Free Software Foundation. |
||||
* |
||||
* This program is distributed in the hope it will be useful, but WITHOUT |
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for |
||||
* more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
#include <string.h> |
||||
|
||||
#include "di.h" |
||||
#include <power/max77620.h> |
||||
#include <power/max7762x.h> |
||||
#include <soc/clock.h> |
||||
#include <soc/gpio.h> |
||||
#include <soc/i2c.h> |
||||
#include <soc/pinmux.h> |
||||
#include <soc/pmc.h> |
||||
#include <soc/t210.h> |
||||
#include <utils/util.h> |
||||
|
||||
#include "di.inl" |
||||
|
||||
extern volatile nyx_storage_t *nyx_str; |
||||
|
||||
static u32 _display_id = 0; |
||||
|
||||
void display_end(); |
||||
|
||||
static void _display_dsi_wait(u32 timeout, u32 off, u32 mask) |
||||
{ |
||||
u32 end = get_tmr_us() + timeout; |
||||
while (get_tmr_us() < end && DSI(off) & mask) |
||||
; |
||||
usleep(5); |
||||
} |
||||
|
||||
static void _display_dsi_send_cmd(u8 cmd, u32 param, u32 wait) |
||||
{ |
||||
DSI(_DSIREG(DSI_WR_DATA)) = (param << 8) | cmd; |
||||
DSI(_DSIREG(DSI_TRIGGER)) = DSI_TRIGGER_HOST; |
||||
|
||||
if (wait) |
||||
usleep(wait); |
||||
} |
||||
|
||||
void display_init() |
||||
{ |
||||
// Check if display is already initialized.
|
||||
if (CLOCK(CLK_RST_CONTROLLER_CLK_ENB_L_SET) & 0x18000000) |
||||
display_end(); |
||||
|
||||
// Power on.
|
||||
max77620_regulator_set_volt_and_flags(REGULATOR_LDO0, 1200000, MAX77620_POWER_MODE_NORMAL); // Configure to 1.2V.
|
||||
i2c_send_byte(I2C_5, MAX77620_I2C_ADDR, MAX77620_REG_GPIO7, MAX77620_CNFG_GPIO_OUTPUT_VAL_HIGH | MAX77620_CNFG_GPIO_DRV_PUSHPULL); |
||||
|
||||
// Enable Display Interface specific clocks.
|
||||
CLOCK(CLK_RST_CONTROLLER_RST_DEV_H_CLR) = BIT(CLK_H_MIPI_CAL) | BIT(CLK_H_DSI); |
||||
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_H_SET) = BIT(CLK_H_MIPI_CAL) | BIT(CLK_H_DSI); |
||||
|
||||
CLOCK(CLK_RST_CONTROLLER_RST_DEV_L_CLR) = BIT(CLK_L_HOST1X) | BIT(CLK_L_DISP1); |
||||
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_L_SET) = BIT(CLK_L_HOST1X) | BIT(CLK_L_DISP1); |
||||
|
||||
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_X_SET) = BIT(CLK_X_UART_FST_MIPI_CAL); |
||||
CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_UART_FST_MIPI_CAL) = 10; // Set PLLP_OUT3 and div 6 (17MHz).
|
||||
|
||||
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_W_SET) = BIT(CLK_W_DSIA_LP); |
||||
CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_DSIA_LP) = 10; // Set PLLP_OUT and div 6 (68MHz).
|
||||
|
||||
// Disable deep power down.
|
||||
PMC(APBDEV_PMC_IO_DPD_REQ) = 0x40000000; |
||||
PMC(APBDEV_PMC_IO_DPD2_REQ) = 0x40000000; |
||||
|
||||
// Config LCD and Backlight pins.
|
||||
PINMUX_AUX(PINMUX_AUX_NFC_EN) &= ~PINMUX_TRISTATE; // PULL_DOWN
|
||||
PINMUX_AUX(PINMUX_AUX_NFC_INT) &= ~PINMUX_TRISTATE; // PULL_DOWN
|
||||
PINMUX_AUX(PINMUX_AUX_LCD_BL_PWM) &= ~PINMUX_TRISTATE; // PULL_DOWN | 1
|
||||
PINMUX_AUX(PINMUX_AUX_LCD_BL_EN) &= ~PINMUX_TRISTATE; // PULL_DOWN
|
||||
PINMUX_AUX(PINMUX_AUX_LCD_RST) &= ~PINMUX_TRISTATE; // PULL_DOWN
|
||||
|
||||
// Set Backlight +-5V pins mode and direction
|
||||
gpio_config(GPIO_PORT_I, GPIO_PIN_0 | GPIO_PIN_1, GPIO_MODE_GPIO); |
||||
gpio_output_enable(GPIO_PORT_I, GPIO_PIN_0 | GPIO_PIN_1, GPIO_OUTPUT_ENABLE); |
||||
|
||||
// Enable Backlight power.
|
||||
gpio_write(GPIO_PORT_I, GPIO_PIN_0, GPIO_HIGH); // Backlight +5V enable.
|
||||
usleep(10000); |
||||
gpio_write(GPIO_PORT_I, GPIO_PIN_1, GPIO_HIGH); // Backlight -5V enable.
|
||||
usleep(10000); |
||||
|
||||
// Configure Backlight pins (PWM, EN, RST).
|
||||
gpio_config(GPIO_PORT_V, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2, GPIO_MODE_GPIO); |
||||
gpio_output_enable(GPIO_PORT_V, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2, GPIO_OUTPUT_ENABLE); |
||||
gpio_write(GPIO_PORT_V, GPIO_PIN_1, GPIO_HIGH); // Enable Backlight EN.
|
||||
|
||||
// Power up supply regulator for display interface.
|
||||
MIPI_CAL(_DSIREG(MIPI_CAL_MIPI_BIAS_PAD_CFG2)) = 0; |
||||
|
||||
// Set DISP1 clock source and parent clock.
|
||||
CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_DISP1) = 0x40000000; // PLLD_OUT.
|
||||
u32 plld_div = (3 << 20) | (20 << 11) | 1; // DIVM: 1, DIVN: 20, DIVP: 3. PLLD_OUT: 768 MHz, PLLD_OUT0 (DSI): 96 MHz.
|
||||
CLOCK(CLK_RST_CONTROLLER_PLLD_BASE) = PLLCX_BASE_ENABLE | PLLCX_BASE_LOCK | plld_div; |
||||
CLOCK(CLK_RST_CONTROLLER_PLLD_MISC1) = 0x20; // PLLD_SETUP.
|
||||
CLOCK(CLK_RST_CONTROLLER_PLLD_MISC) = 0x2D0AAA; // PLLD_ENABLE_CLK.
|
||||
|
||||
// Setup display communication interfaces.
|
||||
exec_cfg((u32 *)DISPLAY_A_BASE, _display_dc_setup_win_config, 94); |
||||
exec_cfg((u32 *)DSI_BASE, _display_dsi_init_config, 61); |
||||
usleep(10000); |
||||
|
||||
// Enable Backlight Reset.
|
||||
gpio_write(GPIO_PORT_V, GPIO_PIN_2, GPIO_HIGH); |
||||
usleep(60000); |
||||
|
||||
// Setups DSI packet configuration and request display id.
|
||||
DSI(_DSIREG(DSI_BTA_TIMING)) = 0x50204; |
||||
_display_dsi_send_cmd(MIPI_DSI_SET_MAXIMUM_RETURN_PACKET_SIZE, 3, 0); |
||||
_display_dsi_wait(250000, _DSIREG(DSI_TRIGGER), DSI_TRIGGER_HOST | DSI_TRIGGER_VIDEO); |
||||
|
||||
_display_dsi_send_cmd(MIPI_DSI_DCS_READ, MIPI_DCS_GET_DISPLAY_ID, 0); |
||||
_display_dsi_wait(250000, _DSIREG(DSI_TRIGGER), DSI_TRIGGER_HOST | DSI_TRIGGER_VIDEO); |
||||
|
||||
DSI(_DSIREG(DSI_HOST_CONTROL)) = DSI_HOST_CONTROL_TX_TRIG_HOST | DSI_HOST_CONTROL_IMM_BTA | DSI_HOST_CONTROL_CS | DSI_HOST_CONTROL_ECC; |
||||
_display_dsi_wait(150000, _DSIREG(DSI_HOST_CONTROL), DSI_HOST_CONTROL_IMM_BTA); |
||||
|
||||
usleep(5000); |
||||
|
||||
// MIPI_DCS_GET_DISPLAY_ID reply is a long read, size 3 u32.
|
||||
for (u32 i = 0; i < 3; i++) |
||||
_display_id = DSI(_DSIREG(DSI_RD_DATA)); // Skip ack and msg type info and get the payload (display id).
|
||||
|
||||
// Save raw Display ID to Nyx storage.
|
||||
nyx_str->info.disp_id = _display_id; |
||||
|
||||
// Decode Display ID.
|
||||
_display_id = ((_display_id >> 8) & 0xFF00) | (_display_id & 0xFF); |
||||
|
||||
if ((_display_id & 0xFF) == PANEL_JDI_XXX062M) |
||||
_display_id = PANEL_JDI_XXX062M; |
||||
|
||||
// Initialize display panel.
|
||||
switch (_display_id) |
||||
{ |
||||
case PANEL_JDI_XXX062M: |
||||
exec_cfg((u32 *)DSI_BASE, _display_init_config_jdi, 43); |
||||
_display_dsi_send_cmd(MIPI_DSI_DCS_SHORT_WRITE, MIPI_DCS_EXIT_SLEEP_MODE, 180000); |
||||
break; |
||||
case PANEL_INL_P062CCA_AZ1: |
||||
case PANEL_AUO_A062TAN01: |
||||
_display_dsi_send_cmd(MIPI_DSI_DCS_SHORT_WRITE, MIPI_DCS_EXIT_SLEEP_MODE, 180000); |
||||
DSI(_DSIREG(DSI_WR_DATA)) = 0x439; // MIPI_DSI_DCS_LONG_WRITE: 4 bytes.
|
||||
DSI(_DSIREG(DSI_WR_DATA)) = 0x9483FFB9; // Enable extension cmd. (Pass: FF 83 94).
|
||||
DSI(_DSIREG(DSI_TRIGGER)) = DSI_TRIGGER_HOST; |
||||
usleep(5000); |
||||
DSI(_DSIREG(DSI_WR_DATA)) = 0x739; // MIPI_DSI_DCS_LONG_WRITE: 7 bytes.
|
||||
if (_display_id == PANEL_INL_P062CCA_AZ1) |
||||
DSI(_DSIREG(DSI_WR_DATA)) = 0x751548B1; // Set Power control. (Not deep standby, BT5 / XDK, VRH gamma volt adj 53 / x40).
|
||||
else |
||||
DSI(_DSIREG(DSI_WR_DATA)) = 0x711148B1; // Set Power control. (Not deep standby, BT1 / XDK, VRH gamma volt adj 49 / x40).
|
||||
DSI(_DSIREG(DSI_WR_DATA)) = 0x143209; // (NVRH gamma volt adj 9, Amplifier current small / x30, FS0 freq Fosc/80 / FS1 freq Fosc/32).
|
||||
DSI(_DSIREG(DSI_TRIGGER)) = DSI_TRIGGER_HOST; |
||||
usleep(5000); |
||||
break; |
||||
case PANEL_INL_2J055IA_27A: |
||||
case PANEL_AUO_A055TAN01: |
||||
default: // Allow spare part displays to work.
|
||||
_display_dsi_send_cmd(MIPI_DSI_DCS_SHORT_WRITE, MIPI_DCS_EXIT_SLEEP_MODE, 120000); |
||||
break; |
||||
} |
||||
|
||||
_display_dsi_send_cmd(MIPI_DSI_DCS_SHORT_WRITE, MIPI_DCS_SET_DISPLAY_ON, 20000); |
||||
|
||||
// Configure PLLD for DISP1.
|
||||
plld_div = (1 << 20) | (24 << 11) | 1; // DIVM: 1, DIVN: 24, DIVP: 1. PLLD_OUT: 768 MHz, PLLD_OUT0 (DSI): 460.8 MHz.
|
||||
CLOCK(CLK_RST_CONTROLLER_PLLD_BASE) = PLLCX_BASE_ENABLE | PLLCX_BASE_LOCK | plld_div; |
||||
CLOCK(CLK_RST_CONTROLLER_PLLD_MISC1) = 0x20; |
||||
CLOCK(CLK_RST_CONTROLLER_PLLD_MISC) = 0x2DFC00; // Use new PLLD_SDM_DIN.
|
||||
|
||||
// Finalize DSI configuration.
|
||||
exec_cfg((u32 *)DSI_BASE, _display_dsi_packet_config, 21); |
||||
DISPLAY_A(_DIREG(DC_DISP_DISP_CLOCK_CONTROL)) = 4; // PCD1 | div3.
|
||||
exec_cfg((u32 *)DSI_BASE, _display_dsi_mode_config, 10); |
||||
usleep(10000); |
||||
|
||||
// Calibrate display communication pads.
|
||||
exec_cfg((u32 *)MIPI_CAL_BASE, _display_mipi_pad_cal_config, 6); |
||||
exec_cfg((u32 *)DSI_BASE, _display_dsi_pad_cal_config, 4); |
||||
exec_cfg((u32 *)MIPI_CAL_BASE, _display_mipi_apply_dsi_cal_config, 16); |
||||
usleep(10000); |
||||
|
||||
// Enable video display controller.
|
||||
exec_cfg((u32 *)DISPLAY_A_BASE, _display_video_disp_controller_enable_config, 113); |
||||
} |
||||
|
||||
void display_backlight_pwm_init() |
||||
{ |
||||
clock_enable_pwm(); |
||||
|
||||
PWM(PWM_CONTROLLER_PWM_CSR_0) = PWM_CSR_EN; // Enable PWM and set it to 25KHz PFM.
|
||||
|
||||
PINMUX_AUX(PINMUX_AUX_LCD_BL_PWM) = (PINMUX_AUX(PINMUX_AUX_LCD_BL_PWM) & 0xFFFFFFFC) | 1; // PWM clock source.
|
||||
gpio_config(GPIO_PORT_V, GPIO_PIN_0, GPIO_MODE_SPIO); // Backlight power mode.
|
||||
} |
||||
|
||||
void display_backlight(bool enable) |
||||
{ |
||||
gpio_write(GPIO_PORT_V, GPIO_PIN_0, enable ? GPIO_HIGH : GPIO_LOW); // Backlight PWM GPIO.
|
||||
} |
||||
|
||||
void display_backlight_brightness(u32 brightness, u32 step_delay) |
||||
{ |
||||
u32 old_value = (PWM(PWM_CONTROLLER_PWM_CSR_0) >> 16) & 0xFF; |
||||
if (brightness == old_value) |
||||
return; |
||||
|
||||
if (brightness > 255) |
||||
brightness = 255; |
||||
|
||||
if (old_value < brightness) |
||||
{ |
||||
for (u32 i = old_value; i < brightness + 1; i++) |
||||
{ |
||||
PWM(PWM_CONTROLLER_PWM_CSR_0) = PWM_CSR_EN | (i << 16); // Enable PWM and set it to 25KHz PFM.
|
||||
usleep(step_delay); |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
for (u32 i = old_value; i > brightness; i--) |
||||
{ |
||||
PWM(PWM_CONTROLLER_PWM_CSR_0) = PWM_CSR_EN | (i << 16); // Enable PWM and set it to 25KHz PFM.
|
||||
usleep(step_delay); |
||||
} |
||||
} |
||||
if (!brightness) |
||||
PWM(PWM_CONTROLLER_PWM_CSR_0) = 0; |
||||
} |
||||
|
||||
void display_end() |
||||
{ |
||||
display_backlight_brightness(0, 1000); |
||||
|
||||
DSI(_DSIREG(DSI_VIDEO_MODE_CONTROL)) = DSI_CMD_PKT_VID_ENABLE; |
||||
DSI(_DSIREG(DSI_WR_DATA)) = 0x2805; // MIPI_DCS_SET_DISPLAY_OFF
|
||||
|
||||
DISPLAY_A(_DIREG(DC_CMD_STATE_ACCESS)) = READ_MUX | WRITE_MUX; |
||||
DSI(_DSIREG(DSI_VIDEO_MODE_CONTROL)) = 0; // Disable host cmd packet.
|
||||
|
||||
// De-initialize video controller.
|
||||
exec_cfg((u32 *)DISPLAY_A_BASE, _display_video_disp_controller_disable_config, 17); |
||||
exec_cfg((u32 *)DSI_BASE, _display_dsi_timing_deinit_config, 16); |
||||
usleep(10000); |
||||
|
||||
// De-initialize display panel.
|
||||
switch (_display_id) |
||||
{ |
||||
case PANEL_JDI_XXX062M: |
||||
exec_cfg((u32 *)DSI_BASE, _display_deinit_config_jdi, 22); |
||||
break; |
||||
case PANEL_AUO_A062TAN01: |
||||
exec_cfg((u32 *)DSI_BASE, _display_deinit_config_auo, 37); |
||||
break; |
||||
case PANEL_INL_2J055IA_27A: |
||||
case PANEL_AUO_A055TAN01: |
||||
DSI(_DSIREG(DSI_WR_DATA)) = 0x439; // MIPI_DSI_DCS_LONG_WRITE: 4 bytes.
|
||||
DSI(_DSIREG(DSI_WR_DATA)) = 0x9483FFB9; // Enable extension cmd. (Pass: FF 83 94).
|
||||
DSI(_DSIREG(DSI_TRIGGER)) = DSI_TRIGGER_HOST; |
||||
usleep(5000); |
||||
// Set Power.
|
||||
DSI(_DSIREG(DSI_WR_DATA)) = 0xB39; // MIPI_DSI_DCS_LONG_WRITE: 11 bytes.
|
||||
if (_display_id == PANEL_INL_2J055IA_27A) |
||||
DSI(_DSIREG(DSI_WR_DATA)) = 0x751548B1; // Set Power control. (Not deep standby, BT5 / XDK, VRH gamma volt adj 53 / x40).
|
||||
else |
||||
DSI(_DSIREG(DSI_WR_DATA)) = 0x711148B1; // Set Power control. (Not deep standby, BT1 / XDK, VRH gamma volt adj 49 / x40).
|
||||
// Set Power control. (NVRH gamma volt adj 9, Amplifier current small / x30, FS0 freq Fosc/80 / FS1 freq Fosc/32, Enter standby / PON / VCOMG).
|
||||
DSI(_DSIREG(DSI_WR_DATA)) = 0x71143209; |
||||
DSI(_DSIREG(DSI_WR_DATA)) = 0x114D31; // Set Power control. (Unknown).
|
||||
DSI(_DSIREG(DSI_TRIGGER)) = DSI_TRIGGER_HOST; |
||||
usleep(5000); |
||||
break; |
||||
case PANEL_INL_P062CCA_AZ1: |
||||
default: |
||||
break; |
||||
} |
||||
|
||||
_display_dsi_send_cmd(MIPI_DSI_DCS_SHORT_WRITE, MIPI_DCS_ENTER_SLEEP_MODE, 50000); |
||||
|
||||
// Disable display and backlight pins.
|
||||
gpio_write(GPIO_PORT_V, GPIO_PIN_2, GPIO_LOW); //Backlight Reset disable.
|
||||
usleep(10000); |
||||
|
||||
gpio_write(GPIO_PORT_I, GPIO_PIN_1, GPIO_LOW); //Backlight -5V disable.
|
||||
usleep(10000); |
||||
|
||||
gpio_write(GPIO_PORT_I, GPIO_PIN_0, GPIO_LOW); //Backlight +5V disable.
|
||||
usleep(10000); |
||||
|
||||
// Disable Display Interface specific clocks.
|
||||
CLOCK(CLK_RST_CONTROLLER_RST_DEV_H_SET) = BIT(CLK_H_MIPI_CAL) | BIT(CLK_H_DSI); |
||||
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_H_CLR) = BIT(CLK_H_MIPI_CAL) | BIT(CLK_H_DSI); |
||||
CLOCK(CLK_RST_CONTROLLER_RST_DEV_L_SET) = BIT(CLK_L_HOST1X) | BIT(CLK_L_DISP1); |
||||
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_L_CLR) = BIT(CLK_L_HOST1X) | BIT(CLK_L_DISP1); |
||||
|
||||
// Power down pads.
|
||||
DSI(_DSIREG(DSI_PAD_CONTROL_0)) = DSI_PAD_CONTROL_VS1_PULLDN_CLK | DSI_PAD_CONTROL_VS1_PULLDN(0xF) | DSI_PAD_CONTROL_VS1_PDIO_CLK | DSI_PAD_CONTROL_VS1_PDIO(0xF); |
||||
DSI(_DSIREG(DSI_POWER_CONTROL)) = 0; |
||||
|
||||
// Switch to automatic function mode.
|
||||
gpio_config(GPIO_PORT_V, GPIO_PIN_0, GPIO_MODE_SPIO); // Backlight PWM.
|
||||
|
||||
PINMUX_AUX(PINMUX_AUX_LCD_BL_PWM) = (PINMUX_AUX(PINMUX_AUX_LCD_BL_PWM) & ~PINMUX_TRISTATE) | PINMUX_TRISTATE; |
||||
PINMUX_AUX(PINMUX_AUX_LCD_BL_PWM) = (PINMUX_AUX(PINMUX_AUX_LCD_BL_PWM) & 0xFFFFFFFC)| 1; |
||||
} |
||||
|
||||
void display_color_screen(u32 color) |
||||
{ |
||||
exec_cfg((u32 *)DISPLAY_A_BASE, cfg_display_one_color, 8); |
||||
|
||||
// Configure display to show single color.
|
||||
DISPLAY_A(_DIREG(DC_WIN_AD_WIN_OPTIONS)) = 0; |
||||
DISPLAY_A(_DIREG(DC_WIN_BD_WIN_OPTIONS)) = 0; |
||||
DISPLAY_A(_DIREG(DC_WIN_CD_WIN_OPTIONS)) = 0; |
||||
DISPLAY_A(_DIREG(DC_DISP_BLEND_BACKGROUND_COLOR)) = color; |
||||
DISPLAY_A(_DIREG(DC_CMD_STATE_CONTROL)) = (DISPLAY_A(_DIREG(DC_CMD_STATE_CONTROL)) & 0xFFFFFFFE) | GENERAL_ACT_REQ; |
||||
usleep(35000); |
||||
|
||||
display_backlight(true); |
||||
} |
||||
|
||||
u32 *display_init_framebuffer_pitch() |
||||
{ |
||||
// Sanitize framebuffer area.
|
||||
memset((u32 *)IPL_FB_ADDRESS, 0, 0x3C0000); |
||||
|
||||
// This configures the framebuffer @ IPL_FB_ADDRESS with a resolution of 1280x720 (line stride 720).
|
||||
exec_cfg((u32 *)DISPLAY_A_BASE, cfg_display_framebuffer_pitch, 32); |
||||
usleep(35000); |
||||
|
||||
return (u32 *)IPL_FB_ADDRESS; |
||||
} |
||||
|
||||
u32 *display_init_framebuffer_pitch_inv() |
||||
{ |
||||
// This configures the framebuffer @ NYX_FB_ADDRESS with a resolution of 1280x720 (line stride 720).
|
||||
exec_cfg((u32 *)DISPLAY_A_BASE, cfg_display_framebuffer_pitch_inv, 34); |
||||
|
||||
usleep(35000); |
||||
|
||||
return (u32 *)NYX_FB_ADDRESS; |
||||
} |
||||
|
||||
u32 *display_init_framebuffer_block() |
||||
{ |
||||
// This configures the framebuffer @ NYX_FB_ADDRESS with a resolution of 1280x720 (line stride 720).
|
||||
exec_cfg((u32 *)DISPLAY_A_BASE, cfg_display_framebuffer_block, 34); |
||||
|
||||
usleep(35000); |
||||
|
||||
return (u32 *)NYX_FB_ADDRESS; |
||||
} |
||||
|
||||
u32 *display_init_framebuffer_log() |
||||
{ |
||||
// This configures the framebuffer @ LOG_FB_ADDRESS with a resolution of 1280x720 (line stride 720).
|
||||
exec_cfg((u32 *)DISPLAY_A_BASE, cfg_display_framebuffer_log, 20); |
||||
|
||||
return (u32 *)LOG_FB_ADDRESS; |
||||
} |
||||
|
||||
void display_activate_console() |
||||
{ |
||||
DISPLAY_A(_DIREG(DC_CMD_DISPLAY_WINDOW_HEADER)) = WINDOW_D_SELECT; // Select window C.
|
||||
DISPLAY_A(_DIREG(DC_WIN_WIN_OPTIONS)) = WIN_ENABLE; // Enable window DD.
|
||||
DISPLAY_A(_DIREG(DC_WIN_POSITION)) = 0xFF80; |
||||
DISPLAY_A(_DIREG(DC_CMD_STATE_CONTROL)) = GENERAL_UPDATE | WIN_D_UPDATE; |
||||
DISPLAY_A(_DIREG(DC_CMD_STATE_CONTROL)) = GENERAL_ACT_REQ | WIN_D_ACT_REQ; |
||||
|
||||
for (u32 i = 0xFF80; i < 0x10000; i++) |
||||
{ |
||||
DISPLAY_A(_DIREG(DC_WIN_POSITION)) = i & 0xFFFF; |
||||
DISPLAY_A(_DIREG(DC_CMD_STATE_CONTROL)) = GENERAL_UPDATE | WIN_D_UPDATE; |
||||
DISPLAY_A(_DIREG(DC_CMD_STATE_CONTROL)) = GENERAL_ACT_REQ | WIN_D_ACT_REQ; |
||||
usleep(1000); |
||||
} |
||||
|
||||
DISPLAY_A(_DIREG(DC_WIN_POSITION)) = 0; |
||||
DISPLAY_A(_DIREG(DC_CMD_STATE_CONTROL)) = GENERAL_UPDATE | WIN_D_UPDATE; |
||||
DISPLAY_A(_DIREG(DC_CMD_STATE_CONTROL)) = GENERAL_ACT_REQ | WIN_D_ACT_REQ; |
||||
} |
||||
|
||||
void display_deactivate_console() |
||||
{ |
||||
DISPLAY_A(_DIREG(DC_CMD_DISPLAY_WINDOW_HEADER)) = WINDOW_D_SELECT; // Select window C.
|
||||
|
||||
for (u32 i = 0xFFFF; i > 0xFF7F; i--) |
||||
{ |
||||
DISPLAY_A(_DIREG(DC_WIN_POSITION)) = i & 0xFFFF; |
||||
DISPLAY_A(_DIREG(DC_CMD_STATE_CONTROL)) = GENERAL_UPDATE | WIN_D_UPDATE; |
||||
DISPLAY_A(_DIREG(DC_CMD_STATE_CONTROL)) = GENERAL_ACT_REQ | WIN_D_ACT_REQ; |
||||
usleep(500); |
||||
} |
||||
|
||||
DISPLAY_A(_DIREG(DC_WIN_POSITION)) = 0; |
||||
DISPLAY_A(_DIREG(DC_WIN_WIN_OPTIONS)) = 0; // Disable window DD.
|
||||
DISPLAY_A(_DIREG(DC_CMD_STATE_CONTROL)) = GENERAL_UPDATE | WIN_D_UPDATE; |
||||
DISPLAY_A(_DIREG(DC_CMD_STATE_CONTROL)) = GENERAL_ACT_REQ | WIN_D_ACT_REQ; |
||||
} |
||||
|
||||
void display_init_cursor(void *crs_fb, u32 size) |
||||
{ |
||||
// Setup cursor.
|
||||
DISPLAY_A(_DIREG(DC_DISP_CURSOR_START_ADDR)) = CURSOR_CLIPPING(CURSOR_CLIP_WIN_A) | size | ((u32)crs_fb >> 10); |
||||
DISPLAY_A(_DIREG(DC_DISP_BLEND_CURSOR_CONTROL)) = |
||||
CURSOR_BLEND_R8G8B8A8 | CURSOR_BLEND_DST_FACTOR(CURSOR_BLEND_K1) | CURSOR_BLEND_SRC_FACTOR(CURSOR_BLEND_K1) | 0xFF; |
||||
|
||||
DISPLAY_A(_DIREG(DC_DISP_DISP_WIN_OPTIONS)) |= CURSOR_ENABLE; |
||||
|
||||
// Arm and activate changes.
|
||||
DISPLAY_A(_DIREG(DC_CMD_STATE_CONTROL)) = GENERAL_UPDATE | CURSOR_UPDATE; |
||||
DISPLAY_A(_DIREG(DC_CMD_STATE_CONTROL)) = GENERAL_ACT_REQ | CURSOR_ACT_REQ; |
||||
} |
||||
|
||||
void display_set_pos_cursor(u32 x, u32 y) |
||||
{ |
||||
DISPLAY_A(_DIREG(DC_DISP_CURSOR_POSITION)) = x | (y << 16); |
||||
|
||||
DISPLAY_A(_DIREG(DC_CMD_STATE_CONTROL)) = GENERAL_UPDATE | CURSOR_UPDATE; |
||||
DISPLAY_A(_DIREG(DC_CMD_STATE_CONTROL)) = GENERAL_ACT_REQ | CURSOR_ACT_REQ; |
||||
} |
||||
|
||||
void display_deinit_cursor() |
||||
{ |
||||
DISPLAY_A(_DIREG(DC_DISP_BLEND_CURSOR_CONTROL)) = 0; |
||||
DISPLAY_A(_DIREG(DC_DISP_DISP_WIN_OPTIONS)) &= ~CURSOR_ENABLE; |
||||
DISPLAY_A(_DIREG(DC_CMD_STATE_CONTROL)) = GENERAL_UPDATE | CURSOR_UPDATE; |
||||
DISPLAY_A(_DIREG(DC_CMD_STATE_CONTROL)) = GENERAL_ACT_REQ | CURSOR_ACT_REQ; |
||||
} |
@ -0,0 +1,546 @@ |
||||
/*
|
||||
* Copyright (c) 2018 naehrwert |
||||
* Copyright (c) 2018-2019 CTCaer |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify it |
||||
* under the terms and conditions of the GNU General Public License, |
||||
* version 2, as published by the Free Software Foundation. |
||||
* |
||||
* This program is distributed in the hope it will be useful, but WITHOUT |
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for |
||||
* more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
#ifndef _DI_H_ |
||||
#define _DI_H_ |
||||
|
||||
#include <memory_map.h> |
||||
#include <utils/types.h> |
||||
|
||||
/*! Display registers. */ |
||||
#define _DIREG(reg) ((reg) * 4) |
||||
|
||||
// Display controller scratch registers.
|
||||
#define DC_D_WINBUF_DD_SCRATCH_REGISTER_0 0xED |
||||
#define DC_D_WINBUF_DD_SCRATCH_REGISTER_1 0xEE |
||||
#define DC_T_WINBUF_TD_SCRATCH_REGISTER_0 0x16D |
||||
#define DC_T_WINBUF_TD_SCRATCH_REGISTER_1 0x16E |
||||
#define DC_COM_SCRATCH_REGISTER_A 0x325 |
||||
#define DC_COM_SCRATCH_REGISTER_B 0x326 |
||||
#define DC_A_WINBUF_AD_SCRATCH_REGISTER_0 0xBED |
||||
#define DC_A_WINBUF_AD_SCRATCH_REGISTER_1 0xBEE |
||||
#define DC_B_WINBUF_BD_SCRATCH_REGISTER_0 0xDED |
||||
#define DC_B_WINBUF_BD_SCRATCH_REGISTER_1 0xDEE |
||||
#define DC_C_WINBUF_CD_SCRATCH_REGISTER_0 0xFED |
||||
#define DC_C_WINBUF_CD_SCRATCH_REGISTER_1 0xFEE |
||||
|
||||
// DC_CMD non-shadowed command/sync registers.
|
||||
#define DC_CMD_GENERAL_INCR_SYNCPT 0x00 |
||||
|
||||
#define DC_CMD_GENERAL_INCR_SYNCPT_CNTRL 0x01 |
||||
#define SYNCPT_CNTRL_NO_STALL (1 << 8) |
||||
#define SYNCPT_CNTRL_SOFT_RESET (1 << 0) |
||||
|
||||
#define DC_CMD_CONT_SYNCPT_VSYNC 0x28 |
||||
#define SYNCPT_VSYNC_ENABLE (1 << 8) |
||||
|
||||
#define DC_CMD_DISPLAY_COMMAND_OPTION0 0x031 |
||||
|
||||
#define DC_CMD_DISPLAY_COMMAND 0x32 |
||||
#define DISP_CTRL_MODE_STOP (0 << 5) |
||||
#define DISP_CTRL_MODE_C_DISPLAY (1 << 5) |
||||
#define DISP_CTRL_MODE_NC_DISPLAY (2 << 5) |
||||
#define DISP_CTRL_MODE_MASK (3 << 5) |
||||
|
||||
#define DC_CMD_DISPLAY_POWER_CONTROL 0x36 |
||||
#define PW0_ENABLE (1 << 0) |
||||
#define PW1_ENABLE (1 << 2) |
||||
#define PW2_ENABLE (1 << 4) |
||||
#define PW3_ENABLE (1 << 6) |
||||
#define PW4_ENABLE (1 << 8) |
||||
#define PM0_ENABLE (1 << 16) |
||||
#define PM1_ENABLE (1 << 18) |
||||
|
||||
#define DC_CMD_INT_STATUS 0x37 |
||||
#define DC_CMD_INT_MASK 0x38 |
||||
#define DC_CMD_INT_ENABLE 0x39 |
||||
|
||||
#define DC_CMD_STATE_ACCESS 0x40 |
||||
#define READ_MUX (1 << 0) |
||||
#define WRITE_MUX (1 << 2) |
||||
|
||||
#define DC_CMD_STATE_CONTROL 0x41 |
||||
#define GENERAL_ACT_REQ (1 << 0) |
||||
#define WIN_A_ACT_REQ (1 << 1) |
||||
#define WIN_B_ACT_REQ (1 << 2) |
||||
#define WIN_C_ACT_REQ (1 << 3) |
||||
#define WIN_D_ACT_REQ (1 << 4) |
||||
#define CURSOR_ACT_REQ (1 << 7) |
||||
#define GENERAL_UPDATE (1 << 8) |
||||
#define WIN_A_UPDATE (1 << 9) |
||||
#define WIN_B_UPDATE (1 << 10) |
||||
#define WIN_C_UPDATE (1 << 11) |
||||
#define WIN_D_UPDATE (1 << 12) |
||||
#define CURSOR_UPDATE (1 << 15) |
||||
#define NC_HOST_TRIG (1 << 24) |
||||
|
||||