您尚未登录。

#3 Re: 全志 SOC » buildroot-tiny200 (F1C100/200s) 开发包近期更新内容 * 已支持DVP摄像头 *,支持SPI NAND » 2020-10-19 13:56:27

请问如果我添加了一个开机画面文件: board/widora/mangopi/r3/splash.png

应该如何拷贝到 output/images 呢?

修改 board/allwinner/suniv-f1c100s/scripts/genimage.sh 这个文件吗?

#6 Re: 全志 SOC » 使用gnu工具链自带iconv完成gbk/gb2312到unicode字符编码双向转换 » 2020-08-28 09:36:04

现在写代码大多是utf-8码了吧,

不过几大门户网站缺返祖了

这是 http://www.163.com/
<meta http-equiv="Content-Type" content="text/html; charset=gbk">


这是 http://www.qq.com/
<meta charset="gb2312">

#7 Re: 全志 SOC » 小智X3开发板,lcd屏上的uboot的log信息在哪里关掉??? » 2020-08-19 10:55:42

jkl 说:

将这两个配置取消掉
   CONFIG_CONSOLE_MUX:
   CONFIG_SYS_CONSOLE_IS_IN_ENV:

可以用了,非常感谢!

#8 Re: 全志 SOC » 小智X3开发板,lcd屏上的uboot的log信息在哪里关掉??? » 2020-08-19 09:28:42

jkl 说:

将这两个配置取消掉
   CONFIG_CONSOLE_MUX:
   CONFIG_SYS_CONSOLE_IS_IN_ENV:

感谢楼主提示,晚些我也试一试,有进度了上来报告给各位围观群众.

#9 Re: 全志 SOC » 小智X3开发板,lcd屏上的uboot的log信息在哪里关掉??? » 2020-08-18 21:14:32

jkl 说:

不是这个,我刚才将这个配置取消掉了,还是一样的,有点不知道从哪里下手。看贴吧里面有人遇到同样的问题,但是没有给出解决方法!
我看您给的帖子里面,你的液晶屏上面也显示了uboot的启动log,您没有取消掉吗?

大佬这个问题解决了吗?我也碰到了一样的问题, 屏幕上面的log信息怎么都取消不掉.

#12 DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 618促销买了一个30V/5A的可调电源,可是说明书上写错字了,我需要退货吗?我要找卖家索赔吗? » 2020-06-20 15:31:05

异乡是故乡
回复: 2

QQ图片20200620152728.jpg




618促销买了一个30V/5A的可调电源,可是说明书上写错字了,我需要退货吗?我要找卖家索赔吗?

此处应该有 狗头.gif

#13 Re: 全志 SOC » 请问V3s Simple Framebuffer 启动之后,就把uboot显示的图片给清理了,两秒黑屏才进入app, 有什么办法不让他清屏呢 » 2020-06-10 11:28:31

哇酷小二 说:

我仔细读了一下, 估计精髓就在这里,你就改 bootargs 试一试:

大佬真是太给力了! 改完就OK了, 现在u-boot的显示画面可以保持到Qt应用程序了。

#14 Re: 全志 SOC » 请问V3s Simple Framebuffer 启动之后,就把uboot显示的图片给清理了,两秒黑屏才进入app, 有什么办法不让他清屏呢 » 2020-06-10 09:17:56

zhouyu2019 说:

感谢大佬推荐!

请教一个问题, 作者是用

2. 内核framebuffer的地址要指定与uboot相同的地址, 因为uboot已经将图片数据加载到内存进行显示了, 内核使用相同的地址便能显示相同的图片

这个方案吗?

#16 全志 SOC » 请问V3s Simple Framebuffer 启动之后,就把uboot显示的图片给清理了,两秒黑屏才进入app, 有什么办法不让他清屏呢 » 2020-06-09 17:11:59

异乡是故乡
回复: 22

请问V3s Simple Framebuffer 启动之后,



就把uboot显示的图片给清理了,

两秒黑屏才进入app,

有什么办法不让他清屏呢?

#17 Re: Openwrt/LEDE/AR9331/MT7688/RT5350 » MT7621无法启动 » 2020-06-09 17:10:19

[    2.496246] VFS: Cannot open root device "(null)" or unknown-block(0,0): error -6

你的 bootargs 里面 root 值设置的是什么?

这是错误6的信息:

#define	ENXIO		 6	/* No such device or address */

#19 Re: 全志 SOC » 大佬们,V3S用那个WIFI稳定? » 2020-06-03 13:45:29

晕哥推荐的 AP6212,或者他家别的型号, 友善的开发板上面,我测过也确实挺稳定的。

连续 wget 几天大文件也不会死机。

#20 Re: 全志 SOC » 关于buildroot 编译时间长的问题 » 2020-05-26 21:02:30

sunbird606 说:

我的是卡在  toolchain  Installing to target 就一直不动了

make V=1

试一试这个命令, 显示更多调试信息.

#21 Re: 全志 SOC » 求助!F1C100S使用USB Hub出现问题 » 2020-05-26 21:00:15

V3s经过HUB接 4G模块确实OK, AIR720, AIR724我试过都可以的.

F1C倒是没注意.

#22 Re: Nuvoton N32905/N32926/NUC972/N9H20/N9H26/N9H30 » NUC972支持RGB444 Sync输出吗? » 2020-05-22 22:58:56

刚刚翻了一下, 手册里面确实说得不清不楚的, 楼主搞定了一定记得上来留言噢.

#23 Re: ESP32/ESP8266 » esp8266+arduino+modbus开发 » 2020-04-27 10:56:01

zeesser 说:

NUC972性价比是不是要好一些?

要看和谁比,应用场景是什么。
300Mhz主频有点鸡肋,内置DRAM, 引脚超级多,UART也多。

#24 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 闲鱼收银机,让我来做个总结【很多很多图警告,建议用WIFI,流量劝退】 » 2020-04-27 09:51:08

tianyekpsexzxg 说:

