Port kernel - Elephone P8000

How to port custom kernels from P8000 to another device running the MT6753?

You need to check which hardware (LCD, Touchpanel, Camera, ...) is built in and find driver sources. Luckily the P8000 kernel source is rather big and contains a lot of unused drivers so there might be a fair chance to port it to devices. There are also other sources around in the Internet so start searching

BlueFlame4 said:
You need to check which hardware (LCD, Touchpanel, Camera, ...) is built in and find driver sources. Luckily the P8000 kernel source is rather big and contains a lot of unused drivers so there might be a fair chance to port it to devices. There are also other sources around in the Internet so start searching
Click to expand...
Click to collapse
Is there any step by step guide for kernel porting?

Related

Simplistic HTC Hero Kernel Question.

Hi All,
Running rooted Hero with Modaco 2.5.1 rom ( thanks Paul )
Was hoping someone could ( simplistically ) answer a few question for me.
As I understand it - one of the things holding back development of Hero ROMS is that HTC haven't released the kernel for the Hero.
1) What exactly IS the kernel in the greater scheme of things?
2) When are HTC likely to release it?
3) When it is released, what new things will it allow developers to do?
4) Anything else relevant to it worth knowing?
TIA
Look at these:
1. The kernel is the Operating System for the phone, it runs everything.
2. That is the magic question...
3. It'll allow more development in terms of mods. we'll be able to change alot more and get more out of the phones.
I'm sure others will have more detailed explanations.
Regarding question 2:
I've gotten response from HTC support the other day that the release is planned but no sure date could be given.
Date: 5th of October
My question:
Hello there, I realize that this might not be the normal kind of request you guys get, but here goes. This is probably not your average request and might require escalation. I was wondering when the source code for the Hero kernel was gonna be available at developer.htc.com?
Click to expand...
Click to collapse
Answer:
Hello
This is quite a normal question we get here at HTC. The source code is something that will becoming soon. We have had contact with those far higher than my self or are planning on adding the source code as soon as possible. I have not been given a time scale but bases on the code for the two other handsets i should expect it in the next couple of weeks.
Hope this helps.
Click to expand...
Click to collapse
So, educated guess would be around the release of the Hero in the US.
Some if I have this right -
The kernel is the basic underlying OS of the phone, and a ROM sits on top of this end gives us the end user experience ( and Sense UI is within the ROM ).
Am I right in thinking the kernel is linux based?
And a big magic question - when the kernel is released, will people be able to modify it and get the bluetooth working properly?
Sorry if it's a bit basic - but interesting to me....
The Kernel is not the OS (As most people understand an OS to be) (OS meaning Operating System)
It's at the core of the OS but is not the OS. You can keep the same build of an OS but update the kernel and vica versa. It is (put simply) what converts the hardware calls from the OS into something the hardware understands.
So (using current issues as explanation) The OS tries to load the GPS and the kernel isn't configured with the right settings the GPS won't load. Similarly if you try and use the trackball and it's not setup in the kernel then it won't do anything.
The OS will still work fine with other things but until the kernel has the right settings put into it it just won't see the parts of the phone it's not set up to.
Here is a technical description of a Kernel.
http://www.linfo.org/kernel.html
I'm sure I've just made it as clear as dishwater but if not I hope it's helped.
J-Zeus said:
Some if I have this right -
The kernel is the basic underlying OS of the phone, and a ROM sits on top of this end gives us the end user experience ( and Sense UI is within the ROM ).
Click to expand...
Click to collapse
Not exactly. To add to what akirainblack has said already...ROM stands for Read Only Memory. In this context it is a bit different as it is the complete package that makes up the Kernel, the OS and anything that is pre-installed to the phone. When you run the RUU (Rom Update Utilitiy) on your PC is completely refreshes the system software in your phone - Kernel, OS and any pre-installed apps - just as if you had bought it from the shop like that.
J-Zeus said:
Am I right in thinking the kernel is linux based?
Click to expand...
Click to collapse
Yes.
Hmmm...
simple question... when the kernel is available... would we be able to get a white taskbar on the Hero?
//Nik
When the kernel source is available, we should be able to rebuild Android completely from the source code repositories and do practically whatever you want.
Regards,
Dave
foxmeister said:
When the kernel source is available, we should be able to rebuild Android completely from the source code repositories and do practically whatever you want.
Regards,
Dave
Click to expand...
Click to collapse
Including getting Bluetooth working?
J-Zeus said:
Including getting Bluetooth working?
Click to expand...
Click to collapse
In theory, yes. In practice, the situation is a little more complicated, but at the very least I'd imagine it would be possible to get BlueX, or something like it, working on rooted Heros fairly quickly.
Regards,
Dave
Given that this is a Linux kernel, aren't HTC required by the GPL to make the source available to all Hero owners?
This is covering the same ground, but is another way to look at things regarding the kernel and the OS. The kernel abstracts the specifics of the hardware from the Android system. For example, when the Android system requests that the bluetooth hardware be enabled, the kernel can translate that request so that it works with the particular hardware of the phone - as the bluetooth hardware of the Magic may be different from the bluetooth hardware of the Hero. So the kernel, is an interface that translates and Android call to the specific hardware level controls necessary. The kernel sits between the hardware and the Android system.
It also means that releasing the kernel will not allow us to make changes to the Hero Android user interfaces. If we want to change colours, icons and so on in the Hero ROM, we would need the source code for their "tweaked" Android and maybe to some degree their TouchFlo software. I doubt they would give that away. It would allows us however, to tweak the kernel, or transplant the driver code for specific hardware pieces in the Hero, to a newer version kernel.
I understand that the release of the hero kernel, could help me with my cause (getting 1.5/1.6 'clean' android on my hero without any htc apps/front ends).
Somebody suggested contacting HTC and asking for it to be released.
I have a few questions regarding that:
1) Has this happened before? That HTC released an android kernel?
2) Did this happen after the request?
3) Who should we contact to get it? (which HTC division)
4) Is there a possibility that they don't want to release it, because it would allow people to copy parts of the proprietary interface?
E2K said:
1) Has this happened before? That HTC released an android kernel?
Click to expand...
Click to collapse
Take a look at http://developer.htc.com/
The Dream and Magic sources are available.
E2K said:
4) Is there a possibility that they don't want to release it, because it would allow people to copy parts of the proprietary interface?
Click to expand...
Click to collapse
The HTC Sense UI won't be included in the kernel source.
They dont have to release the source of them.
New question
Is it possible to create a new donut kernel (2.6.29) with the changes they made to the 1.5 kernel (2.6.27)?
Looks like they send you the hole kernel, not just some patches and new drivers...
mopodo said:
Take a look at http://developer.htc.com/
The Dream and Magic sources are available.
Click to expand...
Click to collapse
So this means that we could compile or 'cook' a working vanilla android 1.5 for the HTC hero, with everything working fully?
HTC HAS to release the kernel source as required under the GPL license that the kernel was released under. It is indeed a linux kernel and it contains the necessary parts to work the hardware along with extra drivers and modules (stupid monolithic kernels).
Here's what I don't get (and hopefully somebody will clarify this for me). Why hasn't anybody tried building android with the current kernel available? Android has the ability to be built around a pre-compiled kernel (it does this if you do a straight make right after repo sync with the pre-compiled dream kernel). You'd only need to re-build the wlan.ko module for the new kernel and the gps module would be compiled against the specified kernel, so it should work.
If I had Hero, I'd test it (if you want to trade your Hero for my G1, hit me up ), but there's no reason it shouldn't work.
Up to now, I've only seen ports, and those are hard to make work because of the pre-compiled files, so that leads to loads of file-swapping and finger-crossing, but an AOSP make should still work. Anybody wanna try it (or post me a hero kernel and I'll compile you a stock donut build to test).
jubeh said:
HTC HAS to release the kernel source as required under the GPL license that the kernel was released under. It is indeed a linux kernel and it contains the necessary parts to work the hardware along with extra drivers and modules (stupid monolithic kernels).
Here's what I don't get (and hopefully somebody will clarify this for me). Why hasn't anybody tried building android with the current kernel available? Android has the ability to be built around a pre-compiled kernel (it does this if you do a straight make right after repo sync with the pre-compiled dream kernel). You'd only need to re-build the wlan.ko module for the new kernel and the gps module would be compiled against the specified kernel, so it should work.
If I had Hero, I'd test it (if you want to trade your Hero for my G1, hit me up ), but there's no reason it shouldn't work.
Up to now, I've only seen ports, and those are hard to make work because of the pre-compiled files, so that leads to loads of file-swapping and finger-crossing, but an AOSP make should still work. Anybody wanna try it (or post me a hero kernel and I'll compile you a stock donut build to test).
Click to expand...
Click to collapse
Hi, thank you for this information. You make it sound like it's possible
I tried searching for the Hero Kernel, but I could only find this:
http://developer.htc.com/
The hero is not listed (maybe it shares a lot with the magic kernel?).
edit: this post dating from september 10 stated that HTC would "release the kernel source soon".
This was more than a month ago though..
edit2: calling HTC Netherlands right now..
edit3: after explainig the need for the kernel, I've been on hold for 10 minutes now..
edit4: more than 18 minutes now
edit5: after 26 minutes I hang up
Well I have a Hero running Modaco 2.2. I could post this kernel (where?) Or it surely could be extracted from one of the ROMs available on this very site
SquiffSquiff said:
Well I have a Hero running Modaco 2.2. I could post this kernel (where?) Or it surely could be extracted from one of the ROMs available on this very site
Click to expand...
Click to collapse
I could be wrong, but I believe there is a difference between the 'kernel', and the 'kernel source'. The second one is needed when you want to compile the kernel.
Speaking as one who has compiled kernels in the past there are three components required here:
The kernel source- this is typically available from http://kernel.org/ If HTC have made any changes to the source of the kernel itself then these should be apparent in their distribution of the kernel source
The relevant configuration file '.config' which should accompany their distribution of the kernel source and permit you to compile any other kernel as a drop in replacement.
Source code and makefiles for any custom kernel modules ('drivers' in windows terminology) In Linux these have to be compiled together with the kernel.
To use a cookery analogy:
The kernel source is the raw ingredients. It can be set up for anything from a supercomputer to a DVD player depending on how you use it. The kernel config is the method which will allow you to bake the type of cake you intend. The modules sources are any of HTC’s own custom ingredients required for everything to work. THe kernel is the finished cake which you eat.

