准备玩hi3518e,步步更新。
先上图,主板是3.5元从垃圾佬手中收来的,USB转串口是5元收来的,还是买一送一,底板从阿莫处买的,十几元。。。 一看是奶粉还以为点了广告{:lol:} 留个爪吧 usb转串口好便宜啊 这货一切都是为IP摄像头做的,学习起来不如普通处理器,SDK都是IPCAM的东西。如果想学习建议买个2440之类的开发板,学习省下来的时间比硬件的成本高太多了。 买了一罐楼主位的奶粉,儿子不喝,我喝了一杯试试,恶心我一晚上,一股死鱼味 正好,我也跟着楼主学习开发过程……需要先准备什么? 好帖,,不过不知道这些CPU是不是要签订保密协议才能拿到资料? 好贴,几块钱的开发板楼住还有吗?想搞两块吃灰 老规矩,tty,NFS,分析数据。
Creating 6 MTD partitions on "hi_sfc":
0x000000000000-0x000000040000 : "boot"
0x000000040000-0x000000060000 : "env"
0x000000060000-0x000000080000 : "conf"
0x000000080000-0x000000400000 : "os"
0x000000400000-0x000000800000 : "rootfs"
0x000000800000-0x000001000000 : "userfs"
6分区,rootfs只读,usrfs读写。
# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/root 3712 3712 0 100% /
tmpfs 13544 4 13540 0% /dev
tmpfs 13544 0 13544 0% /tmp
tmpfs 13544 4 13540 0% /var
tmpfs 13544 116 13428 1% /etc
/dev/mtdblock5 8192 3744 444846% /esntd
userfs挂在/esntd上。
# vi /etc/init.d/rcS
#! /bin/sh
/bin/mount -a
echo "
||||\|||||||| ||||||||||||||
|\ \|| \||||\ || || ||
||||\|||\ \| |\ |\ || || ||
|| \||\||||\ || || ||
|| \||\|\||\ || ||||\
||||| \||||\|| ||\ || |||||\
www.esntd.com
"
for initscript in /etc_ro/init.d/S*
do
if [ -x $initscript ] ;
then
echo ": $initscript"
$initscript
fi
done
# ls /etc_ro/init.d/
S00devs S01udev S80networkrcS
创建dev没什么好看的
# vi /etc_ro/init.d/S80network
#!/bin/sh
nvrinit=`nvram_get esn_nvr WebInit`
if [ "$nvrinit" != "1" ]; then
echo "Init User NVRAM Default Config ...!"
esntd_nvram renew esn_nvr /esntd/default_cfg.bin
fi
ifconfig lo 127.0.0.1
lanmac=`nvram_get esn_idn lan_mac`
if [ "$lanmac" != "" ]; then
ifconfig eth0 hw ether $lanmac
fi
ifconfig eth0 up
/esntd/usr_init
就是设置好网络参数,然后执行/esntd/usr_init
参数:
cat /esntd/default_cfg.bin
#The word of "Default" must not be removed
Default
WebInit=1
HostName=IPCamera
Login=admin
Password=
OperationMode=2
lan_ipaddr=192.168.1.239
lan_netmask=255.255.255.0
lan_gateway=192.168.1.1
lan_dns=192.168.1.1
lan_staticip=0
web_port=80
NTPServerIP=time.nist.gov
NTPSync=48
TZ=CST_008
net_upnp=0
net_ddns=0
ap_enb=0
# cat /esntd/usr_init
#!/bin/sh
echo "Start User Init ...!"
ulimit -s 1024
#加载传感器 ,这个没有。。。
cd /hiko && ./load3518e -i ov9712
#wifi驱动选择
ap_en=`nvram_get esn_nvr ap_enb`
if ["$ap_en" = "0" ]; then
insmod /esntd/mt7601Usta.ko
ifconfig ra0 up
else
insmod /esntd/mt7601Uap.ko
ifconfig ra0 up
ifconfig apcli0 up
fi
#goahead web server更新
if [ -f /esntd/goahead_new ]
then
rm -f /esntd/goahead
mv /esntd/goahead_new /esntd/goahead
chmod 777 /esntd/goahead
fi
#不明程序esndo更新
if [ -f /esntd/esndo_new ]
then
rm -f /esntd/esndo
mv /esntd/esndo_new /esntd/esndo
chmod 777 /esntd/esndo
fi
#加载wdt驱动
#cd /hiko && insmod wdt.ko default_margin=20 nodeamon=0 nowayout=0
cd /hiko && insmod wdt.ko
cd /esntd/
/esntd/esndo &
/esntd/app_startup.sh &
/esntd/teldbg.sh &
# cat /esntd/app_startup.sh
#!/bin/sh
PROGRAM="/esntd/goahead /esntd/web"
PROGRAM_NAME="goahead"
appcnt=0
while true; do
appcnt=`ps |grep -v grep | grep -c $PROGRAM_NAME`
if [ $appcnt == 0 ]; then
killall -9 $PROGRAM_NAME
$PROGRAM &
sleep 2
fi
sleep 20
done
exit 0
循环打开goahead
# cat /esntd/teldbg.sh
echo "root:zg2014" > /tmp/tmpchpw
chpasswd < /tmp/tmpchpw
rm -f /tmp/tmpchpw
telnetd &
打开telnetd
整个启动过程完成。 lnso 发表于 2018-2-9 17:53
好贴,几块钱的开发板楼住还有吗?想搞两块吃灰
我也是搞了几块,主要目的是熟悉海思这些cpu,雄迈ipc模块才40多一块。 jackiezeng 发表于 2018-2-9 16:35
好帖,,不过不知道这些CPU是不是要签订保密协议才能拿到资料?
假货宝大把SDK XA144F 发表于 2018-2-9 16:33
正好,我也跟着楼主学习开发过程……需要先准备什么?
初学linux,进阶拆路由,最后玩这个。 MAD_FISH 发表于 2018-2-9 15:08
usb转串口好便宜啊
ST micro connect lite,垃圾佬那里收的。前几年不少厂倒闭,垃圾佬那里不少好货,现在都木有了。。。 boyiee 发表于 2018-2-9 15:13
这货一切都是为IP摄像头做的,学习起来不如普通处理器,SDK都是IPCAM的东西。
如果想学习建议买个2440之类 ...
玩现成的,玩便宜的。 垃圾佬那里真是什么都有 huangqi412 发表于 2018-2-10 10:05
垃圾佬那里真是什么都有
垃圾佬是谁,论坛里卖二手仪器的那位吗? 求板子链接 。。。。。。
这玩意是不是必须得会linux? 楼主好好玩,再学下结构,做个ipcamera给坛友玩啊 写了个小程序,读ADC数值,如果有变化,则显示出来
驱动:
#include <linux/module.h>
//#include <asm/hardware.h>
#include <linux/errno.h>
#include <linux/miscdevice.h>
#include <linux/fcntl.h>
#include <linux/spinlock.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/proc_fs.h>
#include <linux/workqueue.h>
#include <asm/uaccess.h>
#include <asm/system.h>
#include <asm/io.h>
#include "adc.h"
#define SAR_ADC_ADRESS_BASE 0x200B0000
void __iomem * reg_sar_adc_base_va = 0;
#define HI_IO_ADDRESS(x) (reg_sar_adc_base_va + ((x)-(SAR_ADC_ADRESS_BASE)))
//ADC conversion status register
#define ADC_STATUS_REG HI_IO_ADDRESS(SAR_ADC_ADRESS_BASE + 0x000)
//ADC conversion control register
#define ADC_CTRL_REG HI_IO_ADDRESS(SAR_ADC_ADRESS_BASE + 0x004)
//ADC mode control register
#define ADC_POWERDOWN_REG HI_IO_ADDRESS(SAR_ADC_ADRESS_BASE + 0x008)
//Masked ADC conversion completion interrupt register
#define ADC_INT_STATUS_REG HI_IO_ADDRESS(SAR_ADC_ADRESS_BASE + 0x00C)
//conversion completion interrupt mask register
#define ADC_INT_MASK_REG HI_IO_ADDRESS(SAR_ADC_ADRESS_BASE + 0x010)
//ADC conversion completion interrupt clear register
#define ADC_INT_CLR_REG HI_IO_ADDRESS(SAR_ADC_ADRESS_BASE + 0x014)
//Raw ADC conversion completion interrupt register
#define ADC_INT_RAW_REG HI_IO_ADDRESS(SAR_ADC_ADRESS_BASE + 0x018)
//ADC_RESULT ADC conversion result register
#define ADC_RESULT_REG HI_IO_ADDRESS(SAR_ADC_ADRESS_BASE + 0x01C)
#defineSAR_ADC_WRITE_REG(Addr, Value) ((*(volatile unsigned int *)(Addr)) = (Value))
#defineSAR_ADC_READ_REG(Addr) (*(volatile unsigned int *)(Addr))
int SAR_ADC_Open(struct inode * inode, struct file * file)
{
unsigned intSarADCReg;
SarADCReg = SAR_ADC_READ_REG(ADC_POWERDOWN_REG);
if(SarADCReg & ADC_POWERDOWN) //if POWERDOWN bit is set
{
SAR_ADC_WRITE_REG(ADC_POWERDOWN_REG, 0x0000);//clean thePOWERDOWN bit
// printk("adc powerup!\n");
}
return 0 ;
};
intSAR_ADC_Close(struct inode * inode, struct file * file)
{
unsigned intSarADCReg;
SarADCReg = SAR_ADC_READ_REG(ADC_POWERDOWN_REG);
if(SarADCReg & ADC_POWERDOWN) //if POWERDOWN bit is set
{
// printk("adc powerdown!\n");
return 0;
}
SAR_ADC_WRITE_REG(ADC_POWERDOWN_REG, 0x0001);//set thePOWERDOWN bit
// printk("adc powerdown!\n");
return 0;
}
static long SAR_ADC_Ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
SAR_ADC_DATA_S __user *argp = (SAR_ADC_DATA_S __user*)arg;
unsigned intSarADCReg,SarADCReg1;
int Ret = 0;
switch (cmd)
{
case CMD_SAR_ADC_READ:
{
SAR_ADC_WRITE_REG(ADC_CTRL_REG, ADC_CHANNEL1 );//set the channel1
SAR_ADC_WRITE_REG(ADC_CTRL_REG, (ADC_CHANNEL1 | ADC_CONVERSION));//start
Ret = 0;
while(SAR_ADC_READ_REG(ADC_CTRL_REG) & ADC_CONVERSION) //wait if conversing
{
if(Ret > 0xfff) {printk("time out!\n");return -1; }//break if time out.
Ret++;
}
argp->data = SAR_ADC_READ_REG(ADC_RESULT_REG); //read the data
读adc的程序:
#include <stdio.h>
#include <ctype.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <pthread.h>
#include "adc.h"
typedef struct tag_KEY_ARG
{
unsigned char keyWorld;
pthread_t thrPid;
} KEY_ARG;
void *GetTheKeyWorld(void *parg)
{
KEY_ARG *pkeyArg = (KEY_ARG*)parg;
while((pkeyArg->keyWorld = getchar()) != 'q');
return 0;
}
int main(int argc , char* argv[])
{
int fd = -1;
int ret;
unsigned int adcData = 0;
SAR_ADC_DATA_S adc_data;
KEY_ARG keyArg;
keyArg.keyWorld = 0;
fd = open("/dev/sar_adc", 0);
if (fd<0)
{
printf("Open sar_adc dev error!\n");
return -1;
}
pthread_create(&keyArg.thrPid, 0, GetTheKeyWorld, &keyArg);
while(keyArg.keyWorld != 'q')
{
ret = ioctl(fd, CMD_SAR_ADC_READ, &adc_data);
if(ret != 0) {printf("read adc failt"); continue;}
if(adc_data.data != adcData) {adcData = adc_data.data; system("clear");printf("adc value is 0x%x\n",adc_data.data);}
//sleep(1);
}
close(fd);
return 0;
}
头文件
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif
#endif /* __cplusplus */
#define CMD_SAR_ADC_READ 0x03
/* ADC_STATUS_REG */
#define ADC_STATUS_PERFORM (1 << 0)
/* ADC_CTRL_REG */
#define ADC_CHANNEL0 (0 << 16)
#define ADC_CHANNEL1 (1 << 16)
#define ADC_CONVERSION (1 << 0)
/* ADC_POWERDOWN_REG */
#define ADC_POWERDOWN (1 << 0)
/* ADC_INT_STATUS_REG */
#define ADC_INT_MASKED (1 << 0)
/* ADC_INT_MASK_REG */
#define ADC_INT_MASK (1 << 0)
/* ADC_INT_CLR_REG */
#define ADC_INT_CLR (1 << 0)
/* ADC_INT_RAW_REG */
#define ADC_INT_RAW (1 << 0)
typedef struct SAR_ADC_DATA_S
{
unsigned int data;
}SAR_ADC_DATA_S ;
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* __cplusplus */
#endif
学习一下,学习一下,学习一下,学习一下。 楼主走两步就算了? 3.5元收的,真是够便宜,拆机卖片子,也差不多了 这后来就没消息了啊? 建议学习2440或者NUC972,这个太面向IPC了,太多IPC内容而失去了嵌入式系统的乐趣。
页:
[1]