Archive for the ‘LINUX C & ARM & C51’ Category

AIS-AIR 空气净化器官网 小杰SSJ

STM8, 个人的心情空间, 硬件相关 | Posted by 老沙
12月 29 2017

买了一个AIS-AIR 空气净化器

非常好用,低风量十分安静,可以睡觉用

高风量暴力,那个大风吹呀吹。。。。。

官网:

淘宝店:

https://kumouse.taobao.com/?spm=2013.1.1000126.d21.6b7f1849L7JcBE

https://item.taobao.com/item.htm?spm=a230r.7195193.1997079397.8.lhcQLr&id=562691358312&abbucket=17

利用NETLINK检测USB热插拔的C语言实现

LINUX C & ARM & C51 | Posted by 老沙
8月 20 2017

做嵌入式开发,尤其在网关、路由器或者其他支持USB设备的终端上,为了提高用户体验,我们常常需要支持自动识别并挂载USB设备功能。某些应用程序,在使用USB设备的过程中,也希望能够侦测到USB断开事件,不至于某些工作因为USB已经不存在而白做。在Linux下,我们主要有两种办法检测USB热插拔。
第一种便是定时检查/proc/scsi/scsi文件,该文件内会按照标准格式保存着当前设备内挂载的存储介质基本信息,如果在PC端,除了硬盘(ATA)、光驱(CD-ROM)外,就是USB设备(Direct-Access)了,轮询该scsi文件,检查文件内是否新增或减少数据便可实现自动侦测USB热插拔的效果。但是这种方法对于热插拔(hotplug)设备,如U盘,效果就没那么理想了,因为我们不知道设备什么时候插上,又是什么时候被拔掉了,只能验证当前是否已经插上或者已经拔除的事实。于是便有了另一种办法,我们采用一种特殊类的的文件描述符(套结字)专门用于Linux内核跟用户空间之间的异步通信,这种技术通常被成为NETLINK。
由于NETLINK是linux内置功能,所以使用起来很简单:创建一个AF_NETLINK协议族下NETLINK_KOBJECT_UEVENT类型的特殊文件描述符(套结字)CppLive,然后利用setsocketopt允许该文件描述符(套结字)复用其他端口,再利用band函数将自身进程绑定到特殊文件描述符(套结字)CppLive,最后利用select在while循环内监听CppLive是否可读,如果可读则调用recv接收Linux系统内核传递过来的数据并打印出来,这些输出便是USB热插拔信息。当然你也可以个性化地处理来自内核的热插拔信息,让程序变得更加智能以及人性化。

利用NETLINK检测USB热插拔的C语言实现代码如下:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <fcntl.h>
  5. #include <sys/socket.h>
  6. #include <linux/netlink.h>
  7. #define UEVENT_BUFFER_SIZE 2048
  8. int main(void)
  9. {
  10.     struct sockaddr_nl client;
  11.     struct timeval tv;
  12.     int CppLive, rcvlen, ret;
  13.     fd_set fds;
  14.     int buffersize = 1024;
  15.     CppLive = socket(AF_NETLINK, SOCK_RAW, NETLINK_KOBJECT_UEVENT);
  16.     memset(&client, 0, sizeof(client));
  17.     client.nl_family = AF_NETLINK;
  18.     client.nl_pid = getpid();
  19.     client.nl_groups = 1; /* receive broadcast message*/
  20.     setsockopt(CppLive, SOL_SOCKET, SO_RCVBUF, &buffersize, sizeof(buffersize));
  21.     bind(CppLive, (struct sockaddr*)&client, sizeof(client));
  22.     while (1) {
  23.         char buf[UEVENT_BUFFER_SIZE] = { 0 };
  24.         FD_ZERO(&fds);
  25.         FD_SET(CppLive, &fds);
  26.         tv.tv_sec = 0;
  27.         tv.tv_usec = 100 * 1000;
  28.         ret = select(CppLive + 1, &fds, NULL, NULL, &tv);
  29.         if(ret < 0)
  30.             continue;
  31.         if(!(ret > 0 && FD_ISSET(CppLive, &fds)))
  32.             continue;
  33.         /* receive data */
  34.         rcvlen = recv(CppLive, &buf, sizeof(buf), 0);
  35.         if (rcvlen > 0) {
  36.             printf(“%s\n”, buf);
  37.             /*You can do something here to make the program more perfect!!!*/
  38.         }
  39.     }
  40.     close(CppLive);
  41.     return 0;
  42. }