Future (kernel/userspace dev questions, no FUD plz)

UPDATE: All sources are available from Samsung now!!! Even the video drivers! And the bootloader indeed accepts unsigned images
Hi guys!
I heard lots of contradicting stuff on the future-proofness of SgS...
The most disturbed(sic) being "encrypted drivers"
Therefore I really-really would like to know:
Is the source for the video module available somewhere?
Are any of the (other) kernel modules closed source?
Are any of the (for full hardware functionality) essential userspace components closed source?
Are any of (1) (2) (3) encrypted/protected against reverse engineering?
Does the bootloader accept unsigned kernels? (As far as I could google, it does, but you never know...)
Thank you very much! It is really hard to find definite info on these subjects.
UPDATE: All sources are available from Samsung now!!! Even the video drivers! And the bootloader indeed accepts unsigned images
I researched myself, and...
1. Is the source for the video module available somewhere?
Click to expand...
Click to collapse
There are 3 separate kernel modules (base, lcd, 3d) for video. NEITHER of these are open source. AFAIC google, no open source alternatives exists.
2. Are any of the (other) kernel modules closed source?
Click to expand...
Click to collapse
AFAIK the rest of the kernel, and its modules are open source.
I would love to know this too.
The best I could find is some (older) Nokia PowerVR SGX drivers, but - since only the architecture is licensed from ImgTec, and not the hardware - these are not likely to work without any heavy tweaking... even in 2D.

