element14 Community
element14 Community
    Register Log In
  • Site
  • Search
  • Log In Register
  • Community Hub
    Community Hub
    • What's New on element14
    • Feedback and Support
    • Benefits of Membership
    • Personal Blogs
    • Members Area
    • Achievement Levels
  • Learn
    Learn
    • Ask an Expert
    • eBooks
    • element14 presents
    • Learning Center
    • Tech Spotlight
    • STEM Academy
    • Webinars, Training and Events
    • Learning Groups
  • Technologies
    Technologies
    • 3D Printing
    • FPGA
    • Industrial Automation
    • Internet of Things
    • Power & Energy
    • Sensors
    • Technology Groups
  • Challenges & Projects
    Challenges & Projects
    • Design Challenges
    • element14 presents Projects
    • Project14
    • Arduino Projects
    • Raspberry Pi Projects
    • Project Groups
  • Products
    Products
    • Arduino
    • Avnet & Tria Boards Community
    • Dev Tools
    • Manufacturers
    • Multicomp Pro
    • Product Groups
    • Raspberry Pi
    • RoadTests & Reviews
  • About Us
  • Store
    Store
    • Visit Your Store
    • Choose another store...
      • Europe
      •  Austria (German)
      •  Belgium (Dutch, French)
      •  Bulgaria (Bulgarian)
      •  Czech Republic (Czech)
      •  Denmark (Danish)
      •  Estonia (Estonian)
      •  Finland (Finnish)
      •  France (French)
      •  Germany (German)
      •  Hungary (Hungarian)
      •  Ireland
      •  Israel
      •  Italy (Italian)
      •  Latvia (Latvian)
      •  
      •  Lithuania (Lithuanian)
      •  Netherlands (Dutch)
      •  Norway (Norwegian)
      •  Poland (Polish)
      •  Portugal (Portuguese)
      •  Romania (Romanian)
      •  Russia (Russian)
      •  Slovakia (Slovak)
      •  Slovenia (Slovenian)
      •  Spain (Spanish)
      •  Sweden (Swedish)
      •  Switzerland(German, French)
      •  Turkey (Turkish)
      •  United Kingdom
      • Asia Pacific
      •  Australia
      •  China
      •  Hong Kong
      •  India
      •  Korea (Korean)
      •  Malaysia
      •  New Zealand
      •  Philippines
      •  Singapore
      •  Taiwan
      •  Thailand (Thai)
      • Americas
      •  Brazil (Portuguese)
      •  Canada
      •  Mexico (Spanish)
      •  United States
      Can't find the country/region you're looking for? Visit our export site or find a local distributor.
  • Translate
  • Profile
  • Settings
Single-Board Computers
  • Products
  • Dev Tools
  • Single-Board Computers
  • More
  • Cancel
Single-Board Computers
Forum [How-to] BB-View on latest Debian
  • Blog
  • Forum
  • Documents
  • Files
  • Members
  • Mentions
  • Sub-Groups
  • Tags
  • More
  • Cancel
  • New
Join Single-Board Computers to participate - click to join for free!
Actions
  • Share
  • More
  • Cancel
Forum Thread Details
  • Replies 142 replies
  • Subscribers 64 subscribers
  • Views 23832 views
  • Users 0 members are here
  • debian
  • embedded_linux
  • bb-view
  • bbb
Related

[How-to] BB-View on latest Debian

compeoree
compeoree over 11 years ago

I thought some others might like to know how to get the BB-View working under the latest Debian beta images.

 

Unfortunately, you are going to have to recompile the Kernel. The video works fine without a recompile (the red/blue swap is easy to fix), but the touchscreen control connections are not the same as the standard TI 4-wire interface. I tried to patch the ti_am335x_tsc.c file, so the changes would be limited to a dts recompile, but I haven't been able to get that working yet (I'm pretty sure it is a state machine / bit assignment issue). But anyway, here are the steps that you need to perform.....

 

Overview

1) Download the necessary files

     a) Robert Nelson's handy tools for compiling the Beaglebone kernel

     b) BB-View source for Angstrom

2) Build the default kernel

3) Patch the Kernel and perform a fast recompile