运行程序,测试U盘插入/拔除,输出如下:

  1. add@/devices/pci0000:00/0000:00:1d.7/usb2/2-1
  2. add@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0
  3. add@/module/usb_storage
  4. add@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6
  5. add@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/scsi_host/host6
  6. add@/bus/usb/drivers/usb-storage
  7. add@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0
  8. add@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0
  9. add@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0/scsi_disk/6:0:0:0
  10. add@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0/scsi_device/6:0:0:0
  11. add@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0/scsi_generic/sg2
  12. add@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0/bsg/6:0:0:0
  13. change@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0
  14. add@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0/block/sdb
  15. add@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0/block/sdb/sdb4
  16. add@/devices/virtual/bdi/8:16
  17. add@/module/fat
  18. add@/kernel/slab/fat_cache
  19. add@/kernel/slab/fat_inode_cache
  20. add@/module/vfat
  21. add@/module/nls_cp437
  22. add@/module/nls_iso8859_1
  23. remove@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0/bsg/6:0:0:0
  24. remove@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0/scsi_generic/sg2
  25. remove@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0/scsi_device/6:0:0:0
  26. remove@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0/scsi_disk/6:0:0:0
  27. remove@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0/block/sdb/sdb4
  28. remove@/devices/virtual/bdi/8:16
  29. remove@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0/block/sdb
  30. remove@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0
  31. remove@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/scsi_host/host6
  32. remove@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6
  33. remove@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0
  34. remove@/devices/pci0000:00/0000:00:1d.7/usb2/2-1
  35. remove@/host6/target6:0:0

ESP8266/ESP8285 启动报错 csum err ets_main.c 解决办法

ESP8266/32 | Posted by 老沙
8月 06 2017

ets Jan 8 2013,rst cause:2, boot mode:(3,6)

load 0x40100000, len 25020, room 16
tail 12
chksum 0xef
ho 0 tail 12 room 4
load 0x00000000, len 0, room 12
tail 0
chksum 0xef
load 0x00000000, len 0, room 4
tail 0
chksum 0xef
csum 0xef
csum err
ets_main.c

解决办法:

FLASH刷写模式改为DOUT

OpenWRT开发之——目录分析与make过程

LINUX C & ARM & C51 | Posted by 老沙
8月 02 2017

1.目录介绍

有几个重要目录:package, target, build_dir, staging_dir, bin, dl, …

—include 目录是存放 *.mk 文件。这里的文件上是在Makefile里被include的

—build_dir/host 目录是建立工具链时的临时目录

—build_dir/toolchain-<arch>* 对应硬件的工具链的目录

—staging_dir/toolchain-<arch>*  是工具链的安装位置

—target/linux/<platform> 目录里面是各个平台(arch)的相关代码

—target/linux/<platform>/config-3.10 文件就是配置文件了

—dl 目录是’download’的缩写, 在 编译前期,需要从网络下载的数据包都会放在这个目录下,这些软件包的一个特点就是,会自动安装在所编译的固件中,也就是我们make menuconfig的时候,为固件配置的一些软件包。如果我们需要更改这些源码包,只需要将更改好的源码包打包成相同的名字放在这个目录下,然后开始编 译即可。编译时,会将软件包解压到build_dir目录下。

—build_dir/ 目录下进行解压,编译和打补丁等。

—package/ 目录里面包含了我们在配置文件里设定的所有编译好的软件包。默认情况下,会有默认选择的软件包。

在openwrt中ipk就是一切, 我们可以使用:

$ ./scripts/feeds update #来对软件包进行更新.
$ ./scripts/feeds search nmap #查找软件包'nmap'
Search results in feed ’packages’: 
nmap       Network exploration and/or security auditing utility
$ ./scripts/feeds install nmap #安装'nmap'这个软件

—feeds/packages 为执行./scripts/feeds install 之后的package。

—bin 目录下生成了很多bin文件,根据不同的平台来区分。

—bin/<platform>/package 目录里面有很多ipk后缀的文件,都是package目录下的源码在build_dir目录下编译后的生成的结果。

