Merge pull request #8 from OpenIPC/dev

Dev
pull/16/head
Igor Zalatov 2021-04-19 21:12:54 +03:00 committed by GitHub
commit 00689a5eea
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 695 additions and 5 deletions

View File

@ -0,0 +1,129 @@
name: OpenIPC for SSC335
on:
push:
branches:
- ssc335
tags:
- "v*"
jobs:
build_core:
name: OpenIPC v2.0 for SSC335
runs-on: ubuntu-18.04
steps:
- name: Checkout
id: checkout
uses: actions/checkout@v2
- name: Install build dependencies
id: install
run: |
make install-deps
mkdir -p tmp
- name: Free disk space
id: freshing
run: |
sudo swapoff -a
sudo rm -f /swapfile
sudo apt clean
docker rmi $(docker image ls -aq)
df -h
- name: Prepare buildroot
id: prepare
run: |
HEAD_TAG=$(git tag --points-at HEAD)
GIT_HASH=$(git rev-parse --short $GITHUB_SHA)
BRANCH_NAME=$(echo $GITHUB_REF | cut -d'/' -f 3)
if [ -z "$HEAD_TAG" ]; then
TAG_NAME="latest"
RELEASE_NAME="Development Build"
PRERELEASE=true
else
TAG_NAME=${{ github.ref }}
RELEASE_NAME="Release ${{ github.ref }}"
PRERELEASE=false
fi
echo "GIT_HASH=$GIT_HASH" >> $GITHUB_ENV
echo "TAG_NAME=$TAG_NAME" >> $GITHUB_ENV
echo "RELEASE_NAME=$RELEASE_NAME" >> $GITHUB_ENV
echo "PRERELEASE=$PRERELEASE" >> $GITHUB_ENV
echo "BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_ENV
cd $GITHUB_WORKSPACE
make prepare
- name: Build SSC335 firmware
id: build-ssc335-firmware
continue-on-error: true
run: |
ARCHIVE_FW="${GITHUB_WORKSPACE}/output/images/openipc.ssc335-br.tgz"
echo "ARCHIVE_FW=$ARCHIVE_FW" >> $GITHUB_ENV
cd $GITHUB_WORKSPACE
make BOARD=unknown_unknown_ssc335_openipc all
tar -C ${GITHUB_WORKSPACE}/output/images -cvzf $ARCHIVE_FW rootfs.squashfs uImage
- name: Build SSC335 SDK
id: build-ssc335-sdk
continue-on-error: true
run: |
ARCHIVE_SDK="${GITHUB_WORKSPACE}/output/images/arm-openipc-linux-musleabi_sdk-buildroot.tar.gz"
echo "ARCHIVE_SDK=$ARCHIVE_SDK" >> $GITHUB_ENV
cd $GITHUB_WORKSPACE/output
make sdk
- name: Send warning message to telegram channel
env:
TG_TOKEN: ${{ secrets.TELEGRAM_TOKEN_BOT_OPENIPC }}
TG_CHANNEL: ${{ secrets.TELEGRAM_CHANNEL_OPENIPC_DEV }}
if: steps.build-ssc335-firmware.outcome != 'success' || steps.build-ssc335-sdk.outcome != 'success'
run: |
TG_OPTIONS="-s --connect-timeout 5 --max-time 15"
TG_NOTIFY="Warning, Buildroot compiling error..."
TG_HEADER=$(echo -e "\r\n$TG_NOTIFY \r\n\r\nCommit: $GIT_HASH \r\nBranch: $BRANCH_NAME \r\nTag: $TAG_NAME \r\n\r\n\xE2\x9A\xA0 GitHub Actions")
curl $TG_OPTIONS -H "Content-Type: multipart/form-data" -X POST https://api.telegram.org/bot$TG_TOKEN/sendMessage \
-F chat_id=$TG_CHANNEL -F text="$TG_HEADER"
- name: Create release
uses: actions/create-release@v1
continue-on-error: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ env.TAG_NAME }}
release_name: ${{ env.RELEASE_NAME }}
draft: false
prerelease: ${{ env.PRERELEASE }}
- name: Upload FW to release
uses: svenstaro/upload-release-action@v2
continue-on-error: true
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: ${{ env.ARCHIVE_FW }}
asset_name: "openipc.ssc335-br.tgz"
tag: ${{ env.TAG_NAME }}
overwrite: true
- name: Upload SDK to release
uses: svenstaro/upload-release-action@v2
continue-on-error: true
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: ${{ env.ARCHIVE_SDK }}
asset_name: "arm-openipc-ssc335-linux-musleabi_sdk-buildroot.tar.gz"
tag: ${{ env.TAG_NAME }}
overwrite: true
- name: Send binary file to telegram channel
env:
TG_TOKEN: ${{ secrets.TELEGRAM_TOKEN_BOT_OPENIPC }}
TG_CHANNEL: ${{ secrets.TELEGRAM_CHANNEL_OPENIPC_DEV }}
run: |
TG_OPTIONS="-s --connect-timeout 5 --max-time 15"
TG_HEADER=$(echo -e "\r\nCommit: $GIT_HASH \r\nBranch: $BRANCH_NAME \r\nTag: $TAG_NAME \r\n\r\n\xE2\x9C\x85 GitHub Actions")
curl $TG_OPTIONS -H "Content-Type: multipart/form-data" -X POST https://api.telegram.org/bot$TG_TOKEN/sendDocument \
-F chat_id=$TG_CHANNEL -F document="@$ARCHIVE_FW" -F caption="$TG_HEADER"