感觉这产品做复杂了

这就是互联网思维, 用最简单的方法快速出产品, 快速占领市场,快速迭代,成本可以后面降,机器出问题直接换新,因为投资方要的是增长率,增长率,增长率!!!然后把泡泡吹大继续找接盘侠。

#25 Re: ESP32/ESP8266 » esp8266+arduino+modbus开发 » 2020-04-27 09:49:06

这个 libmodbus 我在 NUC972 + Linux非常好用, 我把原来自己撸的代码替换了, 测试了两天, 已经小批量发货给客户了。

#26 Re: ESP32/ESP8266 » esp8266+arduino+modbus开发 » 2020-04-25 10:39:52

zeesser 说:

欸,一点都偷不了懒么?~~~

应该可以偷懒了:

Small Modbus slave, RTU (serial) for Arduino (arduino modbus从机):
https://github.com/stephane/modbusino

Simple Makefile to compile and upload Arduino sketches:
https://github.com/stephane/arduinoMakefile

#27 Re: ESP32/ESP8266 » esp8266+arduino+modbus开发 » 2020-04-25 09:03:53

湘楚浪子 说:

果然可以,以前modbus代码都是自己撸的,发现这个libmodbus更简洁:

简书上面找到一个demo




RTU:

#include <modbus.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>


int main(void)
{
    modbus_t *ctx=NULL;     // context
    int addr=0;             // address
    int rc=0;               // received
    int nb = 3;             // the number of bit

    uint16_t *tab_rq_registers=NULL;
    uint16_t *tab_rp_registers=NULL;

    /* RTU */
    ctx = modbus_new_rtu("/dev/ttySAC3",9600,'N',8,1);
    modbus_set_debug(ctx, TRUE);
    modbus_set_slave(ctx, 0x01);  // 设置从机地址

    // connect
    if (-1 == modbus_connect(ctx))
    {
        fprintf(stderr, "Conncetion failed: %s\n", modbus_strerror(errno));
        modbus_free(ctx);
        return -1;
    }

    // 读取数据
    uint16_t tab_reg[2];  // 存放要读的数据
    int regs=modbus_read_registers(ctx,0,2,tab_reg);

    /* Close the connection */
    modbus_close(ctx);
    modbus_free(ctx);

    return 0;
}

TCP:

/*
 * The client of modbus tcp.
 * test 2 register
 *
 * 2017-10-26
 */

#include <modbus.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>


int main(void)
{
    modbus_t *ctx=NULL;     // context
    int addr=0;             // address
    int rc=0;               // received
    int nb = 3;             // the number of bit

    uint16_t *tab_rq_registers=NULL;
    uint16_t *tab_rp_registers=NULL;

    /* TCP */
    ctx = modbus_new_tcp("192.168.2.29", 1502);
    modbus_set_debug(ctx, TRUE);
    // connect
    if (-1 == modbus_connect(ctx))
    {
        fprintf(stderr, "Conncetion failed: %s\n", modbus_strerror(errno));
        modbus_free(ctx);
        return -1;
    }

    /* Allocate and initialize the memory spaces. */
    tab_rq_registers = (uint16_t *) malloc(nb * sizeof(uint16_t));
    memset(tab_rq_registers, 0, nb * sizeof(uint16_t));
    tab_rp_registers = (uint16_t *) malloc(nb * sizeof(uint16_t));
    memset(tab_rp_registers, 0, nb * sizeof(uint16_t));


    // write
    tab_rq_registers[0] = 25;
    tab_rq_registers[1] = 2;
    tab_rq_registers[2] = 88;


    rc = modbus_write_registers(ctx, addr, nb, tab_rq_registers);
    if (rc != nb)
    {
        printf("ERROR modbus_write_bits single (%d)\n", rc);
        printf("address = %d\n", addr);
    }

    // read
    rc = modbus_read_registers(ctx, addr, nb, tab_rp_registers);
    if (rc != nb)
    {
        printf("ERROR modbus_read_bits single (%d)\n", rc);
        printf("address = %d\n", addr);
    }
    for (int i = 0; i < nb; ++i)
    {
        printf("%d%c", tab_rp_registers[i], (i==nb-1)?'\n':' ');
    }   
        
    free(tab_rq_registers);
    free(tab_rp_registers);
    /* Close the connection */
    modbus_close(ctx);
    modbus_free(ctx);
    
    return 0;
}   

#28 Re: 全志 SOC » 围观蓝莓派(Blueberry-PI)之后, 一定要试一试 主线 Linux DVP CSI 摄像头 » 2020-04-12 22:59:06

viken 说:

这个项目地址里我看到了完整的配置文件,与镜像文件;
没有找到对应的linux 内核源代码,请问镜像文件对应版本的linux 内核源代码在哪里可以下载到呢,谢谢了哦!

https://github.com/torvalds/linux

源码在这里


这个作者用的是 The mainline linux kernel (4.21) has support for

刚刚试了一下:
git clone https://github.com/torvalds/linux --branch v4.21

结果提示分支错误, 后来想起来根本没有v4.21嘛, 最后一个版本是v4.20

所以你可以试一试:
git clone https://github.com/torvalds/linux --branch v5.0

root@me:/opt# git clone https://github.com/torvalds/linux --branch v5.0
Cloning into 'linux'...
remote: Enumerating objects: 7335096, done.
Receiving objects:   5% (417762/7335096), 186.67 MiB | 7.55 MiB/s

#30 Re: 全志 SOC » 请教下V3s启动内核后一直打印sunxi-mmc 1c10000.mmc: smc 1 err, cmd 5, RE !!问题 » 2020-04-12 22:04:44

rootfs 所在的 mmc0/sdio0 (TF卡) 没有问题, 现在只是你的 sdio1/sdio2 有问题而已, 是不是没上拉, 或者在dts这组io口被其他功能占用了.