注:以上摘自:[openwrt框架分析]

2.包的make过程

比如:lua包,mips架构。

make步骤:

  1. 在 make 时,make 读取到 package/utils/lua/Makefile 文件内容。
  2. 如果git或svn源,那么就会在 tmp/dl/ 目录下将源代码 clone 下来。然后,将 clone 下来的源码删除 .git 或 .svn 目录删除,然后压缩成 lua-1.5.1.tar.gz 文件,并复制到 dl/ 目录下。
  3. 在编译前段,将 dl/ 目录下的 lua-1.5.1.tar.gz 文件解压到 build_dir/target-mips_<board>/ 目录下。
  4. 进入 build_dir/target-mips_<board>/lua-1.5.1/
  5. ./configure,make,make install。
  6. make install 会将生成的二进制文件安装到 build_dir/target-mips_<board>/lua-1.5.1/ipkg-ar71xx/ 目录下。
  7. 最后将 build_dir/target-mips_<board>/lua-1.5.1/ipkg-ar71xx/ 打成包成lua-5.1.5-1_ar71xx.ipk,并复制到 bin/ar71xx/packages/base/ 。出处:https://my.oschina.net/hevakelcj/blog/417402

编译ESP8266固件

ESP8266/32 | Posted by 老沙
7月 01 2017

一、编译环境配置

我们先安装编译需要的软件包
sudo apt-get install git autoconf build-essential gperf bison flex texinfo libtool libncurses5-dev wget gawk libc6-dev-amd64 python-serial libexpat-dev

export PATH=”/opt/xtensa-lx106-elf/bin/:$PATH”

报错:

/opt/xtensa-lx106-elf/lib/gcc/xtensa-lx106-elf/4.8.2/include/sys/fcntl.h:31:34: fatal error: xtensa/simcall-fcntl.h: No such file or directory
#include <xtensa/simcall-fcntl.h>

cp -Rp ~/Share/ESP8266_RTOS_SDK/extra_include/xtensa ./

超级玛丽增强版VC源码 vc6.0

LINUX C & ARM & C51 | Posted by 老沙
6月 07 2017

超级玛丽增强版VC源码

ht1621 液晶屏 驱动

LINUX C & ARM & C51 | Posted by 老沙
6月 07 2017

没啥说的,一个驱动

ht1621驱动资料

已知曲线上的点 求函数解析式

LINUX C & ARM & C51 | Posted by 老沙
9月 13 2016
已知道曲线上的4个X及其对应的Y,怎么求y=f(x)的函数解析式。或者说函数原型吧
多谢了
x=1.2 y=3600 。。。。。。f(1.2)=3600
x=1.5 y=60 。。。。。。。f(1.5)=60
x=6 y=8。。。。。。。。。f(6)=8
x=9 y=0.2。。。。。。。。f(9)=0.2
其实这样的题目,最简单的方法就是用待定系数法来求,这有两种情况:
1、你的坐标平面上只有这4个点,且知道其坐标;
2、你的坐标平面上除了这4个点外,还有其他的点,只不过除了这4个点外,其他点的坐标未知。

对于第一种情况,最简单的方法就是多项式拟合法,有n个点,就拟合一个n-1次的多项式
比如你给的条件,就应该拟合曲线y=ax^3+bx^2+cx+d,这样,知道了4个点,可得4个方程,4个未知数,这个函数可以唯一确定下来。
我用计算机算了一下,得到了一个三次方程y = -315x^3 + 5194x^2 – 24096x + 25580,计算结果给出来的系数小数位数太少了,x取较小值的时候还比较靠谱,X比较大的时候,比如反算X=6和9的时候,丢掉的小数位数乘以6和9的三次方的值比较大了,但都被舍去了,因此,反算6的时候结果变成了-52,反算9的时候更大了。

对于第二种情况,用上面的方法计算出来的多项式不一定能够通过其他的点,这种情况下,你就只能采用离散数据的处理方法了,此时你也可以用多项式来拟合,这个多项式甚至可以是直线,只不过用不同的多项式时的统计偏差有大有小罢了,要想使求得的曲线通过所有的点,必须满足拟合曲线的最高阶次是数据点数量减以一。只有这样得到的方程组才有唯一解。