4) Copy the new kernel to the Beaglebone

5) Edit the xorg.conf file to correct the Red/Blue color swap

6) Revel in the 4 days you just saved image

 

Let's Get Started

I am using Ubuntu 12.04 LTS 64 bit running in a VirtualBox VM to compile the kernel:

Make a new folder called bb-view, this is where our build will happen.

> mkdir bb-view

> cd bb-view

 

Install git, if you haven't already:

> apt-get install git

 

Clone Robert Nelson's linux-dev project locally. Be prepared for a large download (~100 Mb for the cross-compiler and ~700 Mb for the kernel source).

> git clone https://github.com/RobertCNelson/linux-dev.git

 

Change into the new linux-dev folder and select branch/tag that matches the Debian version.

> cd linux-dev

> git checkout 3.8.13-bone37 -b tmp

 

Now we need to build the base image, so our cape drivers folder gets populated. The script will tell you if you need to do or install anything else.

> ./build_kernel.sh

 

Come back in an hour or so.....(You might want to download the Angstrom source from element14 now)

 

Patching the Kernel

Extract two files from the Angstrom source:

> unzip angstrom-source.zip

> tar -zxf bb-black-kernel-3.8.13-bb-view.tar.bz2

> cp ./kernel/kernel/drivers/input/touchscreen/ti_am335x_tsc.c  ~/bb-view/linux-dev/KERNEL/drivers/input/touchscreen/

> cp ./kernel/kernel/firmware/capes/BB-VIEW-LCD7-01-00A0.dts  ~/bb-view/linux-dev/KERNEL/firmware/capes/

 

Now we need to let the compiler know that we want to add the firmware to the build:

> nano   ~/bb-view/linux-dev/KERNEL/firmware/Makefile

 

Add the following line somewhere near line 192 (CTRL-C will display current cursor position):

BB-VIEW-LCD7-01-00A0.dtbo \

 

Don't forget the trailing backslash....it is important. Now save and exit by doing CTRL-O, Enter, CTRL-X.

Change back to the linux-dev root folder:

> cd   ~/bb-view/linux-dev

 

Now issue the kernel rebuild command, this won't take very long at all:

> ./tools/rebuild.sh

 

 

Copy Kernel to BBB

The following instructions assume that you already have the Debian beta installed and booted up on the BBB.

The easiest way is to copy the files over the network, via the 'scp' command:

> scp   ~/bb-view/linux-dev/deploy/3.8.13-bone37.zImage   debian@192.168.7.2:/home/debian

Replace debian (both instances) with the username you are running on the BBB and 192.168.7.2 with the IP address of the BBB.

 

Now log into the BBB and copy the kernel image to the boot partition:

> ssh debian@192.168.7.2

bbb>  sudo cp 3.8.13-bone37.zImage   /boot/uboot/zImage

 

We need to do one more thing before the LCD will work. Since the cape doesn't have an EEPROM, we need to black-list the HDMI drivers and force-load the BB-VIEW drivers in the boot command file:

bbb>  sudo  nano  /boot/uboot/uEnv.txt

 

Find the "optargs" line and edit it to be:

optargs=capemgr.disable_partno=BB-BONELT-HDMI,BB-BONELT-HDMIN  capemgr.enable_partno=BB-VIEW-LCD7-01

Notice that the preceding "#" has been removed. You don't want to disable BB-BONE-EMMC-2G, or you won't be able to boot from eMMC.

Now save and exit by doing CTRL-O, Enter, CTRL-X.

 

Reboot the BBB and the LCD should now work....except the blue and red are reversed.

 

Fixing Red/Blue Color Swap

This is due to errata in the TI AM335x processor when switching between 16 and 24 bit video modes. To fix this, we must first find the name of our screen:

> ssh debian@192.168.7.2

bbb> cat  /var/log/Xorg.0.log  |  grep  screen

Mine was "Builtin Default fbdev Screen 0"

 

Now we edit our X configuration file:

bbb> sudo nano  /usr/share/X11/xorg.conf.d/10-evdev.conf

 

and add a "Screen" section at the end of the file:

Section "Screen"

        Identifier "Builtin Default fbdev Screen 0"

        Monitor "Configured Monitor"

        Device "Configured Video Device"

        DefaultDepth 24

EndSection

Save and exit by doing CTRL-O, Enter, CTRL-X.

Reboot and enjoy!

  • Sign in to reply
  • Cancel

Top Replies

  • Former Member
    Former Member over 11 years ago in reply to Former Member +1
    Hello selsinork, "Which kernel version are you using ?" I use the 3.8. "Did you apply the patch Louis posted ?" I rebuild the kernel with Louis' edits in the "4. Re:[How-to] BB-View on latest Debian" message…
  • Former Member
    Former Member over 11 years ago in reply to Former Member +1
    Ok, so with the overlay loaded then the touch screen driver should be able to work. You can check the proper device using 'evtest' like this: root@lcd:~/evtest# ./evtest No device specified, trying to…
  • Former Member
    Former Member over 11 years ago in reply to Former Member +1
    Interesting. I seem to remember that one of the LEDs on the cape was configured as heartbeat. Perhaps that was the TI-SDK image then as looking at the overlay files I see: gpio-leds-cape-lcd { compatible…
Parents
  • Former Member
    Former Member over 11 years ago

    Regarding Patching the Kernel:

     

    My "touchscreen" is in your linux-dev repository, but not in the angstrom source.  Should we do the cp FROM your linux-dev repository TO the ANGSTROM source?

    I pulled the source directly from the Element 14 site, and the file (unzipped) was:  bb-black-kernel-3.8.13-bb-view.tar.bz2.  It doesn't seem to have these files.  If your source already has them, why are we rebuilding the Kernel?

     

    Also, with the addition of the LCD line to the Makefile, can you id where it needs to go (functionally), rather than just mentioning a line numbers, so I know I have this right?

     

    Thanks.

    > unzip angstrom-source.zip

    > tar -zxf bb-black-kernel-3.8.13-bb-view.tar.bz2

    > cp ./kernel/kernel/drivers/input/touchscreen/ti_am335x_tsc.c  ~/bb-view/linux-dev/KERNEL/drivers/input/touchscreen/

    > cp ./kernel/kernel/firmware/capes/BB-VIEW-LCD7-01-00A0.dts  ~/bb-view/linux-dev/KERNEL/firmware/capes/

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Cancel
  • compeoree
    compeoree over 11 years ago in reply to Former Member

    @Matthew Trippy

    Is the rest of the Angstrom source visible? Are the other source folders present and populated?

     

    The reason for copying the angstrom tsc file to the linux-dev was to get most of the changes copied over to the Debian build under linux-dev. You are not building Angstrom, so you don't need to copy from the linux-dev folder back to the Angstrom folder.

     

    The reason for compiling the kernel is to enable touchscreen support. If you don't need the touch screen controller, you don't have to recompile. The LCD7 uses a non-standard connection method, so the analog pins have to be read in a different order, by the tsc driver.

     

    The makefile line placement is not critical. I just included it close to where the other dts files where getting added, so I could find it again if I needed to change anything.

     

    Louis

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Cancel
  • Former Member
    Former Member over 11 years ago in reply to Former Member

    Yep, Robert has put some work into building static devicetree files for the 3.13+ stuff he's been working on.

     

    Taking a step back and looking at other similar SBCs like the OLinuXino or Sabre-Lite or Wandboard, none of them use capemgr. They all go with the same static devicetree method.  I wouldn't class it as a pain, it's just different. Thing is that it just works, and unless you're hot-plugging capes the inconvenience is small.

     

    I don't know what the problem was, but hot-plugging usb devices on the 3.8.x kernels required having a usb hub connected to the BBB. Anything plugged in directly would only be detected at boot. That one is a known problem and had been there since the BBB was released.  Given nobody has managed to fix it in the last year probably means it's not going to get fixed - at least for 3.8.x

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Cancel
  • Former Member
    Former Member over 11 years ago in reply to Former Member

    So what does capemgr do? It basically maintains a list of what capes are available based on EEPROM signatures. It probably does too much, which is likely why kernel maintainers won't include it in the 3.14/15 codebase (if my reading of 20+ kernel dev history is accurate.) In the short term, however, it looks like I'll have to stick with the 3.8.13 variant (<sigh!>)

     

    I haven't seen any activity related to BBW/BBB/BBxm cape activity in the newer kernels, but here's what I'd likely propose so that the cape device management fits into the overall static device tree strategy:

     

    (a) Refactor capemgr into a library for probing device signatures.

    (b) Add the necessary driver code for the BB View LCDs, along with their device trees (BTW: the format has really changed for DTS structure.)

     

    The upside of this approach is that the end user can choose which capes are compiled into the kernel or shipped as modules. Another upside of the module approach is that modules can be selectively disabled, which eliminates the magic enable_cape and disable_cape kernel cmdline strings.

     

    One thing I did notice in the current set of device tree files is that the HDMI framebuffer is integral to the BBB device tree. I'm not sure if there's any harm in having two frame buffer devices in the kernel, but would lead to obvious confusion in the end user's X11 configuration. It doesn't look like the HDMI device is actually disabled; it's just not part of the device tree interrogated by X11, so it's never found.

     

    But I'd hate to duplicate effort, so if there is an existing effort/project, I'd really like to get in touch with them. Robert isn't particularly responsive, for obvious reasons.

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Cancel
  • Former Member
    Former Member over 11 years ago in reply to Former Member

    To be more specific:

    • Refactor capemgr into an EEPROM probing-only library. Could cache results, if desired.
    • Driver for BB View 7", 4.3" LCDs, using libcapemgr probes for its EEPROM signature. If found, continue to populate the appropriate device tree, otherwise, abort module/driver loading.

    Basically splits the driver loading into two conceptually distinct phases, which capemgr currently does in one step. I suspect that other cape device drivers would have similar code, which is probably what capemgr was attempting to avoid in the first place. However, it's not generally in line with Linux kernel evolution -- there's a preference for a module-driven elegance that Robert, et. al., look like they're moving toward, even if it results in templated code (but configurable via *config.)

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Cancel
  • Former Member
    Former Member over 11 years ago in reply to Former Member

    panto is the original developer, and it looks like he's trying again here

    http://thread.gmane.org/gmane.linux.drivers.devicetree/68674

    That was three weeks ago and not a single reply. Usually he gets some interest from at least FPGA people who also like the idea.  You can search the archives, he's proposed variations on the idea several times, usually about a year inbetween tries and the discussion seems to die off quickly even when not outright rejected.

     

    Last time I looked (before the attempt in the above link) he was proposing a very simple thing that just allowed loading the overlay, much like loading modules today, and letting userspace do the hard work of identifying what to load, resolving conflicts etc.

    It's worth reading through the discussions on his previous attempts if you're at all interested in this stuff, there are some good reasons why it's never been accepted.  Yet it's still unclear to me why the idea always seems to get dropped instead of working through the concerns.

     

    The problem you have with things like the BB-View is that they have no eeprom, so your libcapemgr idea can't probe for it.  Unfortunately it's an inherent weakness in the the design - there's no absolute requirement to have an eeprom, unlike something like pci or usb where you have to follow the spec.

    Displays are also problematic as you probably want them initialised early, a slow boot with a blank screen because you have to wait for userspace to configure the display won't be acceptable for many.

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Cancel
  • Former Member
    Former Member over 11 years ago in reply to Former Member

    Scott Michel wrote:

     

    One thing I did notice in the current set of device tree files is that the HDMI framebuffer is integral to the BBB device tree. I'm not sure if there's any harm in having two frame buffer devices in the kernel, but would lead to obvious confusion in the end user's X11 configuration. It doesn't look like the HDMI device is actually disabled; it's just not part of the device tree interrogated by X11, so it's never found.

    I didn't look in detail, but I assume that what happens is the status property for the node is changed from 'okay' to 'disabled'. When that's done the whole section in the tree should be ignored.

    There's no generic problem in having more than one display device enabled. The problem for the BBB is that both the HDMI framer and LCD capes use the same set of pins on the SoC which makes it impossible to use both HDMI and LCD at the same time.  Other boards don't have that particular limitation.

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Cancel
  • Former Member
    Former Member over 11 years ago in reply to Former Member

    Isn't gpmc_a4 the same as gpio2_10 in mode 1? I'm looking at page 83 of the BBB-SRM.pdf manual.

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Cancel
  • Former Member
    Former Member over 11 years ago in reply to Former Member
    Isn't gpmc_a4 the same as gpio2_10 in mode 1? I'm looking at page 83 of the BBB-SRM.pdf manual.

    No, you're mistaking the logical function with the physical pin. The physical pin name for P8.41 is LCD_DATA4

    The tables in the SRM are mostly useless as they omit the important information.

     

    You're looking at this line from the BBB_SRM

    Fullscreen contentimage_180247.html Download
    <html><head><title>Jive SBS</title></head>
    <body><font face="arial,helvetica,sans-serif">
    <b>Error</b><br><font size="-1">
    An general error occurred while processing your request.
    </font></font></body></html>
    

    The important part is the T1 in the second column which refers the the physical ball on the BGA package

     

    Look in the AM3359 datasheet and you'll see this on page 31

    Fullscreen contentimage_180248.html Download
    <html><head><title>Jive SBS</title></head>
    <body><font face="arial,helvetica,sans-serif">
    <b>Error</b><br><font size="-1">
    An general error occurred while processing your request.
    </font></font></body></html>
    

     

    Then in AM335x Technical reference manual on page 759 you'll find

    image

    The 8B0h refers to the offset from the base address of the control module which you'll find on p158

    image

     

    Which gives you a pinmux address of 44e108b0,

     

    You pasted the boot log where it says

    [   11.352494] pinctrl-single 44e10800.pinmux: pin 44e10850 already requested by rstctl.4; cannot claim for panel.14

    so, different address means different physical pins.

     

    Your 44e10850 is

    image

    on p758 of the TRM.  Go back to the datasheet and look for the 'Pin Name' GPMC_A4

    image

     

    Note the ball number of R14 this time

     

    In the BBB_SCH.pdf, you'll find it on page 3

    Fullscreen contentimage_180253.html Download
    <html><head><title>Jive SBS</title></head>
    <body><font face="arial,helvetica,sans-serif">
    <b>Error</b><br><font size="-1">
    An general error occurred while processing your request.
    </font></font></body></html>
    

     

    It's the one connected to that inverter which then goes to eMMC_RSTn,  follow it through the schematic and you'll find that's the only thing it's connected to.

     

    So, going back to the message from your log

    [   11.352494] pinctrl-single 44e10800.pinmux: pin 44e10850 already requested by rstctl.4; cannot claim for panel.14

    So we have a pin that's used to reset the emmc being claimed by the rstctl (or reset control) driver.  That seems to make a lot of sense.

     

    As the pin doesn't connect to the expansion headers at all, it makes no sense whatsoever that it would conflict with a cape overlay that can't physically connect to the pin.  So that leads to the thought that there's either something wrong with the overlay you're using, or there's something wrong with how capemgr is attempting to merge the overlay into the base devicetree.

     

    Ok, hope that explains how I got from A to B...  If you're head's spinning trying to follow it, I absolutely understand.. The information being split across three documents makes finding exactly what's going on difficult at best.

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Cancel
  • Former Member
    Former Member over 11 years ago in reply to Former Member

    I should probably have mentioned.  The BBB_SRM falls into a common trap of giving P8.41 a 'vanity name' of gpio2_10 when the SoC datasheet and schematics refer to the actual physical pin differently.

    The Raspberry Pi did it too and caused a pile of confusion by naming GPIO10 on the SoC GPIO8 on the expansion connector (I forget the actual mapping).

     

    There's no point to doing this, as we've seen you can configure the pin in software to be many different things, so it's better to just use the correct names from the SoC datasheet. That's what Linux will use since the same SoC could be in multiple different boards  where the pin gets used differently.

     

    So my advice is to ignore the SRM, use the schematics and the SoC datasheet and TRM directly.

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Cancel
  • Former Member
    Former Member over 11 years ago in reply to Former Member

    I finally got the 7" LCD to work on 3.8.13-bone47, without the LEDs or the buttons enabled in the device tree. Still working on debugging those. How's the best way to send updated instructions and patches to files under KERNEL?

     

    Upside: More patches from Robert Nelson that enables better networking, USB.

    Downside: Cape LEDs and buttons are temporarily disabled, must reinstall the kernel modules.

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Cancel
  • Former Member
    Former Member over 11 years ago in reply to Former Member

    And I've made further progress: Keys work and LED 1 works. LED 2 still has a conflict with i2c:

     

    [1.804951] pinctrl-single 44e10800.pinmux: pin 44e10978 already requested by 4819c000.i2c; cannot claim for gpio-leds-cape-lcd.12

     

    But that looks like it's possibly a conflict in device tree source.

     

    What appears to have been missing in the BB-VIEW-LCD7-01-00A1.dts source:

     

    --- ../bb-view-kernel/kernel/firmware/capes/BB-VIEW-LCD7-01-00A0.dts2014-04-18 11:49:33.949312435 -0700
    +++ KERNEL/firmware/capes/BB-VIEW-LCD7-01-00A0.dts  2014-05-06 15:40:11.938020976 -0700

    @@ -6,7 +6,7 @@

      * published by the Free Software Foundation.

      */

    /dts-v1/;

    -/* /plugin/; */

    +/plugin/;

     

    / {

        compatible = "ti,beaglebone", "ti,beaglebone-black";

    @@ -273,6 +273,7 @@

                                    interrupt-parent = <&intc>;

                                    interrupts = <36>;

                                    ti,hwmods = "lcdc";

    +                               ti,power-gpio = <&gpio1 2 0x0>;

                            };

     

                    };

     

    Not sure why the /plugin/ is significant, but without it, no joy. The "ti,power-gpio" is also necessary. Also, blue/red swap still happens and you can't use the default depth hack to xorg.conf.

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Cancel
Reply
  • Former Member
    Former Member over 11 years ago in reply to Former Member

    And I've made further progress: Keys work and LED 1 works. LED 2 still has a conflict with i2c:

     

    [1.804951] pinctrl-single 44e10800.pinmux: pin 44e10978 already requested by 4819c000.i2c; cannot claim for gpio-leds-cape-lcd.12

     

    But that looks like it's possibly a conflict in device tree source.

     

    What appears to have been missing in the BB-VIEW-LCD7-01-00A1.dts source:

     

    --- ../bb-view-kernel/kernel/firmware/capes/BB-VIEW-LCD7-01-00A0.dts2014-04-18 11:49:33.949312435 -0700
    +++ KERNEL/firmware/capes/BB-VIEW-LCD7-01-00A0.dts  2014-05-06 15:40:11.938020976 -0700

    @@ -6,7 +6,7 @@

      * published by the Free Software Foundation.

      */

    /dts-v1/;

    -/* /plugin/; */

    +/plugin/;

     

    / {

        compatible = "ti,beaglebone", "ti,beaglebone-black";

    @@ -273,6 +273,7 @@

                                    interrupt-parent = <&intc>;

                                    interrupts = <36>;

                                    ti,hwmods = "lcdc";

    +                               ti,power-gpio = <&gpio1 2 0x0>;

                            };

     

                    };

     

    Not sure why the /plugin/ is significant, but without it, no joy. The "ti,power-gpio" is also necessary. Also, blue/red swap still happens and you can't use the default depth hack to xorg.conf.

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Cancel
Children
No Data
element14 Community

element14 is the first online community specifically for engineers. Connect with your peers and get expert answers to your questions.

  • Members
  • Learn
  • Technologies
  • Challenges & Projects
  • Products
  • Store
  • About Us
  • Feedback & Support
  • FAQs
  • Terms of Use
  • Privacy Policy
  • Legal and Copyright Notices
  • Sitemap
  • Cookies

An Avnet Company © 2025 Premier Farnell Limited. All Rights Reserved.

Premier Farnell Ltd, registered in England and Wales (no 00876412), registered office: Farnell House, Forge Lane, Leeds LS12 2NE.

ICP 备案号 10220084.

Follow element14

  • X
  • Facebook
  • linkedin
  • YouTube