serial adapters - anyone have one working

I work with Cisco devices on a regular basis. To connect to them, I need to use a DB9 serial.
I have tried the usb to serial Prolific 2303 chipset but it isn't supported in the OS (I'm not sure why this was removed from the Android Linux kernel because it is standard in Linux kernel 2.4.31 and later but anyway...)
Anyone know of a way to get serial connectivity so I can use this tablet as a true laptop replacement? Maybe a serial to bluetooth would work? Samsung says the bluetooth supports SPP but I don't want to dish out $70+ to find out it doesn't work.
Maybe someone familiar with compiling kernel modules for Android could assist? I have the pl2303.c source code but I'm not familiar enough with compiling kernels or kernel modules to attempt this.
I've been looking into this myself the past couple of days. The kernel is not compiled with support for USB-Serial converters, but all of the code is there. It looks like the kernel would have to be recompiled along with the required modules. Here is the source I'm using: https://github.com/pershoot/galaxy-2636
So far I've just looked at config and it is easy to enable the required modules, but I haven't managed to get the kernel compilation and ARM toolchain to work just yet.
samsung source
I noticed the pl2303.c and pl2303.h are in the Samsung source I downloaded.
I'm going to try to compile a kernel module in the next week.
I'm fairly shocked this hasn't been a bigger issue. We can't be the only ones wanting this functionality - especially since Samsung support basically told me to pound sand.
I've managed to compile an ICS kernel with the required configuration and modules, once I figure out how to get it on the device I'll test it. If it works I'll build a honeycomb kernel as well and post both in the dev section.
That is fantastic! I'm having issues getting my cross compile to work properly.
Well, I managed to build the kernel & modules properly but the adapter still isn't recognized even with the modules loaded. I think there might be more to the problem than missing modules
I read today that the main linux kernel and the android fork are going to be merging. Maybe that will lead to better device support.

