RaspBerry Pi 折腾笔记

开箱

从 salt 大佬那里拿到一个树莓派,开始开箱进行折腾。

首先要进行系统的安装,这里选择的是树莓派上的一个 Ubuntu 系统

download

一开始准备使用 PowerISO 直接把这个系统当作一个 PE 烧到 sd 卡里,但是烧进去了之后发现没有办法成功启动,所以只好老老实实使用官方推荐的工具 Win32DiskImager 来安装

使用工具将系统烧进去之后查看 sd 卡状态

可以看到 sd 卡已经被分成了两个主分区。这也是为什么直接使用 poweriso 无法成功烧入系统的原因。

系统烧入之后就可以插电源启动了

ssh 连接

由于没有办法访问 sd 卡的内容,因此只能先通过鼠标键盘和外接屏幕先连接上,然后完成第一次系统启动时的初始化和 WiFi 的连接等工作。由于这里安装的是一个 Ubuntu 系统,因此这些设置并没有什么不同。

为了以后操作的方便,我们在树莓派上开启 SSH 服务,以后就可以通过 SSH 连接操作树莓派了。

使用命令 sudo service ssh start 开启 ssh 服务,此时就可以通过 ssh 连接到树莓派了,但是想要每次不借助外接显示器和键盘还需要设置让其开机自动开启服务。

打开 /etc/rc.local 文件,在exit 0语句前加入:

/etc/init.d/ssh start

或者通过执行 sudo update-rc.d ssh defaults 命令。

重启树莓派,可以看到再次开机时 sshd 进程已经默认启动了。那么下次再使用时就可以直接通过 ssh 连接。

FM 发射器

关于这个主题,网上已经有很多资料,这里选用下面这个 Github 的内容

Github:https://github.com/ChristopheJacquet/PiFmRds

首先安装必要的组件 libsndfile,这是一个用于解析多种格式音频文件的开源库,这个 FM 发射器就是使用这个库对音频文件进行解析而后转化成 FM 电波信号。

将下载的文件传递到树莓派上,然后依次执行下面命令

1
2
3
4
5
tar -xvzf libsndfile-1.0.25.tar.gz
cd libsndfile-1.0.25
./configure
make
make install

等待安装完成之后,从 github 上下载工程,编译

1
2
3
4
git clone https://github.com/ChristopheJacquet/PiFmRds.git
cd PiFmRds/src
make clean
make

编译完成之后运行程序就可以以指定的频率向外发送音频信号

1
./pi_fm_rds -freq 107.9 -audio sound.wav

为了增强信号可以在 GPIO4 引脚上连接一条杜邦线,树莓派引脚图片如下所示,HDMI 接口向下

接上杜邦线之后信号果然增强了很多~

!!!!但是在任何国家私设电台都是违法的,试验成功后请马上关闭!!!!

FM 发射器

查看 PiFmRds 工程的源码,学习具体是如何实现的。在网上的一些资料中大多是使用 wiringPi 库或者 python 来直接调用实现好的接口控制 GPIO,但是初步浏览源码并没有找到类似的信息。猜测可能直接通过操作驱动来实现的。

阅读源码,在程序开始的位置发现如下代码

1
2
3
4
// Use the mailbox interface to the VC to ask for physical memory.
mbox.handle = mbox_open();
if (mbox.handle < 0)
fatal("Failed to open mailbox. Check kernel support for vcio / BCM2708 mailbox.\n")

看起来是打开驱动设备的操作,进入函数 mbox_open

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#define DEVICE_FILE_NAME "/dev/vcio"
#define LOCAL_DEVICE_FILE_NAME "mbox"
int mbox_open() {
int file_desc;
// Open a char device file used for communicating with kernel mbox driver.
file_desc = open(DEVICE_FILE_NAME, 0);
if(file_desc >= 0) {
printf("Using mbox device " DEVICE_FILE_NAME ".\n");
return file_desc;
}
// Try to create one
unlink(LOCAL_DEVICE_FILE_NAME);
if(mknod(LOCAL_DEVICE_FILE_NAME, S_IFCHR|0600, makedev(MAJOR_NUM_A, 0)) >= 0 &&
(file_desc = open(LOCAL_DEVICE_FILE_NAME, 0)) >= 0) {
printf("Using local mbox device file with major %d.\n", MAJOR_NUM_A);
return file_desc;
}
unlink(LOCAL_DEVICE_FILE_NAME);
if(mknod(LOCAL_DEVICE_FILE_NAME, S_IFCHR|0600, makedev(MAJOR_NUM_B, 0)) >= 0 &&
(file_desc = open(LOCAL_DEVICE_FILE_NAME, 0)) >= 0) {
printf("Using local mbox device file with major %d.\n", MAJOR_NUM_B);
return file_desc;
}
return -1;
}

果然这个函数是在打开设备 /dev/vcio,如果系统中还没有这个设备文件,那么就为这个设备新建之并打开。这里可以看到打开的设备号为 249 或 100(内核版本小于 4.1)。/dev/vcio 是树莓派中用于操作 GPU 的驱动设备,可以通过这个设备访问树莓派的 GPU,并且不需要 root 权限。详情可以查看这个网页

接着向设备 /dev/vcio 发送 IOCTL 设备请求以完成各种功能,这个请求函数被封装在函数 mbox_property 中,并通过 mailbox.c 文件中的一系列接口提供各种功能

1
2
3
4
5
6
7
8
9
10
11
12
#define IOCTL_MBOX_PROPERTY _IOWR(MAJOR_NUM_B, 0, char *)
static int mbox_property(int file_desc, void *buf)
{
int ret_val = ioctl(file_desc, IOCTL_MBOX_PROPERTY, buf);
if (ret_val < 0) {
printf("ioctl_set_msg failed:%d\n", ret_val);
}
return ret_val;
}

接下来是各种看不懂的操作,大体意思是使用 GPU 去修改 CPU 的时钟频率~这部分内容等详细理解之后再做补充

私人 Git

使用树莓派还可以搭建一个私人的 Git 用于文件中转,搭建的过程和在服务器上搭建相同。这里参考自廖雪锋的官方网站

第一步,在树莓派上安装 Git

1
sudo apt-get install git

第二步,创建一个名为 git 的用户

1
sudo adduser git

第三步,创建登陆证书

1
ssh-keygen -t rsa

会生成一对密钥。将生成的公钥 id_rsa.pub 文件,追加到ssh服务器对应用户下 ~/.git/authorized_keys 文件中

第四步,初始化 Git 仓库

1
2
cd ~/src
sudo git init --bare file_transition.git

这样就会在 src 文件夹中创建一个裸仓库,接着将这个 git 的 owner 修改为 git

1
sudo chown -R git:git file_transition.git

第五步,禁用 shell 登陆

1
vim /etc/passwd

作如下的修改

1
git:x:1001:1001:,,,:/home/git:/bin/bash -> git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell

这样 git 用户就不能直接远程连接上

这样就可以使用这个私人的 git 进行文件转储了

1
2
3
$ git clone git@server:~/srv/file_transition.git
Cloning into 'file_transition'...
warning: You appear to have cloned an empty repository.