View File

@ -9,11 +9,13 @@
### Downloads (for research only, no any guarantees)
| Building status | SoC | Files | Maintainers |
|-----------------|-----------|----------|-------------|
|![Image](https://github.com/OpenIPC/openipc-2.1/actions/workflows/hi3516ev200_images.yml/badge.svg)|Hi3516Ev200|[uImage + rootfs.squashfs](https://github.com/OpenIPC/openipc-2.1/releases/download/latest/openipc.hi3516ev200-br.tgz)|[zigfisher](https://github.com/ZigFisher), [widgetii](https://github.com/widgetii)|
|![Image](https://github.com/OpenIPC/openipc-2.1/actions/workflows/hi3516ev300_images.yml/badge.svg)|Hi3516Ev300|[uImage + rootfs.squashfs](https://github.com/OpenIPC/openipc-2.1/releases/download/latest/openipc.hi3516ev300-br.tgz)|[zigfisher](https://github.com/ZigFisher), [widgetii](https://github.com/widgetii)|
|![Image](https://github.com/OpenIPC/openipc-2.1/actions/workflows/hi3518ev300_images.yml/badge.svg)|Hi3518Ev300|[uImage + rootfs.squashfs](https://github.com/OpenIPC/openipc-2.1/releases/download/latest/openipc.hi3518ev300-br.tgz)|[zigfisher](https://github.com/ZigFisher), [widgetii](https://github.com/widgetii)|
| Building status | SoC | Files | Maintainers | Notes |
|-----------------|-----------|----------|-------------|-------|
|![Image](https://github.com/OpenIPC/openipc-2.1/actions/workflows/hi3516ev200_images.yml/badge.svg)|Hi3516Ev200|[uImage + rootfs.squashfs](https://github.com/OpenIPC/openipc-2.1/releases/download/latest/openipc.hi3516ev200-br.tgz)|[zigfisher](https://github.com/ZigFisher), [widgetii](https://github.com/widgetii)| OK |
|![Image](https://github.com/OpenIPC/openipc-2.1/actions/workflows/hi3516ev300_images.yml/badge.svg)|Hi3516Ev300|[uImage + rootfs.squashfs](https://github.com/OpenIPC/openipc-2.1/releases/download/latest/openipc.hi3516ev300-br.tgz)|[zigfisher](https://github.com/ZigFisher), [widgetii](https://github.com/widgetii)| OK |
|![Image](https://github.com/OpenIPC/openipc-2.1/actions/workflows/hi3518ev300_images.yml/badge.svg)|Hi3518Ev300|[uImage + rootfs.squashfs](https://github.com/OpenIPC/openipc-2.1/releases/download/latest/openipc.hi3518ev300-br.tgz)|[zigfisher](https://github.com/ZigFisher), [widgetii](https://github.com/widgetii)| OK |
|![Image](https://github.com/OpenIPC/openipc-2.1/actions/workflows/ssc335_images.yml/badge.svg)|SSC335|[-](https://github.com/OpenIPC/openipc-2.1/releases/download/latest/openipc.ssc335-br.tgz)|[zigfisher](https://github.com/ZigFisher)|in progress|
|![Image](https://github.com/OpenIPC/openipc-2.1/actions/workflows/xm530_images.yml/badge.svg)|XM530|[uImage + rootfs.squashfs](https://github.com/OpenIPC/openipc-2.1/releases/download/latest/openipc.xm530-br.tgz)|[zigfisher](https://github.com/ZigFisher)|no video |
### Supporting

View File

@ -1,5 +1,6 @@
source "$BR2_EXTERNAL_HISILICON_PATH/linux/Config.ext.in"
source "$BR2_EXTERNAL_HISILICON_PATH/package/hisi_patcher/Config.in"
source "$BR2_EXTERNAL_HISILICON_PATH/package/hisi_gpio_scanner/Config.in"
source "$BR2_EXTERNAL_HISILICON_PATH/package/hisilicon-osdrv4/Config.in"
source "$BR2_EXTERNAL_HISILICON_PATH/package/fwprintenv-ng/Config.in"
source "$BR2_EXTERNAL_HISILICON_PATH/package/ipctool/Config.in"

View File

@ -46,6 +46,7 @@ BR2_GLOBAL_PATCH_DIR="$(TOPDIR)/../general/package/patches"
BR2_PACKAGE_BUSYBOX_CONFIG="$(TOPDIR)/../general/package/configs/busybox.config"
BR2_PACKAGE_DROPBEAR=y
BR2_PACKAGE_FWPRINTENV_NG=y
BR2_PACKAGE_HISI_GPIO_SCANNER=y
BR2_PACKAGE_HISILICON_OSDRV4=y
BR2_PACKAGE_IPCTOOL=y
BR2_PACKAGE_JSON_C=y

View File

@ -46,6 +46,7 @@ BR2_GLOBAL_PATCH_DIR="$(TOPDIR)/../general/package/patches"
BR2_PACKAGE_BUSYBOX_CONFIG="$(TOPDIR)/../general/package/configs/busybox.config"
BR2_PACKAGE_DROPBEAR=y
BR2_PACKAGE_FWPRINTENV_NG=y
BR2_PACKAGE_HISI_GPIO_SCANNER=y
BR2_PACKAGE_HISILICON_OSDRV4=y
BR2_PACKAGE_IPCTOOL=y
BR2_PACKAGE_JSON_C=y

View File

@ -46,6 +46,7 @@ BR2_GLOBAL_PATCH_DIR="$(TOPDIR)/../general/package/patches"
BR2_PACKAGE_BUSYBOX_CONFIG="$(TOPDIR)/../general/package/configs/busybox.config"
BR2_PACKAGE_DROPBEAR=y
BR2_PACKAGE_FWPRINTENV_NG=y
BR2_PACKAGE_HISI_GPIO_SCANNER=y
BR2_PACKAGE_HISILICON_OSDRV4=y
BR2_PACKAGE_IPCTOOL=y
BR2_PACKAGE_JSON_C=y

View File

@ -1,6 +1,7 @@
include $(BR2_EXTERNAL_HISILICON_PATH)/linux/linux-ext-hisi_patcher.mk
include $(BR2_EXTERNAL_HISILICON_PATH)/package/hisi_patcher/hisi_patcher.mk
include $(BR2_EXTERNAL_HISILICON_PATH)/package/fwprintenv-ng/fwprintenv-ng.mk
include $(BR2_EXTERNAL_HISILICON_PATH)/package/hisi_gpio_scanner/hisi_gpio_scanner.mk
include $(BR2_EXTERNAL_HISILICON_PATH)/package/hisilicon-osdrv4/hisilicon-osdrv4.mk
include $(BR2_EXTERNAL_HISILICON_PATH)/package/ipctool/ipctool.mk
include $(BR2_EXTERNAL_HISILICON_PATH)/package/libevent-mini/libevent-mini.mk

View File

@ -0,0 +1,6 @@
config BR2_PACKAGE_HISI_GPIO_SCANNER
bool "hisi_gpio_scanner"
help
Utility for diagnosing and displaying GPIO statuses
https://openipc.org

View File

@ -0,0 +1,22 @@
################################################################################
#
# hisi_gpio_scanner
#
################################################################################
HISI_GPIO_SCANNER_LICENSE = MIT
HISI_GPIO_SCANNER_LICENSE_FILES = LICENSE
define HISI_GPIO_SCANNER_EXTRACT_CMDS
cp $(BR2_EXTERNAL_HISILICON_PATH)/package/hisi_gpio_scanner/src/hisi_gpio_scanner.c $(@D)/
endef
define HISI_GPIO_SCANNER_BUILD_CMDS
(cd $(@D); $(TARGET_CC) -Os -s hisi_gpio_scanner.c -o hisi_gpio_scanner)
endef
define HISI_GPIO_SCANNER_INSTALL_TARGET_CMDS
install -m 0755 -D $(@D)/hisi_gpio_scanner $(TARGET_DIR)/usr/bin/hisi_gpio_scanner
endef
$(eval $(generic-package))

View File

@ -0,0 +1,523 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <fcntl.h>
#include <setjmp.h>
#include <signal.h>
#include <sys/mman.h>
#define DEFAULT_MD_LEN 128
#define PAGE_SIZE 0x1000
#define PAGE_SIZE_MASK (~(0xfff))
typedef struct tag_MMAP_Node
{
unsigned long Start_P;
unsigned long Start_V;
unsigned long length;
unsigned long refcount;
struct tag_MMAP_Node * next;
}TMMAP_Node_t;
TMMAP_Node_t * pTMMAPNode = NULL;
int fd = -1;
const char dev[]="/dev/mem";
jmp_buf *sigbus_jmp; // global
//************************************************************
void print_bin(unsigned long data)
{
int i;
unsigned long ulbit;
for (i = 7; i >= 0; i--)
{
ulbit = data >> i;
if (ulbit & 1) printf("1"); else printf("0");
}
}
//************************************************************
void signal_handler (int sig)
{
if (sig == SIGBUS)
{
//printf("signal_handler SIGBUS!\n");
if(sigbus_jmp) siglongjmp(*sigbus_jmp, 1);
// no one to catch the error, so abort
abort();
}
}
//************************************************************
int set_handler()
{
struct sigaction act;
memset (&act, 0, sizeof(act));
act.sa_sigaction = (void *)signal_handler;
act.sa_flags = SA_SIGINFO;
if (sigaction(SIGBUS, &act, 0))
{
perror ("sigaction");
return -1;
}
return 0;
}
//************************************************************
void * memmap(unsigned long phy_addr, unsigned long size)
{
unsigned long phy_addr_in_page;
unsigned long page_diff;
unsigned long size_in_page;
unsigned long value = 0;
TMMAP_Node_t * pTmp;
TMMAP_Node_t * pNew;
void *addr=NULL;
if(size == 0)
{
printf("memmap():size can't be zero!\n");
return NULL;
}
/* проверить, было ли преобразовано пространство физической памяти */
pTmp = pTMMAPNode;
while(pTmp != NULL)
{
if( (phy_addr >= pTmp->Start_P) && ( (phy_addr + size) <= (pTmp->Start_P + pTmp->length) ) )
{
pTmp->refcount++; /* referrence count increase by 1 */
return (void *)(pTmp->Start_V + phy_addr - pTmp->Start_P);
}
pTmp = pTmp->next;
}
/* not mmaped yet */
if(fd < 0)
{
/* dev not opened yet, so open it */
fd = open (dev, O_RDWR | O_SYNC);
if(fd < 0)
{
printf("memmap():open %s error!\n", dev);
return NULL;
}
}
/* addr align in page_size(4K) */
phy_addr_in_page = phy_addr & PAGE_SIZE_MASK;
page_diff = phy_addr - phy_addr_in_page;
/* size in page_size */
size_in_page =((size + page_diff - 1) & PAGE_SIZE_MASK) + PAGE_SIZE;
addr = mmap((void *)0, size_in_page, PROT_READ|PROT_WRITE, MAP_SHARED, fd, phy_addr_in_page);
if(addr == MAP_FAILED)
{
printf("memmap():mmap @ 0x%x error!\n", phy_addr_in_page);
return NULL;
}
/* add this mmap to MMAP Node */
pNew = (TMMAP_Node_t *)malloc(sizeof(TMMAP_Node_t));
if(NULL == pNew)
{
printf("memmap():malloc new node failed!\n");
return NULL;
}
pNew->Start_P = phy_addr_in_page;
pNew->Start_V = (unsigned long)addr;
pNew->length = size_in_page;
pNew->refcount = 1;
pNew->next = NULL;
if(pTMMAPNode == NULL)
{
pTMMAPNode = pNew;
}
else
{
pTmp = pTMMAPNode;
while(pTmp->next != NULL)
{
pTmp = pTmp->next;
}
pTmp->next = pNew;
}
return (void *)(addr+page_diff);
}
//************************************************************
unsigned long GetValueRegister(unsigned long adress)
{
void *pMem = NULL;
unsigned long value = -1;
jmp_buf sigbus_jmpbuf;
sigbus_jmp = &sigbus_jmpbuf;
if(sigsetjmp(sigbus_jmpbuf, 1) == 0)
{
pMem = memmap(adress,DEFAULT_MD_LEN);
if (pMem == NULL)
{
printf("memmap failed!\n");
return -1;
}
value = *(unsigned int*)pMem; //читаем региср
}
return value;
}
//************************************************************
int SetValueRegister(unsigned long adress, unsigned long value)
{
void *pMem = NULL;
pMem = memmap(adress,DEFAULT_MD_LEN);
if (pMem == NULL)
{
printf("memmap failed!\n");
return -1;
}
*(unsigned int*)pMem = value; //пишем в регистр
return 0;
}
//************************************************************
void get_chip_gpio_adress(unsigned long *Chip_Id, unsigned long *GPIO_Groups, unsigned long *GPIO_Base, unsigned long *GPIO_Offset)
{
switch (*Chip_Id)
{
//-------------------------------------------
//Default: 0x3516A100 одна группа
//Hi3516Av100 A7 @ 600 MHz 0x2014_0000
case 0x3516A100:
*GPIO_Groups = 17; //пропустить G15
*GPIO_Base = 0x20140000;
*GPIO_Offset = 0x10000;
break;
//Default: 0x3516A100
//Hi3516Dv100 A7 @600 MHz 0x2014_0000
case 0x3516D100:
*GPIO_Groups = 15;
*GPIO_Base = 0x20140000;
*GPIO_Offset = 0x10000;
break;
//-------------------------------------------
//Hi3518Ev100 ARM926 @ 440 MHz 0x2014_0000
case 0x35180100:
*GPIO_Groups = 12;
*GPIO_Base = 0x20140000;
*GPIO_Offset = 0x10000;
break;
//-------------------------------------------
//Hi3516Cv100 ARM926 @ 440 MHz 0x2014_0000
case 0x3516C100:
*GPIO_Groups = 12;
*GPIO_Base = 0x20140000;
*GPIO_Offset = 0x10000;
break;
//-------------------------------------------
//Default: 0x3516C300
//Hi3516Cv300 ARM926 @ 800 MHz 0x1214_0000
case 0x3516C300:
*GPIO_Groups = 9;
*GPIO_Base = 0x12140000;
*GPIO_Offset = 0x1000;
break;
//-------------------------------------------
//Default: 0x3516E200
//Hi3516Ev200 A7 @ 900MHz 0x120B_0000
case 0x3516E200:
*GPIO_Groups = 9;
*GPIO_Base = 0x120B0000;
*GPIO_Offset = 0x1000;
break;
//-------------------------------------------
//Default: 0x3516E300
//Hi3516Ev300 A7 @ 900MHz 0x120B_0000
case 0x3516E300:
*GPIO_Groups = 10;
*GPIO_Base = 0x120B0000;
*GPIO_Offset = 0x1000;
break;
//-------------------------------------------
//Default: 0x3518E200 одна группа
//Hi3516Cv200 ARM926 @ 540 MHz 0x2014_0000
case 0x3516C200:
*GPIO_Groups = 9;
*GPIO_Base = 0x20140000;
*GPIO_Offset = 0x10000;
break;
//Default: 0x3518E200
//Hi3518Ev200 ARM926 @ 540 MHz 0x2014_0000
case 0x3518E200:
*GPIO_Groups = 9;
*GPIO_Base = 0x20140000;
*GPIO_Offset = 0x10000;
break;
//Default: 0x3518E200
//Hi3518Ev201 ARM926 @ 540 MHz 0x2014_0000
case 0x3518E201:
*GPIO_Groups = 9;
*GPIO_Base = 0x20140000;
*GPIO_Offset = 0x10000;
break;
//-------------------------------------------
case 0x35350100:
*GPIO_Groups = 15;
*GPIO_Base = 0x20150000;
*GPIO_Offset = 0x10000;
break;
//-------------------------------------------
case 0x3536C100:
*GPIO_Groups = 14; //пропустить G4
*GPIO_Base = 0x12150000;
*GPIO_Offset = 0x10000;
break;
//-------------------------------------------
case 0x3536D100:
*GPIO_Groups = 6;
*GPIO_Base = 0x12150000;
*GPIO_Offset = 0x10000;
break;
//-------------------------------------------
default:
*GPIO_Groups = 0;
*GPIO_Base = 0;
*GPIO_Offset = 0;
break;
//---------------------------------
}
}
//************************************************************
void get_chip_id(unsigned long *Chip_Id, unsigned char *cpu, unsigned char *hardware)
{
unsigned long SCBASE;
unsigned long SCSYSID0 = 0xEE0;
unsigned long SCSYSID1 = 0xEE4;
unsigned long SCSYSID2 = 0xEE8;
unsigned long SCSYSID3 = 0xEEC;
unsigned long Chip_Ver;
unsigned long Val;
char Buffer[4096];
int i;
//---------------------------------------------
SCBASE = 0x20050000;
if(GetValueRegister(SCBASE)==-1) //читаем сначала один базовый адрес
{
SCBASE = 0x12020000;
if(GetValueRegister(SCBASE)==-1) //затем читаем другой
{
sprintf(cpu,"unknown");
*Chip_Id = 0;
return;
}
}
//---------------------------------------------
if((GetValueRegister(SCBASE+SCSYSID0) & 0xFF000000) >> 24 == 0x35) //если старший байт = 0x35 значит все ID в одном регистре
{
*Chip_Id = GetValueRegister(SCBASE+SCSYSID0);
Chip_Ver = 0;
}
else
{
Chip_Ver = (GetValueRegister(SCBASE+SCSYSID0) & 0xFF000000) >> 24; //старший байт регистра может быть версия чипа
SCSYSID0 = GetValueRegister(SCBASE+SCSYSID0) & 0xFF; //читаем младший байт регистра
SCSYSID1 = GetValueRegister(SCBASE+SCSYSID1) & 0xFF; //читаем младший байт регистра
SCSYSID2 = GetValueRegister(SCBASE+SCSYSID2) & 0xFF; //читаем младший байт регистра
SCSYSID3 = GetValueRegister(SCBASE+SCSYSID3) & 0xFF; //читаем младший байт регистра
*Chip_Id = (SCSYSID3<<24)+(SCSYSID2<<16)+(SCSYSID1<<8)+(SCSYSID0);
}
//---------------------------------------------
if((*Chip_Id==0x3518E200)&(Chip_Ver==0x01)) *Chip_Id=0x3516C200;
if((*Chip_Id==0x3518E200)&(Chip_Ver==0x02)) *Chip_Id=0x3518E200;
if((*Chip_Id==0x3518E200)&(Chip_Ver==0x03)) *Chip_Id=0x3518E201;
//---------------------------------------------
if((*Chip_Id==0x3516A100)&(Chip_Ver==0x01)) *Chip_Id=0x3516A100;
if((*Chip_Id==0x3516A100)&(Chip_Ver==0x02)) *Chip_Id=0x3516D100;
//---------------------------------------------
switch (*Chip_Id)
{
//-------------------------------------------
//Default: 0x3516A100
case 0x3516A100:
sprintf(cpu,"Hi3516Av100");
sprintf(hardware,"A7 @ 600 MHz");
break;
//-------------------------------------------
//Default: 0x3516A100
case 0x3516D100:
sprintf(cpu,"Hi3516Dv100");
sprintf(hardware,"A7 @ 600 MHz");
break;
//-------------------------------------------
//Default: 0x35180100
case 0x35180100:
sprintf(cpu,"Hi3518Ev100");
sprintf(hardware,"ARM926 @ 440 MHz");
break;
//-------------------------------------------
case 0x3516C100:
sprintf(cpu,"Hi3516Cv100");
sprintf(hardware,"ARM926 @ 440 MHz");
break;
//-------------------------------------------
//Default: 0x3516C300
case 0x3516C300:
sprintf(cpu,"Hi3516Cv300");
sprintf(hardware,"ARM926 @ 800 MHz");
break;
//-------------------------------------------
//Default: 0x3516E200
case 0x3516E200:
sprintf(cpu,"Hi3516Ev200");
sprintf(hardware,"A7 @ 900MHz");
break;
//-------------------------------------------
//Default: 0x3516E300
case 0x3516E300:
sprintf(cpu,"Hi3516Ev300");
sprintf(hardware,"A7 @ 900MHz");
break;
//-------------------------------------------
//Default: 0x3518E200 одна группа
case 0x3516C200:
sprintf(cpu,"Hi3516Cv200");
sprintf(hardware,"ARM926 @ 540 MHz");
break;
//Default: 0x3518E200
case 0x3518E200:
sprintf(cpu,"Hi3518Ev200");
sprintf(hardware,"ARM926 @ 540 MHz");
break;
//Default: 0x3518E200
case 0x3518E201:
sprintf(cpu,"Hi3518Ev201");
sprintf(hardware,"ARM926 @ 540 MHz");
break;
//-------------------------------------------
case 0x35350100:
sprintf(cpu,"Hi3535v100");
sprintf(hardware,"A9 dual-core @ 900 MHz");
break;
//-------------------------------------------
case 0x3536C100:
sprintf(cpu,"Hi3536Cv100");
sprintf(hardware,"A7 dual-core @ 1.3 GHz");
break;
//-------------------------------------------
case 0x3536D100:
sprintf(cpu,"Hi3536Dv100");
sprintf(hardware,"A7 @ 850 MHz");
break;
//-------------------------------------------
default: //чип не поддерживается
sprintf(cpu,"unknown");
sprintf(hardware,"unknown");
break;
//---------------------------------
}
}
//************************************************************
int main(int argc, char *argv[])
{
unsigned long Chip_Id = 0;
unsigned char CPU[50]={""};
unsigned char HARDWARE[50]={""};
unsigned long GPIO_Groups,GPIO_Base,GPIO_Offset;
unsigned long adress = 0;
unsigned long direct = 0;
unsigned long value = 0;
unsigned long OldValue[20];
int bit,old_bit,new_bit;
int i,group,mask;
int HeaderByte,Skip,SkipPin;
//---------------------------------------------------------------
if(set_handler()==-1)
{
printf("Set handler Error!\n");
return 0;
}
get_chip_id(&Chip_Id,&CPU[0],&HARDWARE[0]);
printf("For skip pin exaple: %s 12 14 ...\n",argv[0]);
printf("================ Hisilicon GPIO Scaner (2021) OpenIPC.org collective =================\n");
printf("Chip_Id: 0x%08X, CPU: %s, Hardware: %s\n",Chip_Id,CPU,HARDWARE);
if(!strcmp(CPU,"unknown")) //чип не поддерживается
{
printf("This CPU not support!\n");
return 0;
}
get_chip_gpio_adress(&Chip_Id,&GPIO_Groups,&GPIO_Base,&GPIO_Offset);
//-----------------------------
for(group=0; group<GPIO_Groups; group++)
{
adress=GPIO_Base+(group*GPIO_Offset)+0x3fc; //регистр данных портов
value = GetValueRegister(adress);
OldValue[group]=value; //запоминаем в массив значение
printf("Gr:%2d, Addr:0x%08lX, Data:0x%02lX = 0b",group,adress,value);
print_bin(value); //выводим бинарный вид
adress=GPIO_Base+(group*GPIO_Offset)+0x400; //регистр направления портов
direct=GetValueRegister(adress);
printf(", Addr:0x%08lX, Dir:0x%02lX = 0b",adress,direct);
print_bin(direct);
printf("\n");
}
if(argc > 1)
{
printf("--------------------------------------------------------------------------------------\n");
for (i = 1; i < argc; i++) printf("Skip Pin: GPIO%s\n",argv[i]);
}
printf("--------------------------------------------------------------------------------------\n");
printf("While change value...\n");
//-----------------------------
while(1)
{
for(group=0; group<GPIO_Groups; group++)
{
adress=GPIO_Base+(group*GPIO_Offset)+0x3fc; //регистр данных портов
value = GetValueRegister(adress);
if(OldValue[group]!=value) //старый и новый байты не равны
{
HeaderByte=0;
for (bit = 7; bit >= 0; bit--) //цикл побитного сравнения
{
old_bit = (OldValue[group]>>bit)&1;
new_bit = (value>>bit)&1;
Skip=0;
//-------------------------------
if(argc > 1) //Есть пин для пропуска
{
for (i = 1; i < argc; i++)
{
SkipPin=atoi(argv[i]);
if(((group*8)+bit)==SkipPin) Skip=1;
}
}
//-------------------------------
if(Skip==0)
{
if(old_bit!=new_bit)
{
if(HeaderByte==0) //еще не выводили заголовок измененения байта
{
printf("--------------------------------------------------------------------------------------\n");
printf("Gr:%d, Addr:0x%08lX, Data:0x%02lX = 0b",group,adress,OldValue[group]);
print_bin(OldValue[group]);
printf(" --> 0x%02lX = 0b",value);
print_bin(value);
printf("\n");
HeaderByte=1;
}
adress=GPIO_Base+(group*GPIO_Offset)+0x400; //регистр направления портов
direct = GetValueRegister(adress);
direct = (direct>>bit)&1; //получили бит направления порта 0-вход 1-выход
adress=GPIO_Base+(group*GPIO_Offset)+(1<<bit+2);
if(direct==1)
{
mask=value & 1<<bit;
printf("Mask: \"himm 0x%08lX 0x%02lX\", GPIO%d_%d, GPIO%d, Dir:Output, Level:%d\n",adress,mask,group,bit,(group*8)+bit,new_bit);
}
else
{
mask=value & 1<<bit;
printf("Mask: \"himm 0x%08lX 0x%02lX\", GPIO%d_%d, GPIO%d, Dir:Input, Level:%d\n",adress,mask,group,bit,(group*8)+bit,new_bit);
}
}
}
}
OldValue[group]=value; //запоминаем новое значение
}
}
usleep(100000);
}
return 0;
}

View File

@ -1,2 +1,5 @@
#f2fs
#mt7601u
#r8188eu
#vfat