#32 技术人生/软件使用技巧/破解经验/技术吐槽/灌水 » 微信聊天记录迁移到新手机, 可以把以前登录过微信的手机聊天记录(包括文字/语音/图片/视频)都可以迁移到新手机,不只限一台手机。 » 2020-03-20 08:26:07

异乡是故乡
回复: 9

QQ图片20200320074014.png

QQ截图20200320074046A.png

QQ截图20200320074105.png


微信聊天记录迁移到新手机,
可以把以前登录过微信的手机聊天记录(包括文字/语音/图片/视频)都可以迁移到新手机,
不只限一台手机,
凡是以前登录过的手机都能迁移到新手机。

#33 Re: 全志 SOC » 双层板的四核神器?X3(A33内置DRAM版本) » 2020-03-16 23:18:11

1847123212 说:

这芯片好像都没有公开参数啊?哪里看来的?

A33 with DDR

#35 Re: 全志 SOC » Windows裸机程序烧录工具,烧录到SD卡 » 2020-03-15 08:54:06

给力给力, 核心就是这个了:

https://github.com/malasy/SDCardWriter/blob/master/SDCardWriter/SDCardWriterDlg.cpp#L396

https://github.com/malasy/SDCardWriter/blob/master/SDCardWriter/SDCardWriterDlg.cpp#L594

// SDCardWriterDlg.cpp: 实现文件
//

#include "pch.h"
#include "framework.h"
#include "SDCardWriter.h"
#include "SDCardWriterDlg.h"
#include "afxdialogex.h"
#include <Dbt.h>
#include "winioctl.h"
#include "ioapiset.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

#define SECTION_NAME "SDCardWriter"
#define BLOCK_SIZE_KEY "block_size"
#define BLOCK_COUNT_KEY "block_count"
#define WINDOW_X "left"
#define WINDOW_Y "top"


// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialogEx
{
public:
	CAboutDlg();

// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_ABOUTBOX };
#endif

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现
protected:
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()


// CSDCardWriterDlg 对话框


CSDCardWriterDlg::CSDCardWriterDlg(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_SDCARDWRITER_DIALOG, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON_SD);
}

void CSDCardWriterDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_DEVICE_COMB, m_cbDevice);
}

BEGIN_MESSAGE_MAP(CSDCardWriterDlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_DEVICECHANGE()
	ON_BN_CLICKED(IDC_INPUT_BTN, &CSDCardWriterDlg::OnBnClickedInputBtn)
	ON_CBN_SELCHANGE(IDC_DEVICE_COMB, &CSDCardWriterDlg::OnCbnSelchangeDeviceComb)
	ON_BN_CLICKED(IDC_BTN_BURN, &CSDCardWriterDlg::OnBnClickedBtnBurn)
	ON_STN_CLICKED(IDC_STATIC_LINK, &CSDCardWriterDlg::OnStnClickedStaticLink)
END_MESSAGE_MAP()


// CSDCardWriterDlg 消息处理程序

BOOL CSDCardWriterDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 将“关于...”菜单项添加到系统菜单中。

	// IDM_ABOUTBOX 必须在系统命令范围内。
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != nullptr)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码
	initCombobox();
	
	//读取配置文件
	CString blockSize = AfxGetApp()->GetProfileString(_T(SECTION_NAME), _T(BLOCK_SIZE_KEY));
	CString blockCount = AfxGetApp()->GetProfileString(_T(SECTION_NAME), _T(BLOCK_COUNT_KEY));
	GetDlgItem(IDC_EDIT_BLOCK_SIZE)->SetWindowTextW(blockSize);
	GetDlgItem(IDC_EDIT_OFFSET)->SetWindowTextW(blockCount);

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void CSDCardWriterDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialogEx::OnSysCommand(nID, lParam);
	}
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CSDCardWriterDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作区矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialogEx::OnPaint();
	}
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CSDCardWriterDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}

//监听USB设备的插入和移除
BOOL CSDCardWriterDlg::OnDeviceChange(UINT nEventType, DWORD dwData)
{
	if (nEventType == DBT_DEVICEREMOVECOMPLETE) {
		initCombobox();
	}

	if (nEventType == DBT_DEVICEARRIVAL) {
		initCombobox();
	}
	
	return false;
}


//打开资源管理器选择文件
void CSDCardWriterDlg::OnBnClickedInputBtn()
{
	filePath = _T("");
	CFileDialog dlgFile(TRUE, NULL, NULL, OFN_HIDEREADONLY, _T("Bin文件(*.bin)|*.bin|All Files(*.*)|*.*||"), NULL);
	if (dlgFile.DoModal()) {
		filePath = dlgFile.GetPathName();
		if (!filePath.IsEmpty()) {
			GetDlgItem(IDC_INPUT_ET)->SetWindowTextW(filePath);
		}
	}
}

//获取所有的USB设备盘符(一个字母)
int CSDCardWriterDlg::get_usb_disk(char usb_paths[])
{
	DWORD all_disk = GetLogicalDrives();
	int usb_cnt = 0;
	int i = 0;
	char disk_path[5] = { 0 };
	char device_path[10] = { 0 };
	char device_name[100] = {0};
	while (all_disk && usb_cnt < 5) {
		if ((all_disk & 0x1) == 1) {
			sprintf_s(device_path, "%c:\\", 'A' + i);
			if (GetDriveType(CString(device_path)) == DRIVE_REMOVABLE) {
				usb_paths[usb_cnt++] = 'A' + i;
			}
		}
		all_disk = all_disk >> 1;
		i++;
	}
	return usb_cnt;
}

//重新填充下拉列表数据
void CSDCardWriterDlg::initCombobox()
{
	//清空下拉列表
	m_cbDevice.ResetContent();
	int count = get_usb_disk(devicePaths);
	if (count == 0) {
		m_cbDevice.AddString(_T(""));
		m_cbDevice.SetCurSel(0);
		deviceLabel = '#';
		return;
	}
	CString strInfo;
	for (int i = 0; i < count; i++) {
		strInfo.Format(_T("%c:"), devicePaths[i]);
		m_cbDevice.InsertString(i, strInfo);
	}
	//默认选中第一个
	m_cbDevice.SetCurSel(0);
	deviceLabel = devicePaths[0];
}