[DISCUSSIONS][TESTING][ROM][UNOFFICIAL] CyanogenMod 13 ALPHA Build

This is a test build I take no responsibility for what this may or may not do to your device.
Click to expand...
Click to collapse
NEED TESTERS
currently i don't have the device to test i will be getting my device in the next week .
Click to expand...
Click to collapse
1. Install CWM Recovery
2. Do Full Wipe If coming from another ROM
3. Flash ROM
4. Flash Google Apps (my recommendation is to install minipal gapps due to /system partition size limits)
5. Reboot
Click to expand...
Click to collapse
]Not Booting
Click to expand...
Click to collapse
Code:
[B]Source[/B]
Here are the device tree :
Device Tree (from cm13 Nexus 9) : https://github.com/vickdu31/android_device_xiaomi_mocha
Kernel Tree (from Xiaomi KK) : https://github.com/vickdu31/android_kernel_xiaomi_mocha
Vendor Tree (old Xiaomi KK) : https://github.com/vickdu31/android_vendor_xiaomi_mocha
Thank you
@faust93 for cwm
XDA:DevDB Information
CM-13, ROM for the Xiaomi Mi Pad
Contributors
Rohit99, tank0412, vickdu31
ROM OS Version: 6.0.x Marshmallow
Based On: CyanogenMod
Version Information
Status: Testing
Created 2016-12-10
Last Updated 2016-12-13
Reserved
Edit 1:initial build didn't boot for me, no adb can't get log
Ok im gonna try it.
If you want, i can leave logcat for you
OoSTARTERoO said:
Ok im gonna try it.
If you want, i can leave logcat for you
Click to expand...
Click to collapse
Can get logcat? Try please.
Ofc, it doesn't boot. And don't create threads without testing.
Sudeep Duhoon said:
Can get logcat? Try please.
Click to expand...
Click to collapse
unfortunately....I couldn't get logcat too...
Sudeep Duhoon said:
Can get logcat? Try please.
Click to expand...
Click to collapse
we can't get logcat. It doesn't boot, i mean there are problems with kernel or init scripts or both. Kernel needs patches.
Nihhaar said:
Ofc, it doesn't boot.
Click to expand...
Click to collapse
As I thought
Prebuilt kernel from cm11
Sudeep Duhoon said:
As I thought
Click to expand...
Click to collapse
hey can i use prebuilt kernel from cm11 source @Nihhaar
Rohit99 said:
hey can i use prebuilt kernel from cm11 source @Nihhaar
Click to expand...
Click to collapse
Always try to build kernel with source. I think you can't, but you can try.
Please edit the link in OP, its me who miswrote it... : /android_device_xioami_mocha --> /android_device_xiaomi_mocha
You need to fix up SELinux and the init scripts. Taking a shield tablet device tree, renaming things to mocha and changing the fstab isn't enough. As far as I can tell the shieldtablet device tree also has dependency on a shield common tree. There's also no value in creating a new thread each time you push new commits
Our kernel from Xiaomi is also pretty useless without commit history. The device tree is also from shield tablet, not Nexus 9.
We also have a tree for building TWRP with OmniROM that you can compile TWRP 3.0.2.0 with.
What kernel repo is upstream one for tegra android? Like CAF for quallcom.
I've tried to merge xiaomi changes on l4t kernel https://github.com/HighwayStar/android_kernel_xiaomi_mocha
Merged dts files and arch/boot/march-tegra with some required drivers, but still cant boot it. Found somewhere here that l4t kernels is not for android, but for GNU/Linux, but what kernel is for android?
Cyanogenmod's shield kernel?
highwaystar_ru said:
What kernel repo is upstream one for tegra android? Like CAF for quallcom.
I've tried to merge xiaomi changes on l4t kernel https://github.com/HighwayStar/android_kernel_xiaomi_mocha
Merged dts files and arch/boot/march-tegra with some required drivers, but still cant boot it. Found somewhere here that l4t kernels is not for android, but for GNU/Linux, but what kernel is for android?
Cyanogenmod's shield kernel?
Click to expand...
Click to collapse
git://nv-tegra.nvidia.com/linux-3.10.git
I used rel-tn8-l-r7-shieldtablet8 to make a start on doing this. You could also use android_kernel_shield from CyanogenMod repo as it comes from the same place. But it will have a lot of extra commits for things not useful for mocha.
Here's what I have so far:
https://github.com/harrynowl/nvidia_tegra-3.10
Harrynowl said:
git://nv-tegra.nvidia.com/linux-3.10.git
I used rel-tn8-l-r7-shieldtablet8 to make a start on doing this. You could also use android_kernel_shield from CyanogenMod repo as it comes from the same place. But it will have a lot of extra commits for things not useful for mocha.
Here's what I have so far:
https://github.com/harrynowl/nvidia_tegra-3.10
Click to expand...
Click to collapse
Oh, intresting, cloned same url, but started other branch l4t/l4t-r21.5.
What status of your tree? Cant boot? We need minimal bootable kernel to be able to get dmesg and make further progress.
highwaystar_ru said:
Oh, intresting, cloned same url, but started other branch l4t/l4t-r21.5.
What status of your tree? Cant boot? We need minimal bootable kernel to be able to get dmesg and make further progress.
Click to expand...
Click to collapse
Untested, been doing device bring up. That kernel won't work yet anyway it's missing atmel, synaptic and battery firmware. (Plus the code that goes with it)
Some devs have one that gets to recovery but only 1 CPU core can come online and the CPU gets a bit hot. Unfortunately their commit history is hard to follow so I've not had a proper look at it yet
My my...it's been a while since I've seen a cringe-worthy dev thread on XDA. So OP just used the device tree from Nexus 9 (a 64-bit device with a different processor and nothing in common with the Mi Pad other than the fact that they use Nvidia SoCs and are both tablets), unmodified KITKAT kernel sources from Xiaomi (which takes work to make it boot, even on KK) and KITKAT userspace blobs to compile the ROM, and for some reason decided to share it without testing. The 10-post rule is meant to keep such people out of the development sub-forums, but obviously that's not working.
I do not understand why the moderators are allowing this thread to remain open. It's just a thread by a wannabe dev offering a non-bootable ROM that has the potential to brick the devices of many newbies who may decide to try this.
This thread is even more useless than the other "DEVS-ONLY" thread someone else made. Honestly, the entire Mi Pad forum is filled with people who either expect Android 7.1.1 to magically appear on their tabs just because Xiaomi released outdated kernel sources or just wanna create threads like this for the "thanks or whatever". The never ask for ETA rule seems to just float over their heads.
Now to some useful information. I believe, even if we patch the kernel enough for it to theoretically boot cm13, it probably won't, considering the outdated userspace blobs for the Mi Pad. Unless someone has the knowledge to take their tab apart and figure out how to get UART data, it will be virtually impossible for the mi pad kernel to boot any new version of Android. I heard another interesting approach taken by some russian devs at the Xiaomi forums. They've managed to port the kernel from the Nvidia shield (and apparently it's booting). Now this would mean we can use the userspace blobs from the Shield to at least get the ROM booting (most peripherals won't work, but that's step 2). I do not know whether they use GitHub or if they've even open-sourced their work, but now we know that it's possible, so that could be a possible method of approach.
EDIT: LOL. I just read the OP again. The "dev" expects donations to help him work harder. This from a person who posted his way into somehow compiling his first Android build without even having the damn device.
drakonizer said:
My my...it's been a while since I've seen a cringe-worthy dev thread on XDA. So OP just used the device tree from Nexus 9 (a 64-bit device with a different processor and nothing in common with the Mi Pad other than the fact that they use Nvidia SoCs and are both tablets), unmodified KITKAT kernel sources from Xiaomi (which takes work to make it boot, even on KK) and KITKAT userspace blobs to compile the ROM, and for some reason decided to share it without testing. The 10-post rule is meant to keep such people out of the development sub-forums, but obviously that's not working.
I do not understand why the moderators are allowing this thread to remain open. It's just a thread by a wannabe dev offering a non-bootable ROM that has the potential to brick the devices of many newbies who may decide to try this.
This thread is even more useless than the other "DEVS-ONLY" thread someone else made. Honestly, the entire Mi Pad forum is filled with people who either expect Android 7.1.1 to magically appear on their tabs just because Xiaomi released outdated kernel sources or just wanna create threads like this for the "thanks or whatever". The never ask for ETA rule seems to just float over their heads.
Now to some useful information. I believe, even if we patch the kernel enough for it to theoretically boot cm13, it probably won't, considering the outdated userspace blobs for the Mi Pad. Unless someone has the knowledge to take their tab apart and figure out how to get UART data, it will be virtually impossible for the mi pad kernel to boot any new version of Android. I heard another interesting approach taken by some russian devs at the Xiaomi forums. They've managed to port the kernel from the Nvidia shield (and apparently it's booting). Now this would mean we can use the userspace blobs from the Shield to at least get the ROM booting (most peripherals won't work, but that's step 2). I do not know whether they use GitHub or if they've even open-sourced their work, but now we know that it's possible, so that could be a possible method of approach.
EDIT: LOL. I just read the OP again. The "dev" expects donations to help him work harder. This from a person who posted his way into somehow compiling his first Android build without even having the damn device.
Click to expand...
Click to collapse
I agree, this device has no development threads. Only 2 give me thanks and here's my donation link threads.
They have indeed used GitHub, but I don't believe they want to share the repo just yet so I won't post it publicly. It has many problems to sort and also sadly, they didn't keep the commit history from Nvidia as it was initialised via zip DL. It does boot to recovery though.
Harrynowl said:
I agree, this device has no development threads. Only 2 give me thanks and here's my donation link threads.
They have indeed used GitHub, but I don't believe they want to share the repo just yet so I won't post it publicly. It has many problems to sort and also sadly, they didn't keep the commit history from Nvidia as it was initialised via zip DL. It does boot to recovery though.
Click to expand...
Click to collapse
Oh! I didn't realize we were talking about the same person/team. I'd love to start developing for this device. In fact, I'm working on KEXEC-hardboot and Multirom right now, but I'd like to follow what you guys are doing and contribute as much as I can. Is there an IRC channel/IM app you guys use for communication? If so, I'd appreciate it if you could PM the info.

difference between hardware binaries & kernel?

so what is the difference between hardware binaries & kernels?
i saw that the pixel hardware binaries are provided directly by google, & the kernel for the z2 play is on the motorola github
are the hardware binaries the same thing, or part of the kernel?
if not, where can I go to get the hardware binaries for the moto z2 play?
(new to development, but familiar w/ programming)
The "hardware binaries" are basically drivers that are part of the kernel. They should be included in the kernel source code of Motorola
The kernel itself it what manages interaction between software and hardware, so drivers are part of it, but the kernel is much more
Artim_96 said:
The "hardware binaries" are basically drivers that are part of the kernel. They should be included in the kernel source code of Motorola
The kernel itself it what manages interaction between software and hardware, so drivers are part of it, but the kernel is much more
Click to expand...
Click to collapse
awesome, thanks!
so would it be possible to build aosp from source (vanilla) with these binaries?
rivalDevYP said:
awesome, thanks!
so would it be possible to build aosp from source (vanilla) with these binaries?
Click to expand...
Click to collapse
Partially. But I doubt it's that easy
Artim_96 said:
Partially. But I doubt it's that easy
Click to expand...
Click to collapse
Other than the hardware binaries and a proper build environment
What else do you think I would need?
rivalDevYP said:
Other than the hardware binaries and a proper build environment
What else do you think I would need?
Click to expand...
Click to collapse
Look at the existing ROMs. If it would be that easy we would be running Pie for month. In theory those should be enough, but you still need a lot of work to get it right so it actually works

Categories

Resources