STM8 读取 UID

STM32 | Posted by 老沙
9月 07 2016

UID

UID即Unique ID,STM8S105提供了96BIT的全球唯一ID,可以用于加密,也可以用于板子的ID,像我的应用,就是用在了给箱子一个全球唯一的ID,这样就便于联网了。

用UID的时候,请参考英文手册,不知道为什么,中文版的是没有UID这方面的介绍的。那么我们就来学习一下UID把,官方给的应用如下:

•For use as serial numbers

•For use as security keys to increase the code security in the program memory while using and combining this unique ID with software cryptograhic primitives and protocols before programming the internal memory.

•To activate secure boot processes

其地址如下:

 1473251352-3985-30

1-2 byte为晶圆上x轴位置
3-4 byte为晶圆上y轴位置
5   byte为晶圆号码
6-12 byte是Lot number.

实际上一开始的时候,我也对UID的读取是相当的疑惑,但是看了这个地址后,其实就是直接读取地址上的数据就可以了。程序如下:

void get_id(void)

{

u8 i;

u16 addr;

u8 uid1[12];

addr=0x48CD;

for(i=0;i<12;i++)

{

uid1[i]=*(u8*)addr++;

putchar(uid1[i]);

}

}

怎么样,简单把,还有另外一个方法,在网上搜到的,也分享给大家把,

__no_init const union { //either the struct or a string

struct { //nameless struct

unsigned short X_coordinate; //X-coordinate on the wafter

unsigned short Y_coordinate; //Y-coordinate on the wafer

unsigned char Wafer_Number; //wafer number

unsigned char Lot_Number[7]; //lot number

} ;

unsigned char str[12]; //or the string

} U_ID @ 0x48cd; //u_id typ

J-link V8固件升级记

STM32, 硬件相关 | Posted by 老沙
4月 11 2016

好久没为电子工程事业尽份力了!今天也稍微努把力!写写我是如何升级J-link的固件的吧!

111

 

 

 

 

 

 

J-link是什么?晕,不是电子工程师的退散吧!这是现在比较流行的arm调试工具!我手上是那个大家都比较喜闻乐见的V8版本!盗版吗!大家懂的!50元入手的!没有软件升级与维护的!说不准哪天!升级软件就封杀了!如果固件没法更新就基本一块砖!砸人防身都可以哦!
222

 

 

 

 

 

首先在通电情况下,短接a!然后拔下usb 接着短接b,然后插入usb 10秒,然后拔下usb。最后从新上电插入usb!于是你的电脑里面就有了一个无法识别新设备!

333

 

 

 

 

 

 

 

 

去atmel官网下载最新版本的SAM-BA v2.12软件,你就可以正确识别硬件为一个usb转串口设备了!

http://ishare.iask.sina.com.cn/f/34214872.html

双击运行SAM-BA v2.12

444

 

 

 

 
设置你的设备端口号,还有芯片型号!之后点击连接!

666

 

 

 

 

 

 

 

进入固件刷写窗口!选择好新固件的文件地址!然后点send file

http://ishare.iask.sina.com.cn/f/34231756.html

777

 

 

 

 

 

 
提示是否加密!选择yes!

888

 

 

 

 

 

 
烧录进行中~~~~

999

 

 

 

 

 

 
再次提示是否要加密,选择no!之后退出程序!

拔掉J-link,然后从新插入usb!

1111

 

 

 

 

 

 

 

 

又会有新设备,这个时候要去下载安装J-Link ARM V4.40驱动就有了!

注意一定要是J-Link ARM V4.40 之后的版本都会封杀你的破解!

http://download.csdn.net/detail/wm20031015/3926860  

2222

 

 

 

 

 
运行J-Link ARM V4.40提示升级,选择yes

5555

 

 

 

 

 

 

6666

 

 

 

 
提示升级成功!

从新插拔一下J-link!好了你的J-link V8又复活了!

双击J-Link ARM V4.40 程序正常运行了!

8888

 

 

 

 

 

 

^_^,我能给的也就这么多了!如果还有什么问题,或者说新的4.5.0之后的版本需要破解的话,估计就又得等等了!不过至少现在J-link V8 又可以欢快的陪我们工作一阵子了!

 

install_at91-isp

jlnk_bin_烧录