HANDLE CSDCardWriterDlg::getHandleOnFile(LPCWSTR filelocation, DWORD access)
{
	HANDLE hFile;
	hFile = CreateFileW(filelocation, access, (access == GENERIC_READ) ? FILE_SHARE_READ : 0, NULL, (access == GENERIC_READ) ? OPEN_EXISTING : CREATE_ALWAYS, 0, NULL);
	if (hFile == INVALID_HANDLE_VALUE)
	{
		wchar_t* errormessage = NULL;
		FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, GetLastError(), 0, (LPWSTR)&errormessage, 0, NULL);
		CString errInfo;
		errInfo.Format(_T("An error occurred when attempting to get a handle on the file.  Error:%d  %s"), GetLastError(), errormessage);
		MessageBox(errInfo);
		LocalFree(errormessage);
	}
	return hFile;
}

HANDLE CSDCardWriterDlg::getHandleOnVolume(char volume, DWORD access)
{
	HANDLE hVolume;
	char volumename[] = "\\\\.\\A:";
	volumename[4] = volume;
	hVolume = CreateFile(CString(volumename), access, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
	if (hVolume == INVALID_HANDLE_VALUE)
	{
		wchar_t* errormessage = NULL;
		FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, GetLastError(), 0, (LPWSTR)&errormessage, 0, NULL);
		CString errInfo;
		errInfo.Format(_T("An error occurred when attempting to get handle on volume.  Error:%d  %s"), GetLastError(), errormessage);
		MessageBox(errInfo);
	}
	return hVolume;
}

bool CSDCardWriterDlg::getLockOnVolume(HANDLE handle)
{
	DWORD bytesreturned;
	BOOL bResult;
	bResult = DeviceIoControl(handle, FSCTL_LOCK_VOLUME, NULL, 0, NULL, 0, &bytesreturned, NULL);
	if (!bResult)
	{
		wchar_t* errormessage = NULL;
		FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, GetLastError(), 0, (LPWSTR)&errormessage, 0, NULL);
		CString errInfo;
		errInfo.Format(_T("An error occurred when attempting to lock the volume.  Error:%d  %s"), GetLastError(), errormessage);
		MessageBox(errInfo);
	}
	return (bResult);
}

bool CSDCardWriterDlg::removeLockOnVolume(HANDLE handle)
{
	DWORD junk;
	BOOL bResult;
	bResult = DeviceIoControl(handle, FSCTL_UNLOCK_VOLUME, NULL, 0, NULL, 0, &junk, NULL);
	if (!bResult)
	{
		wchar_t* errormessage = NULL;
		FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, GetLastError(), 0, (LPWSTR)&errormessage, 0, NULL);
		CString errInfo;
		errInfo.Format(_T("An error occurred when attempting to unlock the volume.  Error:%d  %s"), GetLastError(), errormessage);
		MessageBox(errInfo);
	}
	return (bResult);
}

bool CSDCardWriterDlg::unmountVolume(HANDLE handle)
{
	DWORD junk;
	BOOL bResult;
	bResult = DeviceIoControl(handle, FSCTL_DISMOUNT_VOLUME, NULL, 0, NULL, 0, &junk, NULL);
	if (!bResult)
	{
		wchar_t* errormessage = NULL;
		FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, GetLastError(), 0, (LPWSTR)&errormessage, 0, NULL);
		CString errInfo;
		errInfo.Format(_T("An error occurred when attempting to dismount the volume.  Error:%d  %s"), GetLastError(), errormessage);
		MessageBox(errInfo);
	}
	return (bResult);
}

bool CSDCardWriterDlg::isVolumeUnmounted(HANDLE handle)
{
	DWORD junk;
	BOOL bResult;
	bResult = DeviceIoControl(handle, FSCTL_IS_VOLUME_MOUNTED, NULL, 0, NULL, 0, &junk, NULL);
	return (!bResult);
}

DWORD CSDCardWriterDlg::getDeviceID(HANDLE hVolume)
{
	VOLUME_DISK_EXTENTS sd;
	DWORD bytesreturned;
	if (!DeviceIoControl(hVolume, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, NULL, 0, &sd, sizeof(sd), &bytesreturned, NULL))
	{
		wchar_t* errormessage = NULL;
		FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, GetLastError(), 0, (LPWSTR)&errormessage, 0, NULL);
		CString errInfo;
		errInfo.Format(_T("An error occurred when attempting to get information on volume.  Error:%d  %s"), GetLastError(), errormessage);
		MessageBox(errInfo);
	}
	return sd.Extents[0].DiskNumber;
}

HANDLE CSDCardWriterDlg::getHandleOnDevice(int device, DWORD access)
{
	HANDLE hDevice;
	CString devicename;
	devicename.Format(_T("\\\\.\\PhysicalDrive%d"), device);

	hDevice = CreateFile(devicename, access, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
	if (hDevice == INVALID_HANDLE_VALUE)
	{
		wchar_t* errormessage = NULL;
		FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, GetLastError(), 0, (LPWSTR)&errormessage, 0, NULL);
		CString errInfo;
		errInfo.Format(_T("An error occurred when attempting to get a handle on the device.  Error:%d  %s"), GetLastError(), errormessage);
		MessageBox(errInfo);
		LocalFree(errormessage);
	}
	return hDevice;
}

char* CSDCardWriterDlg::readSectorDataFromHandle(HANDLE handle, unsigned long long startsector, unsigned long long numsectors, unsigned long long sectorsize)
{
	unsigned long bytesread;
	char* data = new char[sectorsize * numsectors];
	LARGE_INTEGER li;
	li.QuadPart = startsector * sectorsize;
	SetFilePointer(handle, li.LowPart, &li.HighPart, FILE_BEGIN);
	if (!ReadFile(handle, data, sectorsize * numsectors, &bytesread, NULL))
	{
		wchar_t* errormessage = NULL;
		FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, GetLastError(), 0, (LPWSTR)&errormessage, 0, NULL);
		CString errInfo;
		errInfo.Format(_T("An error occurred when attempting to read data from handle.  Error:%d  %s"), GetLastError(), errormessage);
		MessageBox(errInfo);
		delete[] data;
		data = NULL;
	}
	if (data && bytesread < (sectorsize * numsectors))
	{
		memset(data + bytesread, 0, (sectorsize * numsectors) - bytesread);
	}
	return data;
}

bool CSDCardWriterDlg::writeSectorDataToHandle(HANDLE handle, char* data, unsigned long long startsector, unsigned long long numsectors, unsigned long long sectorsize)
{
	unsigned long byteswritten;
	BOOL bResult;
	LARGE_INTEGER li;
	li.QuadPart = startsector * sectorsize;
	SetFilePointer(handle, li.LowPart, &li.HighPart, FILE_BEGIN);
	bResult = WriteFile(handle, data, sectorsize * numsectors, &byteswritten, NULL);
	if (!bResult)
	{
		wchar_t* errormessage = NULL;
		FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, GetLastError(), 0, (LPWSTR)&errormessage, 0, NULL);
		CString errInfo;
		errInfo.Format(_T("An error occurred when attempting to write data to handle.  Error:%d  %s"), GetLastError(), errormessage);
		MessageBox(errInfo);
	}
	return (bResult);
}

unsigned long long CSDCardWriterDlg::getFileSizeInSectors(HANDLE handle, unsigned long long sectorsize)
{
	unsigned long long retVal = 0;
	if (sectorsize) // avoid divide by 0
	{
		LARGE_INTEGER filesize;
		if (GetFileSizeEx(handle, &filesize) == 0)
		{
			wchar_t* errormessage = NULL;
			FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, GetLastError(), 0, (LPWSTR)&errormessage, 0, NULL);
			CString errInfo;
			errInfo.Format(_T("An error occurred while getting the file size.  Error:%d  %s"), GetLastError(), errormessage);
			MessageBox(errInfo);
			retVal = 0;
		}
		else
		{
			retVal = ((unsigned long long)filesize.QuadPart / sectorsize) + (((unsigned long long)filesize.QuadPart % sectorsize) ? 1 : 0);
		}
	}
	return(retVal);
}

unsigned long long CSDCardWriterDlg::getNumberOfSectors(HANDLE handle, unsigned long long* sectorsize)
{
	DWORD junk;
	DISK_GEOMETRY_EX diskgeometry;
	BOOL bResult;
	bResult = DeviceIoControl(handle, IOCTL_DISK_GET_DRIVE_GEOMETRY_EX, NULL, 0, &diskgeometry, sizeof(diskgeometry), &junk, NULL);
	if (!bResult)
	{
		wchar_t* errormessage = NULL;
		FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, GetLastError(), 0, (LPWSTR)&errormessage, 0, NULL);
		CString errInfo;
		errInfo.Format(_T("An error occurred when attempting to get the device's geometry.  Error:%d  %s"), GetLastError(), errormessage);
		MessageBox(errInfo);
		return 0;
	}
	if (sectorsize != NULL)
	{
		*sectorsize = (unsigned long long)diskgeometry.Geometry.BytesPerSector;
	}
	return (unsigned long long)diskgeometry.DiskSize.QuadPart / (unsigned long long)diskgeometry.Geometry.BytesPerSector;
}

//下拉选中列表中的另外一项
void CSDCardWriterDlg::OnCbnSelchangeDeviceComb()
{
	int sel = m_cbDevice.GetCurSel();
	deviceLabel = devicePaths[sel];
}


//点击烧录按钮
void CSDCardWriterDlg::OnBnClickedBtnBurn()
{
	//获取必须数据:烧录的文件,烧录的设备,偏移,块大小
	if (filePath.IsEmpty() || deviceLabel == '#') {
		MessageBox(_T("请选择设备和烧录的文件"));
		return;
	}
	CString blockSizeStr;
	CString blockCountStr;
	GetDlgItem(IDC_EDIT_BLOCK_SIZE)->GetWindowTextW(blockSizeStr);
	GetDlgItem(IDC_EDIT_OFFSET)->GetWindowTextW(blockCountStr);
	if (blockSizeStr.IsEmpty() || blockCountStr.IsEmpty()) {
		MessageBox(_T("请输入块大小和偏移量"));
		return;
	}
	//保存数据
	AfxGetApp()->WriteProfileStringW(_T(SECTION_NAME), _T(BLOCK_SIZE_KEY), blockSizeStr);
	AfxGetApp()->WriteProfileStringW(_T(SECTION_NAME), _T(BLOCK_COUNT_KEY), blockCountStr);

	//字符串-->数字
	unsigned long long blockSize = _ttoi(blockSizeStr);
	unsigned int blockCount = _ttoi(blockCountStr);

	int status = STATUS_WRITING;
	//获取卷句柄
	HANDLE hVolume = getHandleOnVolume(deviceLabel, GENERIC_WRITE);
	if (hVolume == INVALID_HANDLE_VALUE) { 
		status = STATUS_IDLE;
		return; 
	}
	//获取设备ID
	DWORD deviceID = getDeviceID(hVolume);
	if (!getLockOnVolume(hVolume))
	{
		CloseHandle(hVolume);
		hVolume = INVALID_HANDLE_VALUE;
		status = STATUS_IDLE;
		return;
	}
	//卸载卷(不懂为什么要这样,猜测应该是需要卸载设备,解除系统对该设备的占用,然后我们才能直接操作该设备)
	if (!unmountVolume(hVolume))
	{
		removeLockOnVolume(hVolume);
		CloseHandle(hVolume);
		hVolume = INVALID_HANDLE_VALUE;
		status = STATUS_IDLE;
		return;
	}

	//获取文件句柄
	HANDLE hFile = getHandleOnFile(filePath, GENERIC_READ);
	if (hFile == INVALID_HANDLE_VALUE)
	{
		removeLockOnVolume(hVolume);
		CloseHandle(hVolume);
		hVolume = INVALID_HANDLE_VALUE;
		status = STATUS_IDLE;
		return;
	}

	//得到设备的物理地址。hVolume是应用层使用的地址,hRawDisk是驱动层使用的地址(不太确定)
	HANDLE hRawDisk = getHandleOnDevice(deviceID, GENERIC_WRITE);
	if (hRawDisk == INVALID_HANDLE_VALUE)
	{
		removeLockOnVolume(hVolume);
		CloseHandle(hFile);
		CloseHandle(hVolume);
		hVolume = INVALID_HANDLE_VALUE;
		hFile = INVALID_HANDLE_VALUE;
		status = STATUS_IDLE;
		return;
	}
	unsigned long long numsectors,sectorsize, availablesectors, lasti,i;

	//获取可用空间(以扇区为单位)和扇区大小,一般扇区大小为512Byte
	availablesectors = getNumberOfSectors(hRawDisk, &sectorsize);
	if (!availablesectors) { 
		removeLockOnVolume(hVolume);
		CloseHandle(hRawDisk);
		CloseHandle(hFile);
		CloseHandle(hVolume);
		hRawDisk = INVALID_HANDLE_VALUE;
		hFile = INVALID_HANDLE_VALUE;
		hVolume = INVALID_HANDLE_VALUE;
		status = STATUS_IDLE;
		return; 
	}

	//获取文件大小(以扇区为单位)
	numsectors = getFileSizeInSectors(hFile, sectorsize);
	if (!numsectors)
	{
		removeLockOnVolume(hVolume);
		CloseHandle(hRawDisk);
		CloseHandle(hFile);
		CloseHandle(hVolume);
		hRawDisk = INVALID_HANDLE_VALUE;
		hFile = INVALID_HANDLE_VALUE;
		hVolume = INVALID_HANDLE_VALUE;
		status = STATUS_IDLE;
		return;
	}

	if (numsectors > availablesectors) {
		MessageBox(_T("More space required than is available"));
	}
	lasti = 0ul;
	char* sectorData;

	//计算需要偏移的扇区数
	unsigned long long offsetSector = (blockSize * blockCount)/sectorsize;
	for (i = 0ul; i < numsectors && status == STATUS_WRITING; i += 1024ul) {
		sectorData = readSectorDataFromHandle(hFile, i, (numsectors - i >= 1024ul) ? 1024ul : (numsectors - i), sectorsize);
		if (sectorData == NULL)
		{
			removeLockOnVolume(hVolume);
			CloseHandle(hRawDisk);
			CloseHandle(hFile);
			CloseHandle(hVolume);
			status = STATUS_IDLE;
			hRawDisk = INVALID_HANDLE_VALUE;
			hFile = INVALID_HANDLE_VALUE;
			hVolume = INVALID_HANDLE_VALUE;
			return;
		}
		if (!writeSectorDataToHandle(hRawDisk, sectorData, offsetSector + i, (numsectors - i >= 1024ul) ? 1024ul : (numsectors - i), sectorsize))
		{
			delete[] sectorData;
			removeLockOnVolume(hVolume);
			CloseHandle(hRawDisk);
			CloseHandle(hFile);
			CloseHandle(hVolume);
			status = STATUS_IDLE;
			sectorData = NULL;
			hRawDisk = INVALID_HANDLE_VALUE;
			hFile = INVALID_HANDLE_VALUE;
			hVolume = INVALID_HANDLE_VALUE;
			return;
		}
		delete[] sectorData;
		sectorData = NULL;
	}
	removeLockOnVolume(hVolume);
	CloseHandle(hRawDisk);
	CloseHandle(hFile);
	CloseHandle(hVolume);
	hRawDisk = INVALID_HANDLE_VALUE;
	hFile = INVALID_HANDLE_VALUE;
	hVolume = INVALID_HANDLE_VALUE;
	MessageBox(_T("烧录成功!"));
}


void CSDCardWriterDlg::OnStnClickedStaticLink()
{
	ShellExecute(0, NULL, _T("https://github.com/malasy/SDCardWriter"), NULL, NULL, SW_NORMAL);
}

#39 Re: 全志 SOC » 请问为什么AIR720 4G模块插入到V3s linux4.13系统, 只有一个 RNDIS 设备, 确没有像 Windows再多四个串口 » 2020-03-07 23:14:26

费了九牛二虎之力终于搞定.

[   44.119061] usb 1-1: new high-speed USB device number 2 using ehci-platform
[   44.317009] rndis_host 1-1:1.0 eth1: register 'rndis_host' at usb-1c1a000.usb-1, RNDIS device, ac:92:48:f9:ea:08
[   44.380705] option 1-1:1.2: GSM modem (1-port) converter detected
[   44.411618] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB0
[   44.445448] option 1-1:1.3: GSM modem (1-port) converter detected
[   44.474551] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB1
[   44.491664] option 1-1:1.4: GSM modem (1-port) converter detected
[   44.524489] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB2

先按这个改: https://ask.openluat.com/article/37
再按这个改: https://ask.openluat.com/article/79

#42 Re: 全志 SOC » 请问为什么AIR720 4G模块插入到V3s linux4.13系统, 只有一个 RNDIS 设备, 确没有像 Windows再多四个串口 » 2020-03-07 22:12:38

插入 ubuntu 18.04 也是这样:

[699934.369537] usb 3-2.1: USB disconnect, device number 19
[699934.369614] rndis_host 3-2.1:1.0 enxaca9def8f175: unregister 'rndis_host' usb-0000:03:00.0-2.1, RNDIS device
[699936.475885] usb 3-2.1: new high-speed USB device number 20 using xhci_hcd
[699936.689810] usb 3-2.1: New USB device found, idVendor=1286, idProduct=4e3d, bcdDevice= 1.00
[699936.689812] usb 3-2.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[699936.689813] usb 3-2.1: Product: Mobile Composite Device Bus
[699936.689814] usb 3-2.1: Manufacturer: Marvell
[699936.689815] usb 3-2.1: SerialNumber: 200806006809080000
[699936.702012] rndis_host 3-2.1:1.0 eth0: register 'rndis_host' at usb-0000:03:00.0-2.1, RNDIS device, ac:a9:de:f8:f1:75
[699936.749105] rndis_host 3-2.1:1.0 enxaca9def8f175: renamed from eth0

#43 Re: 全志 SOC » 请问为什么AIR720 4G模块插入到V3s linux4.13系统, 只有一个 RNDIS 设备, 确没有像 Windows再多四个串口 » 2020-03-07 22:10:09

[  595.249458] usb 1-1: new high-speed USB device number 2 using ehci-platform
[  595.446965] rndis_host 1-1:1.0 eth1: register 'rndis_host' at usb-1c1a000.usb-1, RNDIS device, ac:a9:de:f8:f1:75

这是驱动输出的记录.

#44 全志 SOC » 请问为什么AIR720 4G模块插入到V3s linux4.13系统, 只有一个 RNDIS 设备, 确没有像 Windows再多四个串口 » 2020-03-07 22:09:21

异乡是故乡
回复: 11

请问为什么AIR720 4G模块插入到V3s linux4.13系统,

只有一个 RNDIS 设备,

确没有像 Windows再多四个串口.

这是为什么呢?

#45 Re: 全志 SOC » 试一试用MDK ARMCC 编译全志官方f1c100s sdk --- melis » 2020-01-02 17:07:17

伍零壹 说:

我没有接LCD  烧录和输出都可以了

烧录到TF卡还是flash?

#46 Re: 全志 SOC » 试一试用MDK ARMCC 编译全志官方f1c100s sdk --- melis » 2020-01-02 16:51:53

伍零壹 说:

搞定了  是99的方法  自己挖了个坑

可以显示了吗?

#47 Re: NXP i.MX6UL/6ULL » 野火imx6ul mini板到了,如何安装远程桌面? » 2020-01-02 16:41:41

x forward 需要全功能的带x服务器的固件才行吧, 比如debian那种,

如果是精简版的根文件系统, 我估计不行。

#48 Re: 全志 SOC » 烧写usb报错 » 2020-01-02 16:34:38

微凉VeiLiang 说:

很有可能是用错 sunxi-fel的版本。去荔枝派官网nano.lichee.pro按照教程下载sunxi-fel工具

他在 3# 说 荔枝派没有问题,一切正常烧写

说的不知道是 V3s 还是 F1c100s

#49 Re: 全志 SOC » 荔枝派Nano 自己编译内核 启动时 卡到Waiting for root device /dev/mtdblock3... » 2020-01-02 15:41:54

nufing 说:

安装这个 sudo apt-get install mtd-utils

编译后就很大了 , 搞不懂哈

和这个没关系, 你是你的 target/ 目录太大了。

#50 Re: NXP i.MX6UL/6ULL » 野火imx6ul mini板到了,如何安装远程桌面? » 2020-01-02 15:41:12

Gentlepig 说:

在群里问了下,有大佬说要x over ssh,这是个啥?

应该是这玩意: https://whycan.cn/t_2057.html#p14142

#52 Re: Qt/MSVC/MINGW/C++/MFC/GTK+/Delphi/BCB » windows 编译静态库版本 Qt » 2020-01-02 14:59:33

wow

厉害了, 非常感谢!

我说呢, 公司的软件总是带一堆7788动态链接库.

#53 Re: 全志 SOC » 荔枝派Nano 自己编译内核 启动时 卡到Waiting for root device /dev/mtdblock3... » 2020-01-02 14:52:40

nufing 说:

加了这两个,生成的文件好大,100M, 我把 build.sh 的,

你的目标文件夹target/太大吧?

#54 Re: NXP i.MX6UL/6ULL » 野火imx6ul mini板到了,如何安装远程桌面? » 2020-01-02 14:51:52

估计是插件没有配置和编译, 用 buildroot 勾选一下就行。

#56 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » bitbucket/gitee 都限制仓库大小了, 没有自建git仓库的朋友们,我来推荐一个腾讯云旗下的代码托管平台 » 2019-12-19 09:16:31

晕,我的gitee也超大,拒绝commit了。

$ git push gitee hua_uart0_800x480
Counting objects: 311, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (231/231), done.
Writing objects: 100% (311/311), 15.79 MiB | 2.17 MiB/s, done.
Total 311 (delta 27), reused 0 (delta 0)
remote: Resolving deltas: 100% (27/27), completed with 12 local objects.
remote: Checking connectivity: 311, done.
remote: Powered by GITEE.COM [GNK-3.8]
remote: This repository(including wiki) size 3.07 GB, exceeds 1024.00 MB.
remote: Push rejected for repository size exceeds limit.
remote: HelpLink:           https://gitee.com/help/articles/4232
remote: Repository GC:      https://gitee.com/qabcqabc/linux/settings#git-gc
remote: Enterprise Edition: https://gitee.com/enterprises#commerces
remote: Utilities:          https://github.com/newren/git-filter-repo
remote:                     https://rtyley.github.io/bfg-repo-cleaner
remote:                     https://git-scm.com/docs/git-filter-branch
To gitee.qabcqabc/linux.git
 ! [remote rejected]

#57 Re: 全志 SOC » f1c100s io口不够了, 打算选用一个 i2c/spi 的 gpio/pwm 扩展芯片 MCP23017/PCA9685 » 2019-12-16 09:09:19

gui401 说:

恩智浦收购飞思卡尔后体积太大,后分离出标准器件部门命名为安世半导体。

原来如此,多谢赐教.

#58 Re: 全志 SOC » f1c100s io口不够了, 打算选用一个 i2c/spi 的 gpio/pwm 扩展芯片 MCP23017/PCA9685 » 2019-12-16 08:20:50

发现立创的数据乱得一批,

一会叫NXP(恩智浦): https://list.szlcsc.com/brand/89.html

一会叫 Nexperia(安世): https://list.szlcsc.com/brand/1101.html

到底是不是同一个马甲?

哥还以为后面那个是国产品牌呢

#59 Re: 全志 SOC » f1c100s io口不够了, 打算选用一个 i2c/spi 的 gpio/pwm 扩展芯片 MCP23017/PCA9685 » 2019-12-16 08:13:53

迪卡 说:

pcf8575  16bit   带中断
pcf8574   8bit    不带中断

PCF8575TS: https://item.szlcsc.com/12867.html

1+:    ¥13.09
10+:    ¥9.68
30+:    ¥9.06
100+:    ¥7.587
500+:    ¥7.335
1000+:    ¥7.218

PCF8574TS: https://item.szlcsc.com/58826.html

1+:    ¥6.88
10+:    ¥5.09
30+:    ¥4.77
100+:    ¥3.996
500+:    ¥3.861
1000+:    ¥3.798

gpio驱动: https://github.com/torvalds/linux/blob/master/drivers/gpio/gpio-pcf857x.c
dts配置: https://github.com/torvalds/linux/blob/master/Documentation/devicetree/bindings/gpio/gpio-pcf857x.txt

keyboard驱动: https://github.com/torvalds/linux/blob/master/drivers/input/misc/pcf8574_keypad.c

#60 Re: 全志 SOC » licheepi zero BSP 内核(linux3.4) 编译教程 » 2019-12-13 14:35:08

dml1048147924 说:

按照楼主的步骤,从tf启动内核, 进入控制下lsmod ,没有发现module ,然后我自己进入目录下安装,insmod ov5647_mipi.ko ,
显示:unknown symbol in module, or unknown parameter

https://whycan.cn/t_2794.html#p23005

ARCH=arm CROSS_COMPILE=arm-linux- INSTALL_MOD_PATH=/opt/f1c100s/buildroot-2019.02.2/output/target/ make modules_install

把 ko 文件用上面的命令安装到你的根文件系统(根据具体情况调整参数)





命令行执行: modprobe ov5647_mipi

#61 Re: 全志 SOC » f1c100s io口不够了, 打算选用一个 i2c/spi 的 gpio/pwm 扩展芯片 MCP23017/PCA9685 » 2019-12-13 11:30:32

达克罗德 说:

1块钱的st单片机行不

可以的, 打算用 stm8s003/n76e003

#63 Re: 全志 SOC » 荔枝派Nano Pi PWM背光设置问题 » 2019-12-13 11:05:59

vkaoke 说:

设备树中,去掉gpios的配置就正常啦,十分感谢大家

compatible = "qiaodian,qd43003c0-40", "simple-panel";
 		#address-cells = <1>;
 		#size-cells = <0>;
-		enable-gpios = <&pio 4 6 GPIO_ACTIVE_HIGH>;

原来如此, 调了大半天死活不起作用,正在准备放弃治疗了。

#64 Re: 全志 SOC » f1c100s io口不够了, 打算选用一个 i2c/spi 的 gpio/pwm 扩展芯片 MCP23017/PCA9685 » 2019-12-13 10:57:24

kekemuyu 说:

都快能买两个f1c100s了

对, 是有点贵, 先驱动起来, 先完成客户需求, 等正式下单再用单片机模拟这些扩展芯片。

#66 Re: 全志 SOC » v3s bsp(linux3.4)下摄像头问题 » 2019-12-13 10:43:17

dml1048147924 说:

请问@晕哥小弟,荔枝派还有哪个 MIPI接口的摄像头可以用呢

你先去驱动里面找, 看驱动支持哪些, 然后再去看有没有停产。

#67 全志 SOC » f1c100s io口不够了, 打算选用一个 i2c/spi 的 gpio/pwm 扩展芯片 MCP23017/PCA9685 » 2019-12-13 10:21:37

异乡是故乡
回复: 20

立创链接: https://item.szlcsc.com/48028.html

1+:¥8.05
10+:¥5.96
30+:¥5.58
100+:¥4.68 ¥5.2
500+:¥4.518 ¥5.02
1000+:¥4.446

linux 驱动: https://github.com/torvalds/linux/blob/master/drivers/pinctrl/pinctrl-mcp23s08.c

dts 配置: https://github.com/torvalds/linux/blob/master/Documentation/devicetree/bindings/pinctrl/pinctrl-mcp23s08.txt

是有点贵,先用着吧,等有订单再用STM8S003单片机模拟MCP23017吧。

#68 Re: Qt/MSVC/MINGW/C++/MFC/GTK+/Delphi/BCB » 公司的一款用MFC设计行业辅助设计软件(类似CAD)在画面元素太多的时候问题爆发了 » 2019-11-28 14:12:36

天马行空 说:

用 mfc 的 mem dc 会不会改善一些?

MEM DC 是用双缓冲解决的是闪烁问题, 你现在的问题不是闪烁, 而是计算占了太多cpu时间,导致GUI卡屎了。

#70 Re: 全志 SOC » 荔枝派Nano使用gcc-linaro-7.2.1进行交叉编译得到的可执行文件,一运行就"segmentation fault" » 2019-11-23 10:33:12

aaayao 说:

编译u-boot又出问题了,是不是这个编译工具太老了?

ubuntu@VM-0-16-ubuntu:~/f1c100s/u-boot$ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- -j4
*** Your GCC is older than 6.0 and is not supported
make: *** [checkgcc6] Error 1
make: INTERNAL: Exiting with 5 jobserver tokens available; should be 4!

对,要用 gcc 7.x

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn